Pion自定义SFU服务器本地及物理机运行正常,Docker内部署失效问题咨询
问题排查方案
- 配置公网IP宣告
Pion WebRTC默认会读取容器内部的私有IP作为ICE候选下发给客户端,该IP无法被公网客户端访问,是该场景下最常见的故障原因。你需要在服务端代码的SettingEngine中添加公网IP配置:
// 替换为你的宿主机公网IP se.SetNAT1To1IPs([]string{"你的宿主机公网IP"}, webrtc.ICECandidateTypeHost)
如果你的公网IP不固定,也可以给服务端配置STUN服务器,让服务端自动发现公网IP。
- 检查公网端口放通规则
需要同时确认两层规则是否放通50000-50200/udp端口段的入站流量:
- 宿主机本地防火墙(firewalld/ufw等)
- 云服务商控制台的安全组/ACL规则
你可以通过nc命令测试端口连通性:在公网环境执行nc -u <宿主机公网IP> <50000-50200范围内的端口>,确认可以连通。
- 验证ICE候选交换逻辑
- 客户端可以打开
chrome://webrtc-internals页面,查看ICE候选交换情况,确认是否收到了服务端的公网IP候选,以及候选配对是否成功。 - 服务端开启Pion的Debug日志,查看ICE候选收集结果,确认是否有公网IP的候选生成。
- 临时验证方案缩小范围
你可以临时将docker-compose中app服务的网络模式改为host,删除原有的ports配置后重启服务测试:
services: app: # 其他配置保持不变 network_mode: "host" # 删除原有的ports配置
如果修改为host网络后服务恢复正常,就可以确认故障原因是端口映射或者NAT宣告配置问题,无需排查其他逻辑。
- 检查STUN/TURN可用性
先单独验证你使用的免费TURN服务器是否可用,部分公共TURN服务器存在可用性不稳定、带宽限制的问题,会导致ICE中继失败。
内容的提问来源于stack exchange,提问作者jalanga
相关产品推荐
相关产品推荐

