Docker - 使用Coturn实现WebRTC稳定连接

原理可见【WebRTC在对称NAT场景下无法穿透问题解析和方案

什么是Coturn?

Coturn 是一个功能强大、开源的 STUN/TURN 服务器,主要用于解决 NAT穿透问题,特别适用于 WebRTC 等实时通信场景。

  1. 核心概念
    • 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 协议。
  2. 主要功能
    • ✅ 支持 UDP、TCP、TLS、DTLS 多种传输协议
    • ✅ 提供 STUN 与 TURN 双服务
    • ✅ 支持 长期凭证认证(long-term credentials) 和临时凭证(如 REST API 生成 token)
    • ✅ 内置 NAT 类型检测 功能,便于诊断连接问题
    • ✅ 支持 高并发、负载均衡、集群部署
    • ✅ 提供详细 日志记录与流量统计
  3. 应用场景
    • WebRTC 音视频通话(如 Zoom、Meet 类应用)
    • 在线多人游戏 的低延迟通信
    • 企业视频会议系统
    • 移动端 P2P 通信(穿越运营商 NAT)
  4. 官方Docker地址:https://hub.docker.com/r/coturn/coturn
  5. 官方配置文件示例:https://github.com/coturn/coturn/blob/master/docker/coturn/turnserver.conf

安装和部署Coturn

  1. 安装前准备
    # 检查Docker状态
    systemctl status docker
    # 检查防火墙状态(debian/ubuntu)
    systemctl status ufw
    # 检查防火墙状态(RHEL/CentOS)
    systemctl status firewalld.service
    # 拉取镜像
    docker pull coturn/coturn:4.8.0
    
  2. 创建配置文件
    # 创建目录
    mkdir -p ~/coturn/config
    cd ~/coturn/config
    # 创建配置文件
    nano turnserver.conf
    
  3. 写入以下内容,需要按照当前网络情况酌情配置
    # 公网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
    
  4. 生成容器
    docker run -d \
      --name coturn \
      --network host \
      -v ~/coturn/config/turnserver.conf:/etc/turnserver.conf:ro \
      --restart unless-stopped \
      coturn/coturn:4.8.0
    
  5. 开放防火墙端口
    # 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
    
  6. 进入公网路由器后台,将“3478”的外部端口与内网“192.168.0.2”主机的“3478”的内部端口做端口映射。
  7. 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功能了。
  8. 使用
    在使用的两个客户端的iceServers中,新增以下配置:
    {
      urls: "turn:100.100.100.100:3478",
      username: "test",
      credential: "test123"
    }
    
posted @ 2026-01-20 09:09  苍凉温暖  阅读(5)  评论(0)    收藏  举报