IP 判官 ipjudge.org

文章 ·

WebRTC 泄露是什么?怎么检测,各浏览器怎么处理

WebRTC 是浏览器里做音视频通话和点对点传输的功能。为了找到能连通的路径,它会向 STUN 服务器发 UDP 请求,问「你看到我的地址是什么」。如果这个 UDP 请求没有经过代理,STUN 服务器看到的就是你本地宽带的公网 IP,网页可以直接读到它,这就是 WebRTC 泄露。现在的浏览器默认会隐藏内网 IP,但不会隐藏 STUN 返回的公网 IP。人在中国大陆时,漏出来的通常是一个大陆 IP,和代理出口对不上。

一图看懂:WebRTC 怎么漏出另一个 IP网页请求经过代理,网站看到的是代理出口;WebRTC 的 STUN 请求走 UDP,系统代理模式下不经过代理,网页因此能读到本地宽带的 IP。 一图看懂:WebRTC 怎么漏出另一个 IP 网页请求(HTTPS) 走代理 浏览器 代理软件 海外出口 IP 网站看到的是代理出口,和检测站一致 WebRTC 的 STUN 请求(UDP) 可能直连 浏览器 不进代理 国内宽带 IP 网页用几行 JavaScript 就能读到这个 IP 多见于系统代理模式;TUN 模式下还要看分流规则。
网页流量和 WebRTC 的 UDP 走的是两条路。只有 UDP 也经过代理,STUN 看到的才是代理出口。

WebRTC 为什么能拿到 IP

WebRTC 用 ICE 协议收集「候选地址」,再逐个测试哪条路走得通。RFC 8445 定义了几类候选,和泄露有关的是两类:

  • host:本机网卡上的地址,包括 VPN 这类虚拟网卡的地址。通常是 192.168.x.x 这样的内网 IP。
  • srflx(server reflexive):本机向 STUN 服务器发包后,STUN 服务器看到的地址和端口。RFC 8489 写明,STUN 可以让终端知道 NAT 给它分配的 IP 和端口。

候选以文本形式交给网页,格式见 RFC 8839,行末的 typ host、typ srflx 就是类型。网页收集这些候选不需要摄像头或麦克风权限:WebKit 的说明文章写到,没有获得摄像头、麦克风权限时,Safari 仍会给出 srflx 和 TURN 候选。

mDNS 保护的是内网 IP,不是公网 IP

内网 IP 可以用来追踪用户,所以浏览器改用随机的 .local 名字代替 host 候选里的地址,这就是 mDNS 候选。对应的 IETF 草案规定名字由一个随机 UUID 加 .local 组成;草案已过期、没有成为 RFC,但做法已被浏览器采用:

  • Chrome:2019 年 Chrome 76 起逐步启用,公告写明对所有网站生效,已获得摄像头、麦克风权限的网站除外。
  • Firefox:首选项 media.peerconnection.ice.obfuscate_host_addresses 默认为 true;源码里,页面正在采集或已有摄像头、麦克风权限时不做隐藏。
  • Safari:没有摄像头、麦克风权限时不给出 host 候选,获得权限后才给出。

关键在于同一份草案的另一句话:无论地址是公网还是内网,srflx 候选照样生成,而且是真实 IP。mDNS 管不到 STUN 看到的公网地址。

开了代理为什么还会漏

RFC 8828(WebRTC IP 地址处理要求)列了三种情况:分流隧道的 VPN 会让 WebRTC 同时发现 VPN 地址和运营商地址;NAT 后面的内网地址会被看到;使用代理、又允许直接上网时,STUN 检测会绕过代理,暴露客户端的公网 IP。它还写到,所有 HTTP 代理和多数 SOCKS 代理都不支持 UDP。

放到常见的代理软件上:

  • 系统代理模式:软件把自己设成系统的 HTTP / SOCKS 代理,浏览器的网页请求走代理。WebRTC 的 UDP 按系统路由表发出,直接走本地宽带,STUN 看到的就是你的真实公网 IP。
  • TUN 模式(也叫虚拟网卡、增强模式):软件创建一块虚拟网卡(Linux 内核文档对 TUN 设备的说明是由用户态程序收发数据包),UDP 也会先进入代理软件。之后走哪条路,取决于线路能不能转发 UDP,以及分流规则怎么判:发往国内 STUN 服务器的请求可能命中直连规则。

任何网页都能用几行 JavaScript 读到 srflx 地址。ChatGPT、Claude、Gemini 是否读取、怎么使用,没有公开说明;但网页请求来自海外出口,WebRTC 却显示一个大陆 IP,本身是一组对不上的信号。

IP 判官怎么检测

首页和 Claude、ChatGPT、Muse 专项检测页都会跑这一项,结果在「浏览器与连接检查」的 WebRTC 一行:

  1. 同时建立 4 个 WebRTC 连接,每个只配一个 STUN 服务器:Cloudflare(stun.cloudflare.com:3478)、Google(stun.l.google.com:19302),以及国内的小米(stun.miwifi.com:3478)、哔哩哔哩(stun.chat.bilibili.com:3478)。加国内服务器,是因为分流规则常让国内的 STUN 走直连,只问一个海外服务器会漏报。
  2. 每个连接建一个数据通道并生成 offer,触发候选收集,从中取第一个 srflx 地址和第一个 host 地址。收集完成就结束,STUN 没有回应时最多等 4 秒。
  3. 把每个 srflx IP 和本页查到的出口逐一比较:打开本站的 IP、claude.ai 和 chatgpt.com 看到的 IP、只走 IPv4 和只走 IPv6 的出口。比较的是 IP 本身,不是国家。

判定规则:

  • 海外 STUN(Cloudflare、Google)拿到的 IP 和这些出口都不同:标红「暴露了另一个 IP」。这说明 UDP 没有经过代理,常见于系统代理模式。
  • 只有国内 STUN(小米、哔哩哔哩)拿到另一个 IP:标黄「国内 STUN 走了直连」。海外 STUN 看到的是代理出口,说明 UDP 已被代理接管,是分流规则把国内的 STUN 域名判成了直连。这个 IP 只有刻意去问国内 STUN 的网站才拿得到,所以按一半扣分。
  • 两种情况下,页面都会查出这个 IP 所在的国家和网络,列进「谁看到了你的哪个 IP」,「怎么改」里按情况给出不同的处理办法。
  • srflx IP 都在出口之中:「一致」。4 个 STUN 都没有回应:「未暴露」。浏览器没有 WebRTC 或已禁用:「不会暴露」。
  • host 地址是 .local 名字时,显示「已被浏览器隐藏(mDNS),正常」;是真实内网 IP 时会显示出来。这一条只作提示,不算泄露。
IP 判官怎么判 WebRTC 泄露同时问 4 个 STUN 服务器:海外的 Cloudflare、Google,国内的小米、哔哩哔哩,把拿到的 IP 和本页查到的所有出口逐个比较。海外 STUN 拿到另一个 IP 标红;只有国内 STUN 拿到另一个 IP 标黄;都在出口之中为一致;都没有回应为未暴露。 IP 判官怎么判 WebRTC 泄露 同时问 4 个 STUN 服务器 海外Cloudflare、Google 国内小米、哔哩哔哩 拿到的 IP 和本页所有出口逐个比,比 IP 不比国家 判定 暴露了另一个 IP 海外 STUN 拿到另一个 IPUDP 没走代理,多见系统代理 国内 STUN 走了直连 只有国内 STUN 拿到另一个 IP分流规则把它判成了直连 一致 拿到的 IP 都在出口之中 未暴露 4 个 STUN 都没有回应 Claude 环境分:标红扣 12 分,标黄扣 6 分。
加国内 STUN,是因为分流规则常让它们走直连,只问海外服务器会漏报。

在 Claude 环境分里,WebRTC 泄露在 20 分的「泄露」项中扣 12 分,只经国内 STUN 时扣 6 分;Muse 注册环境分分别扣 10 分和 5 分。这是 IP 判官按常见风控信号定的权重,不是平台公布的规则,见 判定方法。

各浏览器怎么处理

Chrome、Edge

  • Google 在 Chrome 应用商店发布了官方扩展 WebRTC Network Limiter(开发者 Google Ireland, Ltd.,截至本文仍可安装,最近更新于 2023 年 10 月)。装上后默认不让 WebRTC 使用内网 IP,以及不承载网页流量的网卡上的公网 IP。使用系统代理时,还要在扩展的选项页里打开禁用未经代理 UDP 的设置,这一项默认关闭。商店页写明,多数代理不处理 UDP,打开后相当于关掉 UDP,音视频通话可能变慢或质量下降。
  • 受管理的设备可以用企业策略:Chrome 的 WebRtcIPHandling(Chrome 91 起)设为 disable_non_proxied_udp,只在代理支持时使用 UDP;WebRtcIPHandlingUrl(Chrome 133 起)可以按网站分别设置。Edge 对应的是 WebRtcLocalhostIpHandling(Windows、macOS 上的 Edge 77 起),选项 DisableNonProxiedUdp 表示除非代理支持 UDP,否则用 TCP;改完要重启浏览器。
  • 如果检测页在 Chrome 里显示了真实内网 IP,可能是策略 WebRtcLocalIpsAllowedUrls 放行了这个网站,或者 chrome://flags/#enable-webrtc-hide-local-ips-with-mdns 被关掉了。

Firefox

相关设置在 about:config 里:地址栏输入 about:config,确认警告页后搜索首选项名,双击布尔值即可切换(见 Mozilla 的 配置编辑器说明)。Mozilla Connect 上有用户在 2025 年提议在设置页加一个 WebRTC 开关,目前状态仍是「新想法」。

  • media.peerconnection.ice.default_address_only:只用默认路由所在的网卡收集候选。media.peerconnection.ice.no_host:候选里去掉所有本地地址。两项的说明见 Mozilla Wiki。
  • 再把 media.peerconnection.ice.proxy_only_if_behind_proxy 设为 true。按 Firefox 的源码,扩展接口里的 disable_non_proxied_udp 就是同时打开这三项。
  • media.peerconnection.enabled 设为 false 会整个关掉 RTCPeerConnection(MDN),需要网页通话的网站会用不了。

Safari

按 WebKit 的说明,Safari 不向普通网页给出内网地址,但 srflx 仍然给出,所以系统代理模式下一样会泄露公网 IP。我们没有找到苹果为普通用户提供的 WebRTC 开关说明。开发工具里的「Disable ICE Candidate Restrictions」按 WebKit 的说明会取消 host 候选的过滤,只供开发测试,不要打开。Safari 用户主要靠下一节的网络设置。

代理软件:系统代理和 TUN 模式

目标只有一个:让 WebRTC 的 UDP 和网页走同一个出口,或者干脆不发出去。

  1. 用系统代理模式时,STUN 必然直连。要么切到 TUN 模式,要么按上一节在浏览器里禁用未经代理的 UDP。
  2. 用 TUN 模式时,确认当前线路支持转发 UDP。不支持时,要确认 UDP 是被拦下,而不是改走直连。
  3. 检查分流规则有没有让 STUN 服务器、尤其是国内的 STUN 服务器走直连。
  4. 改完回 首页 重测。4 个 STUN 的结果都应该是你的出口 IP,或者「没有回应」。

同一个账号的网页出口、WebRTC、DNS 都一致,平台看到的环境才是连贯的。DNS 那一项见 DNS 泄露。其他信号见 Claude 验证的 6 个网络信号,出口怎么查见 ChatGPT、Claude 看到的是哪个 IP。

常见问题

WebRTC 显示的 IP 和出口在同一个国家,也算泄露吗?

IP 判官比较的是 IP 本身,只要和本页查到的所有出口都不同就会标红,哪怕国家相同。看页面给出的国家和网络:如果是你家宽带的运营商,就是真实 IP 泄露;如果是另一条代理线路,说明 UDP 走了另一个出口,也值得统一。

内网地址显示成一串 .local,是不是有问题?

没有问题。这是浏览器用 mDNS 名字替换了内网 IP,网页拿不到真实的局域网地址。

给网站开了摄像头、麦克风权限,会有影响吗?

会。Chrome、Firefox、Safari 都会对获得这类权限的网站放宽限制,给出真实的 host 候选。视频会议网站能看到你的内网 IP,是这个原因。

直接关掉 WebRTC 最省事吗?

省事,但网页里的语音、视频通话会用不了。检测页会显示「浏览器不支持或已禁用 WebRTC」。更稳妥的做法是让 UDP 走代理,只在做不到时再在浏览器里限制。

想知道你自己的 IP 属于哪一类?

免费检测我的 IP