WebRTC视频流异常:Ubuntu20环境下Chrome选错误ICE候选致连接失败
AWS Ubuntu 20.04 WebRTC 无法选择公网ICE候选的问题排查与修复
核心现象
在AWS环境中,使用Ubuntu 20.04.6 LTS服务器搭配aiortc实现WebRTC视频推流时,WebRTC始终选择本地内网IP(host候选)与客户端公网IP的配对,导致连接失败;而Ubuntu 18.04.5 LTS服务器仅需重试2-3次即可正常选择公网ICE候选对。所有节点均使用Google STUN服务器stun:stun.l.google.com:19302,本地网络环境下无此问题,Wireshark显示STUN请求有响应,但客户端向服务器内网IP发送的绑定请求无响应。
排查方向
- AWS实例源/目标地址检查:AWS EC2默认开启的源/目标地址检查会阻止实例处理非自身弹性公网IP的流量,可能干扰STUN反射后的公网候选验证。
- Ubuntu 20.04网络配置差异:20.04默认使用
netplan管理网络,相比18.04的ifupdown,路由策略或IP识别逻辑可能导致aiortc优先收集内网IP作为host候选;系统sysctl参数或ufw规则也可能限制UDP流量。 - 依赖库版本问题:Ubuntu 20.04默认的
libnice(WebRTC ICE核心库)版本更高,aiortc在新版本下的ICE候选优先级计算或连通性检查逻辑可能存在异常。
修复方案
1. 关闭AWS实例源/目标地址检查
- 登录AWS控制台进入EC2实例列表
- 选中目标Ubuntu 20.04实例,点击操作 > 网络设置 > 更改源/目标检查
- 选择关闭并保存
2. 强制aiortc推送公网候选
修改Python后端代码,过滤掉内网host候选,仅向客户端发送公网反射(srflx)候选:
from aiortc import RTCPeerConnection pc = RTCPeerConnection() # 仅发送公网反射类型的ICE候选 @pc.on('icecandidate') async def handle_ice_candidate(candidate): if candidate and candidate.type == 'srflx': # 替换为你的客户端通信逻辑 await send_candidate_to_client(candidate)
3. 调整客户端ICE策略
在JavaScript客户端代码中,限制ICE候选类型或缩短检查超时,促使WebRTC更快放弃不可达的内网候选:
const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], iceTransportPolicy: 'srflx' // 仅使用公网反射候选 });
4. 升级依赖库
在Ubuntu 20.04服务器上升级aiortc及底层依赖,确保兼容性:
pip install --upgrade aiortc sudo apt update && sudo apt install --upgrade libnice10
5. 验证Chrome WebRTC日志
在Chrome中打开chrome://webrtc-internals/,查看ICE候选状态:
- 若host候选显示
failed,需确认aiortc是否正确推送了srflx候选 - 若host候选显示
succeeded,排查客户端网络是否存在异常路由导致误判内网IP可达
内容的提问来源于stack exchange,提问作者jony89
相关产品推荐
相关产品推荐

