文章目录
前提条件
## 条件列表:
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
正常启动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 # 查看容器启动工作日志
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论