You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例源/目标地址检查

  1. 登录AWS控制台进入EC2实例列表
  2. 选中目标Ubuntu 20.04实例,点击操作 > 网络设置 > 更改源/目标检查
  3. 选择关闭并保存

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 02:17:11