WebRTC双方均设置ICE transportpolicy为relay时ICE连接失败求解释
根据你描述的现象,双方强制使用relay策略时ICE连接失败,仅一方使用则正常,结合AWS上部署coturn的场景,主要可能有以下几个原因:
coturn未正确配置
external-ip参数:
这是最常见的问题。AWS上的coturn通常部署在私有子网,本身有内网IP,公网IP通过弹性IP(EIP)绑定。如果coturn配置里没指定external-ip=<内网IP>/<公网EIP>,客户端请求relay候选时,TURN可能返回内网IP作为中继地址。Trickle ICE测试时工具从公网发起请求,coturn可能自动适配返回公网IP,但实际双方客户端都走relay时,拿到的是内网中继地址,自然无法连通。TURN服务器的中继端口转发限制:
虽然你开放了必要端口,但coturn配置的min-port和max-port范围需要和AWS安全组、网络ACL里开放的端口范围完全一致。当双方都用relay时,TURN需要为两端分配不同的中继端口并在它们之间转发流量,如果端口范围不匹配或部分端口被防火墙拦截,就会导致连接失败。而单一方用relay时,可能刚好分配到了开放的端口,或者依赖对方的srflx/prflx候选绕过了部分限制。ICE候选优先级与配对逻辑问题:
当双方都只有relay候选时,ICE的配对逻辑需要两端的候选都指向同一个TURN服务器且认证信息有效。如果你的coturn配置了多个监听地址,或者客户端SDP中携带的relay候选优先级设置不合理,可能导致ICE无法找到有效的配对组合。而单一方用relay时,对方的srflx/prflx候选优先级更高,更容易完成配对。coturn的relay转发模式未正确启用:
检查coturn配置是否开启了中继转发功能,比如是否设置了relay-ip参数指定用于中继的网卡地址,或者是否禁用了no-relay选项。如果coturn仅支持STUN功能而未正确启用TURN中继,当双方都强制走relay时,无法建立中继通道。
建议你先检查coturn配置文件中的external-ip参数是否正确设置,然后验证中继端口范围与AWS安全组的一致性,最后可以通过coturn的日志(开启verbose模式)查看双方请求relay候选时的地址分配情况,定位具体问题。
内容的提问来源于stack exchange,提问作者saurav

