You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NGINX反向代理coturn后Firefox无法获取ICE候选的问题

解决NGINX反向代理coturn时客户端IP丢失及Firefox无法获取ICE候选的问题

问题分析

核心问题包含两点:

  1. NGINX反向代理后,coturn无法获取真实客户端IP,导致ICE候选的raddr显示为127.0.0.1
  2. Firefox无法获取srflx/relay类型的ICE候选,而Chrome可以,这和NGINX的ssl_preread配置及coturn的PROXY协议支持缺失直接相关

解决方案

1. 配置coturn启用PROXY协议支持

编辑coturn主配置文件(通常路径为/etc/turnserver.conf),添加或修改以下关键配置项:

# 监听端口,需与NGINX upstream配置的端口一致
listening-port=5349
# 中继端口范围,可根据实际需求调整
relay-port=49152-65535
# 设置公网IP与本地IP映射,替换<your-public-ip>为服务器真实公网IP
external-ip=<your-public-ip>/127.0.0.1
# 设置TURN服务的Realm(域名标识)
realm=your-domain.com
# 启用长期凭证认证机制(适配多数WebRTC应用的认证方式)
lt-cred-mech
# 添加认证用户,格式为「用户名:密码」
user=your-username:your-password
# 启用PROXY协议,接收NGINX传递的真实客户端IP
proxy-protocol

修改完成后重启coturn服务:

systemctl restart coturn

2. 调整NGINX的Stream配置

修改NGINX的stream模块配置,移除不必要的选项并确保PROXY协议正确传递:

stream {
    upstream turn {
        server 127.0.0.1:5349;
    }
    server {
        listen 443 udp;
        # 调整超时参数适配TURN长连接特性
        proxy_connect_timeout 5s;
        proxy_timeout 30s;
        # 开启PROXY协议,向coturn传递客户端真实IP
        proxy_protocol on;
        proxy_pass turn;
        # 注释ssl_preread:该选项仅适用于TCP协议的SSL反向代理,UDP TURN场景下会引发Firefox兼容问题
        # ssl_preread on;
    }
}

重启NGINX使配置生效:

systemctl restart nginx

3. 验证效果

  • 查看coturn日志(通常路径为/var/log/turnserver.log),确认日志中显示的远程IP为真实客户端IP而非127.0.0.1
  • 在Firefox中测试WebRTC连接,检查ICE候选信息,确认raddr已显示为真实客户端IP,且能正常获取srflx和relay类型的候选

关键说明

  • PROXY协议的作用:NGINX通过proxy_protocol on将客户端真实IP封装在PROXY头中传递给coturn,coturn必须启用proxy-protocol配置才能解析该头,否则会将NGINX的IP误认为客户端IP
  • ssl_preread的兼容性:该选项用于TCP协议下提前读取SSL握手信息,UDP协议的TURN(尤其是DTLS)场景下不需要此配置,Firefox对UDP场景下的ssl_preread处理逻辑与Chrome不同,移除后可解决兼容问题

内容的提问来源于stack exchange,提问作者Winston Pais

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:15:31