00:00:00
1. 背景
当我们做音视频通话、屏幕共享、在线会议时,需要让两端设备直接传输音视频数据。 但实际情况很复杂:
- 用户大多在 NAT 或防火墙后(比如家庭路由器、公司内网)。
- 两个客户端之间可能根本无法直接互相建立连接。
2. STUN 和 TURN 的区别
STUN (Session Traversal Utilities for NAT) 用来告诉客户端:
“你现在的公网 IP 是啥?端口是多少?” 这样双方就能尝试打洞直连(P2P)。
TURN (Traversal Using Relays around NAT) 当打洞失败、双方无法直连时,TURN 就登场了:
“行,我帮你们转发数据,所有音视频流都经过我中转。” 所以 TURN 是 中继服务器,性能压力会比 STUN 大很多。
3. TURN 服务的作用
✅ 保证通信成功率
- 没有 TURN,只有 STUN 的话,可能 20-30% 的用户根本连不上(尤其是公司、学校的严格网络)。
- 有了 TURN,哪怕打洞失败,数据也能通过 TURN 中转,保证通话成功。
✅ 解决防火墙、对称 NAT 的问题
- 对称 NAT 很难打洞,TURN 直接转发,绕开限制。
✅ 提供安全控制
- TURN 支持用户鉴权、带宽控制,防止被滥用。
4. TURN 服务常用场景
- WebRTC 应用(视频会议、直播互动、远程面试)。
- 即时通讯(音视频通话)。
- 游戏语音。
- 远程桌面、远程协助。
5. TURN 常用实现
- coturn(最流行,开源,稳定) 支持 STUN + TURN,支持 TCP/UDP + TLS,企业级部署常用它。
部署后你通常会监听:
3478/tcp和3478/udp→ STUN/TURN 主端口5349/tcp→ TLS 加密 TURN- 可能还要开启动态分配的 relay 端口范围
turn开放防火墙
markdown
sudo turnserver -c /etc/turnserver.conf -o
sudo ufw allow 3478/tcp
sudo ufw allow 3478/udp
sudo ufw allow 5349/tcp
# TLS UDP 也可放行,如果客户端支持 DTLS
sudo ufw allow 5349/udp
sudo ufw allow 50000:65535/tcp
sudo ufw allow 50000:65535/udp