NGINX反向代理coturn后Firefox无法获取ICE候选的问题
解决NGINX反向代理coturn时客户端IP丢失及Firefox无法获取ICE候选的问题
问题分析
核心问题包含两点:
- NGINX反向代理后,coturn无法获取真实客户端IP,导致ICE候选的
raddr显示为127.0.0.1 - 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
相关产品推荐
相关产品推荐

