WebRTC 泄露检测

浏览器的 WebRTC 会绕过代理与 VPN,直接向 STUN 服务器打听「我在公网上长什么样」。 这条通道拿到的地址往往是你的真实地址,而不是代理出口的地址。 下面用 8 台国内外 STUN 服务器逐个探测,把它们看到的地址和本站在 HTTP 层看到的地址摆在一起对照。

共 8 台服务器逐台探测:通畅时几秒出结果,全部不通最长约一分钟。

地址摘要

HTTP 可见地址
216.73.217.85
WebRTC 公网地址
尚未检测
WebRTC 内网地址
尚未检测

STUN 服务器

China IP.cx自有国内
stun:cn.stun.im:3478
待检测
China Bilibili
stun:stun.chat.bilibili.com:3478
待检测
Global IP.cx自有日本
stun:jp.stun.im:3478
待检测
Global IP.cx自有美国
stun:us.stun.im:3478
待检测
Global Twilio
stun:global.stun.twilio.com:3478
待检测
Global NextCloud
stun:stun.nextcloud.com:3478
待检测
Global BlackBerry
stun:stun.voip.blackberry.com:3478
待检测
Global FreeSWITCH
stun:stun.freeswitch.org:3478
待检测

什么是 WebRTC 泄露

WebRTC(Web Real-Time Communication)是浏览器内置的实时音视频与点对点数据传输能力, 网页版的视频会议、屏幕共享、在线客服、云游戏串流几乎都建立在它之上。 点对点通信要先解决一个问题:两台设备各自躲在 NAT 后面,谁也不知道对方的公网地址。 WebRTC 的解法是 ICE 框架——浏览器主动向 STUN 服务器发一个请求, 服务器把「我看到你来自哪个地址和端口」原样回给它,这个结果叫 srflx(server reflexive)候选地址。

问题出在这一步的实现细节上:ICE 的地址收集走的是 UDP,直接由操作系统的网络栈发出, 不经过浏览器的 HTTP 代理设置。于是就出现了这样一种局面—— 你的网页流量老老实实走着 VPN 或代理,网站看到的是代理出口的地址; 与此同时,同一个页面里的一段 JavaScript 悄悄发起 ICE 收集, 拿到的却是你本地宽带的真实公网地址。这就是 WebRTC 泄露(WebRTC Leak)。

泄露的还不止公网地址。ICE 同时会收集 host 类型的候选地址,也就是网卡上的内网地址 (192.168.x.x、10.x.x.x 这类),足以暴露你所在局域网的网段结构。 Chrome、Edge、Firefox 自 2019 年前后起默认用 mDNS 主机名 (形如 a1b2c3d4-….local)替换掉真实内网地址,这一部分风险已经小了很多, 但公网地址那一条通道至今仍然开着。

这次检测做了什么

  1. 对清单里的每一台 STUN 服务器,单独建立一个 RTCPeerConnection,只填这一台作为 ICE 服务器。
  2. 创建一条数据通道并生成 offer,触发浏览器开始 ICE 候选地址收集。
  3. 逐条读取收集到的候选地址,按类型分开:srflx / relay 是公网地址,host 是本机地址。
  4. 把探到的公网地址与本站在 HTTP 层看到的地址逐一比对,得出最终结论。

之所以要一台一台单独测,而不是把十台一起塞进 iceServers: 混在一起时浏览器只会给出去重后的候选地址,你无法知道究竟是哪台服务器回的、哪台根本没通。 分开测才能看出「国内的 STUN 通、国外的全超时」这类真实网络状况—— 这也是清单里国内外服务器各占一半的原因。某一台超时不代表你安全,只代表那台没连上。

怎么读检测结果

如何防止 WebRTC 泄露

最直接的办法是装一个扩展,从浏览器层面管住 WebRTC 的地址收集策略。 下面两个都是 Chrome 应用商店里的现成方案,装完刷新本页重测即可验证效果:

除了装扩展,还有几条路:Firefox 用户可以在 about:config 里把 media.peerconnection.enabled 设为 false, 代价是网页版音视频通话彻底不可用; 使用支持全局 TUN / TAP 模式的 VPN 客户端,让 UDP 也一并走隧道,从根上消除这条旁路; 或者在路由器上直接封掉 STUN 常用的 3478 端口。 需要提醒的是:禁用 WebRTC 会让 Google Meet、腾讯会议网页版、Discord 网页版这类服务失效, 如果你日常要用,优先选择 Network Limiter 这种「限制策略」而不是「彻底关闭」的方案。

常见问题

用了 VPN,为什么还会被查到真实 IP?
多数浏览器插件式代理和 SOCKS / HTTP 代理只接管 TCP 上的 HTTP(S) 流量,WebRTC 的 ICE 收集走的是 UDP,直接从物理网卡发出,绕过了代理设置。这不是 VPN 的 bug,是分层的必然结果——除非 VPN 工作在 TUN 模式下接管整个网络栈。
检测显示全部超时,是不是说明我很安全?
不能这么推断。超时只说明那些 STUN 服务器当前连不上(网络限制、服务器故障、UDP 被封)。换一个网络环境、换一台服务器,结果可能完全不同。请以「至少有一台通了且没探到额外地址」作为安全的判断依据。
内网地址显示成一串 .local 是什么意思?
这是 mDNS 混淆,浏览器用一个随机主机名替换了真实内网地址。这是预期中的正常行为,说明你的浏览器版本已经带上了这项保护。
本站会保存 WebRTC 检测结果吗?
不会。整个探测过程完全在你的浏览器里完成,候选地址从未被发送回本站服务器。页面上出现的所有地址都只存在于当前这个标签页里,关掉即消失。