使用Docker无痛部署Coturn(ICE信令服务)

技术 · 前天 · 11 人浏览

为什么选择Coturn?

Coturn是开源的TURN/STUN服务器,解决WebRTC通信中的NAT穿透问题。通过Docker部署可避免环境依赖问题,实现快速搭建高可用ICE服务。


完整部署流程

1. 宿主机准备
# 创建配置目录
mkdir -p /opt/docker/coturn/{ssl,compose}

# 下载默认配置文件
cd /opt/docker/coturn
wget -O turnserver.conf https://raw.githubusercontent.com/coturn/coturn/master/docker/coturn/turnserver.conf
cp turnserver.conf turnserver.conf.default  # 备份原始配置

# 生成自签名SSL证书(重要:生产环境建议使用Let's Encrypt)
cd ssl
openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes \
  -keyout privatekey.pem -out certificate.pem \
  -subj "/CN=yourdomain.com"  # 替换为你的域名
2. 关键配置修改

编辑配置文件 vim /opt/docker/coturn/turnserver.conf

# 网络配置
listening-port=3478
tls-listening-port=5349
listening-ip=192.168.1.10       # 内网IP(通过ip addr show eth0查看)
external-ip=203.0.113.5         # 公网IP(必须正确!)
realm=turn.yourdomain.com       # 域名或公网IP

# 认证设置
user=myuser:mypassword          # 格式:用户名:密码(建议强密码)

# 证书路径(映射到容器内)
cert=/etc/coturn/ssl/certificate.pem
pkey=/etc/coturn/ssl/privatekey.pem

# 安全增强
no-stdout-log                   # 禁用明文日志
stale-nonce=300                 # 防止重放攻击
min-port=49152
max-port=65535

# CLI管理(可选)
cli-ip=127.0.0.1                # 限制本地访问
cli-port=5766
cli-password=YourSecureCLIPwd   # 修改默认密码!
3. Docker Compose部署

创建 vim /opt/docker/coturn/compose/docker-compose.yml

version: '3.8'
services:
  coturn:
    image: coturn/coturn:4.6.3
    container_name: coturn
    restart: unless-stopped
    volumes:
      - /opt/docker/coturn/turnserver.conf:/etc/coturn/turnserver.conf
      - /opt/docker/coturn/ssl:/etc/coturn/ssl
    network_mode: "host"       # 必须使用host模式
4. 启动服务
cd /opt/docker/coturn/compose
docker compose up -d  # 后台运行

# 查看日志验证
docker logs -f coturn | grep "listening"
# 预期输出: 
# 0: : Listening on: 203.0.113.5:3478
# 0: : Listening on: 203.0.113.5:5349

服务验证

访问 WebRTC ICE测试工具

  1. URI格式

    turn:203.0.113.5:3478?transport=udp
    turn:turn.yourdomain.com:5349?transport=tcp
  2. 认证信息

    • Username: myuser
    • Password: mypassword
  3. 成功标志
    出现 relay 类型候选地址即表示中继服务正常:

    srflx   | udp | 203.0.113.5:63412    # 反射地址(NAT穿透)
    relay   | udp | 203.0.113.5:51234    # 中继地址(关键!)

常见问题排查

  1. relay候选地址?

    • 检查防火墙:确保UDP端口开放(尤其49152-65535)
    • 验证external-ip配置:必须与服务器公网IP一致
    • 测试端口连通性:nc -zv 203.0.113.5 3478
  2. TLS证书错误?

    • 浏览器访问 https://turn.yourdomain.com:5349 检查证书有效性
    • 更新证书:替换ssl/目录文件后重启容器
  3. 性能优化建议

    # 增加线程数(根据CPU核心数调整)
    thread-num=8
    # 限制用户带宽
    user-quota=1200  # 单位:KB/s
    total-quota=12000

安全加固措施

  1. 禁止匿名访问:移除配置中的 no-auth 选项
  2. 定期轮换密码:通过 user=新用户名:新密码 动态更新
  3. 防火墙规则:仅允许信令服务器IP访问3478/5349端口
  4. 日志审计:挂载日志卷 - ./logs:/var/log/coturn

最终效果:您的WebRTC应用将获得稳定的NAT穿透能力,支持1:1通话至千人直播场景。部署过程仅需10分钟,更新时只需替换镜像版本和配置文件!

延伸阅读:结合Traefik反向代理实现自动HTTPS证书续签,进一步提升生产环境可靠性。

Coturn ICE