部署至VPS后WebRTC无法连接(已配置TURN服务器)
Mediasoup部署Vultr VPS后节点无法连接的排查建议
检查mediasoup WebRTC Transport的
listenIps配置
这是最常见的核心问题:服务端创建WebRTC Transport时必须指定公网IP的announcedIp,否则返回给客户端的ICE Candidate会是VPS的内网IP,导致客户端无法访问。示例配置:const webRtcTransport_options = { listenIps: [ { ip: '0.0.0.0', announcedIp: '你的VPS公网IP地址' } ], initialAvailableOutgoingBitrate: 1000000, // 其他必要参数... };确认
announcedIp是Vultr控制台显示的公网IP,不能填内网IP或localhost。双重验证VPS的防火墙配置
- 除了系统自带的防火墙(如ufw、firewalld),必须同时检查Vultr控制台的Cloud Firewall,确保mediasoup使用的TCP/UDP端口范围(默认是40000-49999)已被开放。
- 在服务端打印
transport.tuple字段,确认mediasoup实际绑定的端口在你开放的范围内,避免端口配置不匹配。
确认TURN服务器的有效性
- 打开Chrome的
webrtc-internals,查看ICE候选列表中是否有relay类型的候选。如果只有host(本地内网)和srflx(STUN反射)候选,说明TURN未生效。 - 检查metered.ca的用户名和凭证是否正确,确认凭证未过期(metered的临时凭证有效期通常为24小时)。
- 简化ICE服务器配置,先只保留一个TCP类型的TURN配置测试,排除多配置的干扰:
iceServers: [ { urls: 'turn:a.relay.metered.ca:443?transport=tcp', username: '你的用户名', credential: '你的凭证' } ]
- 打开Chrome的
排查客户端的ICE传输策略
- 若客户端处于UDP被限制的网络环境(如公司内网),可以强制客户端仅使用relay候选,在创建SendTransport时添加:
producerTransportRef.current = deviceRef.current.createSendTransport({ ...params, iceTransportPolicy: 'relay', // 仅使用relay候选 iceServers: [...你的TURN配置] }); - 在
webrtc-internals中查看ICE连接的失败细节,确认是候选配对失败还是DTLS握手失败,定位具体环节。
- 若客户端处于UDP被限制的网络环境(如公司内网),可以强制客户端仅使用relay候选,在创建SendTransport时添加:
测试VPS端口的外部可达性
- 使用
nc命令测试公网IP和端口的连通性:- TCP测试:
nc -zv 你的VPS公网IP 端口号 - UDP测试:
nc -zvu 你的VPS公网IP 端口号
- TCP测试:
- 若测试失败,说明端口仍未开放或VPS存在NAT限制,需重新核对防火墙和网络配置。
- 使用
内容的提问来源于stack exchange,提问作者eso32
相关产品推荐
相关产品推荐

