在WebRTC中,对于通信的两端不在同一个局域网的情况下,通信两端往往无法P2P直接连接,需要一个TURN中继服务,而中继服务可以选用 COTURN 构建。
注:COTURN 是一个开源的 TURN(Traversal Using Relays around NAT)和 STUN(Session Traversal Utilities for NAT)服务器项目
配置
先附上一个 自己部署使用,调试过可用的COTURN 配置。
# 服务器 ip 相关信息
listening-ip=0.0.0.0 # 服务器监听的IP地址,`0.0.0.0`表示监听所有可用的网络接口。
listening-port=3000 # 服务器监听的端口号,用于非TLS连接
tls-listening-port=5349 # 服务器监听的端口号,用于TLS连接
cert=/etc/turn_cert.pem # TLS证书文件路径
pkey=/etc/turn_key.pem # TLS私钥文件路径
cipher-list="DEFAULT" # TLS 加密套件列表
no-sslv3 # 禁用SSLv3
no-tlsv1 # 禁用TLSv1
external-ip=123.56.56.123/172.22.14.243 # 服务器的外部IP地址,用于客户端连接, 注意 / 后跟内网IP地址
realm=123.56.56.56.123 # 服务器的域名或IP地址,用于STUN和TURN协议
min-port=49152 # TURN服务器的最小端口号
max-port=65535 # TURN服务器的最大端口号# 权限认证 相关信息
fingerprint # 启用指纹机制,用于消息完整性检查。
lt-cred-mech # 启用长期凭证机制,用于用户认证。
user=username:password # 用户名和密码,用于用户认证。
# 在Coturn配置中,`nonce`是一个用于防止重放攻击的随机数。`stale-nonce`配置项用于设置`nonce`的过期时间,单位为秒。`nonce`机制确保每个请求都有一个唯一的标识符,从而提高安全性。
stale-nonce=600 # Nonce的过期时间,单位为秒。
no-cli # 禁用CLI客户端# 日志
log-file=/var/log/turn.log
simple-log
verbose # 输出详细日志
踩坑 - 连不上的原因
在部署 COTURN 的时候,踩了些坑 ,这里记录下 ,
- 连接串的写法 : “stun:123.56.56.123”,stun后面没有 // ,stun://123.56.56.123 ❌ 是不对的。
- external-ip 的设置, 内网ip跟在外网ip后面,映射起来。 (refs: why-my-turn-server-doesnt-work/67180626#67180626)
- 防火墙 ,除了端口和ip的放行,注意对应协议udp的也要放行,连接时有些是udp的。tcp 、 udp、 ipv4、ipv6 这些都要配置放行。
- 连接鉴权:虽然有中继服务器,但是仍然无法打通, 常见报错401, 403等 这些都是鉴权有些问题。
如果在调试时除了上述问题,还是有些问题 ,导致无法通过TURN服务器打通,甚至无法确认是否已经脸上了TURN服务器,需要进一步调试,则可以参考下面的,
如何调试
- ICE 调试工具 :https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
填入信息后,点击Gather candidates,可以看到返回不同类型的candidate信息,host,srfix,relay。如果不符合预期 ,比如没有relay类型的,可以继续使用浏览器中的信息进行debug,浏览器的一些RTCConnetion信息会输出到浏览器里,类似下图
- 使用浏览器查看
如何使用浏览器debug 详见这篇:【浏览器 - Chrome调试模式,如何输出浏览器中的更多信息】