在RockyLinux9上基于coturn构建 stun & turn服务器

前提条件

## 条件列表:
    1、服务器有两个公网ipv4,(双IP是stun工作的充分必要条件,了解了stun的udp打洞原理你就知道为啥了)
    2、两公网ip均直接配置在同一张网卡上(主要是降低配置难度)
    3、外部防火墙不得阻挡相关端口 3478-3479,5349-5350,49512-65535
    4、友情提示:搭这个服务,请选择 公网ipv4 直接配置到 网卡上的云服务器(还要两个ipv4哦)

## 网络ip配置展示
[root@localhost log]# ip a show ens18
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:24:11:f0:f2:a0 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 27.xx.182.88/27 brd 27.xx.182.95 scope global noprefixroute ens18
       valid_lft forever preferred_lft forever
    inet 27.xx.182.87/27 brd 27.xx.182.95 scope global secondary noprefixroute ens18
       valid_lft forever preferred_lft forever
    inet6 fe80::be24:11ff:fef0:f2a0/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

## 附、coturn的使用wiki
    https://github.com/coturn/coturn/wiki

## 附、这里有一张比较好的图
    https://www.cnblogs.com/yjmyzz/p/how-to-install-coturn-on-ubuntu.html

安装coturn和套件、生成tls加密证书

# 直接DNF安装(会自动解决依赖问题,注意该方式安装的coturn不支持Prometheus采集)
    dnf install coturn coturn-utils -y
    # 因为 turnutils_stunclient 测试命令在 coturn-utils 工具包中

# 生成tls加密证书(直接把tls证书和key生成到 coturn的配置目录)
    openssl req -x509 -newkey rsa:2048 -keyout /etc/coturn/turn_server_pkey.pem -out /etc/coturn/turn_server_cert.pem -days 99999 -nodes 

调整turnserver.conf配置文件

# 第一步:先备份自带的配置文件
    cp turnserver.conf turnserver.conf.bak

# 第二步:将下面的配置文件写入 turnserver.conf
[root@localhost ~]# cat /etc/coturn/turnserver.conf
# 板块一、指定一个备用端口
listening-port=3478
alt-listening-port=3479

## 板块二、TURN中继板块
# realm 是TURN服务器的身份验证域,
realm=turn.abc.cc
# 指定TURN用于中继流量的IP(实际使用时 请将turn.abc.cc 解析到 relay-ip )
relay-ip=27.xx.182.87
relay-ip=27.xx.182.88
# 定义了TURN服务器用于中继流量的 UDP 端口范围(防火墙要放开)
min-port=49512
max-port=65535

## 板块三、TURN 中继加密配置板块
# 支持方式一:TURN over TLS (TCP+TLS):   使用 TLS 协议来加密通过 TCP 传输的 TURN 数据。
# 支持方式二:TURN over DTLS (UDP+DTLS): 使用 DTLS 协议来加密通过 UDP 传输的 TURN 数据。
tls-listening-port=5349
alt-tls-listening-port=5350
# 配置加密证书公钥+私钥
cert=/etc/coturn/turn_server_cert.pem
pkey=/etc/coturn/turn_server_pkey.pem

## 板块四、安全板块
# 两种身份验证机制,二选一,当两种都配置,预共享密码机制会覆盖用户密码机制
# 为TURN服务器提供第一种身份验证机制:用户密码机制,给TURN的使用加上用户密码验证
lt-cred-mech
user=tom:tom123456
# 为TURN服务器提供第二种身份验证机制:共享密钥机制
#use-auth-secret
#static-auth-secret=dasdadadjisdxncsuihusdbshbcyudsjkbdcb
# 启用 STUN 消息指纹校验(启用后,每条 STUN 消息都会包含一个指纹字段,用于确保消息的完整性。这是一个安全特性,有助于防止消息篡改)
fingerprint
# nonce 是在 STUN/TURN 协议中用于防止重放攻击的一个值。启用此选项后,服务器将检测和处理过期的 nonce 值,以提高安全性。
stale-nonce
# 禁止使用多播地址作为对等节点(peers)。此选项用于防止 TURN 服务器中继多播流量,从而提高安全性。
no-multicast-peers
# 启用 TURN 移动性功能。这允许移动设备在 IP 地址发生变化时保持会话不变,是对移动设备支持的一部分。
mobility
# 禁用命令行接口(CLI),无法通过命令行与 TURN 服务器进行交互。这通常用于生产环境,以提高服务器的安全性。
no-cli

## 板块五、日志板块
# 设置一个日志文件路径
log-file=/var/log/turnserver.log
# no-stdout-log  调试期间这个不要注释,他能把日志打印到前台
# 日志级别:(verbose:DEBUG级别,这包括处理的每个 STUN/TURN 请求和响应的详细数据,这对于调试非常有用)(simple-log:简单级别)
verbose
# 启用请求日志:记录每个 STUN BINDING 请求的处理信息
log-binding

## 板块六、带宽限制
# 将turn服务器的总带宽限制为最多10mbps(max-bps=0 或者不设置该项表示不限制带宽)
max-bps=10000000

前台启动调试

# 启动命令(注意观察输出日志信息,有没有WARNING 或者 ERROR)
    turnserver -c /etc/coturn/turnserver.conf

# 新开一个终端,查看3478 5349等端口是否监听
    ss -tunlp

# 本地 turnutils_stunclient测试(若是看到类似如下三块表示成功)
[root@localhost ~]# turnutils_stunclient -p 3478 27.xx.182.88
========================================
RFC 5780 response 1
0: (14169): INFO: IPv4. Response origin: : 27.xx.182.88:3478
0: (14169): INFO: IPv4. Other addr: : 27.xx.182.87:3479
0: (14169): INFO: IPv4. UDP reflexive addr: 27.xx.182.88:55862
========================================
RFC 5780 response 2
0: (14169): INFO: IPv4. Response origin: : 27.xx.182.87:3479
0: (14169): INFO: IPv4. Other addr: : 27.xx.182.87:3479
0: (14169): INFO: IPv4. UDP reflexive addr: 27.xx.182.88:55862
========================================
RFC 5780 response 3
0: (14169): INFO: IPv4. Response origin: : 27.xx.182.87:3479
0: (14169): INFO: IPv4. Other addr: : 27.xx.182.87:3479
0: (14169): INFO: IPv4. UDP reflexive addr: 27.xx.182.88:55863

在线测试、或者下载nat类型测试工具

# WebRTC samples Trickle ICE 测试工具地址(浏览器打开,填写自己搭建的 stun 和 turn服务器信息即可)
    https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
    # 另一个在线测试工具
    # https://www.metered.ca/turn-server-testing?ref=metered.ca

    # stun 服务器信息格式(因为stun只是提供检测nat类型功能,可以不需要验证,格式如下)
    stun:27.xx.182.88:3478
    # stun:域名:3478

    # turn 服务器信息格式(因为turn的功能是中转流量,为了安全设置了身份认证)
    turn:27.xx.182.88:5349    # 然后在下面行输入账户tom,和密码tom123456

# NatTypeTester 测试工具下载地址
    https://github.com/HMBSbige/NatTypeTester

file

正常启动coturn服务(用于正式场景)

## 注释 coturn.service 中启动用户和组指定为coturn(注销后 会使用root启动,保证各功能正常)
    [root@localhost coturn]# cat /usr/lib/systemd/system/coturn.service
[Unit]
Description=coturn
Documentation=man:coturn(1) man:turnadmin(1) man:turnserver(1)
After=syslog.target
After=network.target

[Service]
#User=coturn
#Group=coturn
Type=notify
ExecStart=/usr/bin/turnserver -c /etc/coturn/turnserver.conf --pidfile /run/coturn/turnserver.pid --no-stdout-log
#ExecStart=/usr/bin/turnserver -c /etc/coturn/turnserver.conf --pidfile /run/coturn/turnserver.pid --no-stdout-log
Restart=on-abort
ExecReload=/bin/kill -HUP $MAINPID

LimitCORE=infinity
LimitNOFILE=999999
LimitNPROC=60000
LimitRTPRIO=infinity
LimitRTTIME=7000000
CPUSchedulingPolicy=other
UMask=0007

# Only required to bind coturn to privileged ports (ports < 1024),
# e.g. port 80 or 443 to handle restrictive corporate firewalls.
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

## 启动coturn服务
    systemctl start coturn
    systemctl enable coturn

附、docker方式部署coturn服务

## 网络ip配置展示
[root@localhost log]# ip a show ens18
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:24:11:f0:f2:a0 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 27.xx.182.88/27 brd 27.xx.182.95 scope global noprefixroute ens18
       valid_lft forever preferred_lft forever
    inet 27.xx.182.87/27 brd 27.xx.182.95 scope global secondary noprefixroute ens18
       valid_lft forever preferred_lft forever
    inet6 fe80::be24:11ff:fef0:f2a0/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

## 第一、如何选择coturn镜像(建议选择基于alpine的,不要选择默认基于debian的)
    docker pull coturn/coturn:edge-alpine
    # docker pull coturn/coturn    # 不建议选择这个版本(因为在调参数有点不一样)

## 第二、准备加密证书,和 turnserver.conf配置文件
    mkdir -p /opt/coturn
    openssl req -x509 -newkey rsa:2048 -keyout /opt/coturn/turn_server_pkey.pem -out /opt/coturn/turn_server_cert.pem -days 99999 -nodes

    [root@localhost ~]# cat /opt/coturn/turnserver.conf 
listening-ip=27.xx.182.87
listening-ip=27.xx.182.88
listening-port=3478
alt-listening-port=3479
realm=turn.abc.cc
relay-ip=27.xx.182.87
relay-ip=27.xx.182.88
min-port=49512
max-port=65535
tls-listening-port=5349
alt-tls-listening-port=5350
cert=/etc/coturn/turn_server_cert.pem
pkey=/etc/coturn/turn_server_pkey.pem
lt-cred-mech
user=tom:tom123456
fingerprint
stale-nonce
no-multicast-peers
mobility
no-cli
# 容器跑就不要日志了
#log-file=/var/log/turnserver.log
verbose
log-binding
max-bps=0
# 非常关键,要支持老的frc5780 不然pystun可能测不出来(貌似不对)
#rfc5780

## 第三、准备docker compose 文件
    [root@localhost ~]# cat /opt/coturn/docker-compose.yaml 
services:
  coturn:
    image: coturn/coturn:edge-alpine
    container_name: coturn
    restart: unless-stopped
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./turnserver.conf:/etc/coturn/turnserver.conf
      - ./turn_server_cert.pem:/etc/coturn/turn_server_cert.pem
      - ./turn_server_pkey.pem:/etc/coturn/turn_server_pkey.pem
    environment:
      TZ: Asia/Shanghai
    network_mode: host

## 第四、将上述证书、密钥、配置文件turnserver.conf 的权限都设置为777 (非常关键,因为coturn镜像的默认执行账户是普通账户)
    chmod 777 /opt/coturn/*

## 第五、启动容器,并查看日志,最后功能验证参考上面
    cd /opt/coturn/
    docker compose up -d
    docker logs coturn    # 查看容器启动工作日志
声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/1392.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2024/11/6作者: 辣条①号

目标:网络规划设计师、系统工程师、ceph存储工程师、云计算工程师。 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录