文章目录
必备知识
## 条件列表:
1、服务器有两个公网ipv4,(双IP是stun工作的充分必要条件,了解了stun的udp打洞原理你就知道为啥了)
2、两公网ip均直接配置在同一张网卡上(主要是降低配置难度)
3、外部防火墙不得阻挡相关端口 3478-3479,5349-5350,49512-65535
4、友情提示:搭这个服务,请选择 公网ipv4 直接配置到 网卡上的云服务器(还要两个ipv4哦)
## coturn相关资料
https://wener.me/notes/service/network/coturn
# stun协议解析
https://blog.csdn.net/momo0853/article/details/105387675/
https://www.cnblogs.com/bluntwu2022/p/18344821
https://blog.csdn.net/super_code_marker/article/details/131719051
网络ip配置展示(云服务器分配两个内网ip 各自带一个公网ip)
## 大致逻辑
1、云服务器 弹性网卡上分配手动 增加分配一个内网ip,然后再申请一个公网ip,绑定到内网ip上,见下图
2、云服务器 /etc/rc.local 将新增的内网ip设置为开机自动配置
[root@cn-stun ~]# ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:7e:ae:bb brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 10.206.0.6/20 brd 10.206.15.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.206.0.14/20 scope global secondary eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe7e:aebb/64 scope link
valid_lft forever preferred_lft forever
[root@cn-stun ~]# cat /etc/rc.local | grep "ip add"
ip add add 10.206.0.14/20 dev eth0
## 附、coturn的使用wiki
https://github.com/coturn/coturn/wiki
## 附、这里有一张比较好的图
https://www.cnblogs.com/yjmyzz/p/how-to-install-coturn-on-ubuntu.html
安装coturn、生成tls加密证书(若不用tls可以不做)
# 直接dnf安装(会自动解决依赖问题,注意该方式安装的coturn不支持Prometheus采集)
dnf install coturn coturn-utils -y
# apt install coturn
# 因为 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
配置conturn
# 第一步:备份 并写入 新的配置文件
[root@localhost ~]# cp /etc/coturn/turnserver.conf /etc/coturn/turnserver.conf.bak
[root@localhost ~]# cat /etc/coturn/turnserver.conf
# 监听地址(在多个IP启用监听,会自动启用RFC5780)
listening-ip=10.206.0.6
listening-ip=10.206.0.14
# 监听端口
listening-port=3478
alt-listening-port=3479
# 公网ip与私网ip对应
external-ip=1.13.189.100/10.206.0.14
external-ip=146.56.218.49/10.206.0.6
# TURN 服务器用于中继的 IP
relay-ip=10.206.0.6
relay-ip=10.206.0.14
# Realm 是 TURN 认证的标识
realm=cn-stun.atstm.cc
# 配置加密证书公钥+私钥
#tls-listening-port=5349
#alt-tls-listening-port=5350
#cert=/etc/coturn/turn_server_cert.pem
#pkey=/etc/coturn/turn_server_pkey.pem
# TURN 用户名和密码(静态)
#lt-cred-mech
#user=aaa:aaa12345
# 限制使用端口范围(这是UDP的,防火墙需放行)
min-port=49152
max-port=65535
# 启用日志(verbose:DEBUG级别;simple-log:简单级别)
log-file=/var/log/turnserver.log
verbose
#simple-log
log-binding
# turn服务器带宽限制为10mbps(max-bps=0 或不设置表示限制)
#max-bps=10000000
# 强烈推荐设置
fingerprint
stale-nonce
no-multicast-peers
mobility
no-cli
# 当有多个监听ip时,会自动启用rfc5780,该选项对rfc5780相应数据的优化,不影响检测结果
response-origin-only-with-rfc5780
# 不使用tls
no-tls
no-dtls
前台启动调试、及systemd启动coturn
# 前台调试启动(注意观察输出日志信息,有没有WARNING 或者 ERROR)
turnserver -c /etc/coturn/turnserver.conf
# 新开终端,查看3478 5349等端口是否监听(我这里没用5349)
ss -tunlp
## systemd启动coturn服务(可以不修改 /usr/lib/systemd/system/coturn.service 中的用户和组)
systemctl start coturn
systemctl enable coturn
BUG、注意事项(域名必须解析到第一个IP)非常重要
## Tips:你在测试时会发现,虽然你有两个公网ip,但是仅在请求 coturn 配置中 第一行listening-ip 所对应ip时,才会成功,直接请求第二行的ip是不会成功的。
## 解决办法:将域名 cn-stun.atstm.cc 只解析到第一个ip上
## 可用如下方式测试 过程(同时可以去看 服务器端的日志情况)
# 方式一、(使用RFC 5780)
turnutils_stunclient -p 3478 146.56.218.49
turnutils_stunclient -p 3478 1.13.189.100
# 方式二、(使用RFC 5389)
pystun3 -P 3478 -d -H 146.56.218.49
pystun3 -P 3478 -d -H 1.13.189.100
在线测试、或者下载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
附、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 # 不建议选择这个版本(因为在调参数有点不一样)
## 第二、准备加密证书
mkdir -p /opt/devops/coturn
openssl req -x509 -newkey rsa:2048 -keyout /opt/devops/coturn/turn_server_pkey.pem -out /opt/devops/coturn/turn_server_cert.pem -days 99999 -nodes
## 第三、准备配置文件turnserver.conf
[root@localhost ~]# cat /opt/devops/coturn/turnserver.conf
# 监听地址(多个公网 IP)
listening-ip=106.53.107.155
listening-ip=119.91.211.26
# 监听端口
listening-port=3478
alt-listening-port=3479
tls-listening-port=5349
alt-tls-listening-port=5350
# TURN 服务器用于中继的 IP
relay-ip=106.53.107.155
relay-ip=119.91.211.26
# Realm 是 TURN 认证的标识
realm=test.211cc.cc
# 限制使用端口范围
min-port=49152
max-port=65535
pidfile=/tmp/turnserver.pid
# TLS(如不需要可注释)
cert=/etc/coturn/turn_server_cert.pem
pkey=/etc/coturn/turn_server_pkey.pem
# TURN 用户名和密码(静态)
lt-cred-mech
user=tom:tom12345
# 启用日志
log-file=/var/log/turnserver.log
verbose
log-binding
# 强烈推荐设置
fingerprint
stale-nonce
no-multicast-peers
mobility
no-cli
# 非常关键,要支持老的frc5780 不然pystun可能测不出来(貌似不对)
#rfc5780
## 第三、准备docker compose 文件
[root@localhost ~]# cat /opt/devops/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
- /var/log/coturn/:/var/log/
environment:
TZ: Asia/Shanghai
network_mode: host
## 第四、将上述证书、密钥、配置文件turnserver.conf 的权限都设置为777 (非常关键,因为coturn镜像的默认执行账户是普通账户)
chmod 777 /opt/devops/coturn/*
## 第五、启动容器,并查看日志,最后功能验证参考上面
cd /opt/devops/coturn/
docker compose up -d
docker logs coturn # 查看容器启动工作日志
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论