Docker - 使用Coturn实现WebRTC稳定连接
什么是Coturn?
Coturn 是一个功能强大、开源的 STUN/TURN 服务器,主要用于解决 NAT穿透问题,特别适用于 WebRTC 等实时通信场景。
- 核心概念
- STUN(Session Traversal Utilities for NAT)
帮助客户端发现自己的公网 IP 地址和端口,用于尝试建立 P2P(点对点)连接。 - TURN(Traversal Using Relays around NAT)
当 P2P 连接因防火墙或对称型 NAT 等限制无法建立时,TURN 服务器作为中继节点转发数据,确保通信可达。 - ICE(Interactive Connectivity Establishment)
WebRTC 使用 ICE 框架,结合 STUN 和 TURN 来寻找最佳通信路径。Coturn 完整支持 ICE 协议。
- STUN(Session Traversal Utilities for NAT)
- 主要功能
- ✅ 支持 UDP、TCP、TLS、DTLS 多种传输协议
- ✅ 提供 STUN 与 TURN 双服务
- ✅ 支持 长期凭证认证(long-term credentials) 和临时凭证(如 REST API 生成 token)
- ✅ 内置 NAT 类型检测 功能,便于诊断连接问题
- ✅ 支持 高并发、负载均衡、集群部署
- ✅ 提供详细 日志记录与流量统计
- 应用场景
- WebRTC 音视频通话(如 Zoom、Meet 类应用)
- 在线多人游戏 的低延迟通信
- 企业视频会议系统
- 移动端 P2P 通信(穿越运营商 NAT)
- 官方Docker地址:https://hub.docker.com/r/coturn/coturn
- 官方配置文件示例:https://github.com/coturn/coturn/blob/master/docker/coturn/turnserver.conf
安装和部署Coturn
- 安装前准备
# 检查Docker状态 systemctl status docker # 检查防火墙状态(debian/ubuntu) systemctl status ufw # 检查防火墙状态(RHEL/CentOS) systemctl status firewalld.service # 拉取镜像 docker pull coturn/coturn:4.8.0 - 创建配置文件
# 创建目录 mkdir -p ~/coturn/config cd ~/coturn/config # 创建配置文件 nano turnserver.conf - 写入以下内容,需要按照当前网络情况酌情配置
# 公网IP映射(公网IP/内网IP) external-ip=100.100.100.100/192.168.0.2 # 监听主机(内网IP) listening-ip=192.168.0.2 # 监听端口 listening-port=3478 # 认证 lt-cred-mech # 用户名:密码 user=test:test123 # 标识 Coturn 服务域 realm=test.com # 中继端口范围 min-port=49152 max-port=49500 # 输出日志到 stdout log-file=stdout # 详细日志 verbose - 生成容器
docker run -d \ --name coturn \ --network host \ -v ~/coturn/config/turnserver.conf:/etc/turnserver.conf:ro \ --restart unless-stopped \ coturn/coturn:4.8.0 - 开放防火墙端口
# Ubuntu/Debian (ufw) sudo ufw allow 3478/udp sudo ufw allow 3478/tcp sudo ufw allow 49152:49500/udp # CentOS/Rocky (firewalld) sudo firewall-cmd --permanent --add-port=3478/udp sudo firewall-cmd --permanent --add-port=3478/tcp sudo firewall-cmd --permanent --add-port=49152-49500/udp sudo firewall-cmd --reload - 进入公网路由器后台,将“3478”的外部端口与内网“192.168.0.2”主机的“3478”的内部端口做端口映射。
- WebRTC ICE 服务器测试工具
测试地址:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
ICE servers依次填写:
- STUN or TURN URI: turn:100.100.100.100:3478
- Username: test
- Password: test123
点击 Add Server,将地址添加到ICE servers列表中,移除其他不需要的地址。
点击 Gather candidates,看到下方列表的host、srflx、relay,就说明已经启用TURN功能了。 - 使用
在使用的两个客户端的iceServers中,新增以下配置:{ urls: "turn:100.100.100.100:3478", username: "test", credential: "test123" }

浙公网安备 33010602011771号