WebRTC 泄露检测
WebRTC 可能在你使用代理 / VPN 时,通过浏览器直接暴露你的真实 IP,造成隐私泄露。这是匿名上网时最常被忽视的漏洞之一。
本工具在你的浏览器内收集 WebRTC(ICE)候选地址,与检测到的出口 IP 对比:若出现不一致的真实公网 IP,即判定为泄露。
WebRTC 可能在你使用代理 / VPN 时,通过浏览器直接暴露你的真实 IP,造成隐私泄露。这是匿名上网时最常被忽视的漏洞之一。
本工具在你的浏览器内收集 WebRTC(ICE)候选地址,与检测到的出口 IP 对比:若出现不一致的真实公网 IP,即判定为泄露。
WebRTC 是浏览器内置的一套实时通信能力,本来用于网页里的语音/视频通话、屏幕共享、P2P 文件传输——你装没装插件它都在。问题出在它建立点对点连接的方式:浏览器要在两台设备之间找一条最短路径,于是通过 ICE(交互式连接建立)框架去收集一堆候选地址(candidate),其中就包括你的局域网内网 IP,以及通过 STUN 服务器(最常见的是 Google 的 stun.l.google.com:19302)反射回来的公网真实 IP。
致命之处在于:这些候选地址的探测走的是 UDP,而很多代理/VPN 只接管了浏览器的 TCP/HTTP 流量。结果就是网页看到的 HTTP 请求来自代理 IP,但同一个页面里的一段 JavaScript 通过 WebRTC 拿到的,却是你绕过隧道、直连出去的真实公网 IP。这不是漏洞利用,而是 WebRTC 的默认行为——任何网页只要写几行 RTCPeerConnection 代码就能在你毫不知情时取到这两个地址。
对开发者、跨境电商多账号卖家、代理/VPN 用户来说,这意味着:你以为换了 IP 就匿名了,实际上风控系统在前端就拿到了你的归属地真实 IP,与代理 IP 一对照,破绽立现。本页顶部的检测器就是在你的浏览器里跑一遍同样的 ICE 收集流程,把抓到的候选地址和你当前出口 IP 做比对,告诉你到底漏没漏。
看懂泄露结果,先得分清候选地址的三种类型。host 候选是设备本机网卡上的地址,通常是 192.168.x.x、10.x.x.x 这类内网 IP;现代浏览器(Chrome、Firefox、Safari)默认会用 mDNS 把它替换成一个随机的 .local 主机名(比如 a1b2c3d4.local),所以你即便看到一串 .local 也别慌,那是浏览器在保护你的内网拓扑——但要注意:mDNS 只遮内网 IP,对公网真实 IP 一点用没有。
真正出卖你的是 srflx(server-reflexive,服务器反射)候选——它正是 STUN 服务器从外面看到的你的公网 IP。如果这个地址和代理出口 IP 不一致,那就是实打实的真实 IP 泄露,风控可以直接拿它定位你的真实归属地。第三类 relay 候选来自 TURN 中继服务器,一般场景里少见,本身不直接暴露真实 IP。
所以判定逻辑很清晰:只剩 .local(mDNS)= 没泄露;srflx 地址 == 你的代理出口 = 安全;srflx 出现了一个和出口 IP 不同的公网地址 = 泄露。还有一种隐蔽情况:你只走了 IPv4 代理,但 WebRTC 把你的 IPv6 真实地址也作为候选抛了出来——很多人栽在这个 IPv4/IPv6 双栈的盲区上。检测器会把 IPv4 和 IPv6 两个地址族分开列,专门盯这种额外暴露。
不同的代理方式对 WebRTC 泄露的防护能力差别极大,这是最多人误解的地方。SOCKS5 代理和 WebRTC 几乎天生不合:Chrome 早已移除了 WebRTC 流量走 SOCKS5 的支持,而 WebRTC 的媒体探测大量走 UDP,浏览器出于安全通常只把 SOCKS5 当 TCP 用——UDP 直接绕过代理裸奔出去。所以你单纯在浏览器里设个 SOCKS5 代理,WebRTC 极大概率还是漏真实 IP,除非另外动手关掉 WebRTC。
全局 VPN(接管整张网卡、含 UDP)理论上能把 srflx 候选也带进隧道,但前提是没有泄露窗口:很多 VPN 在断线重连的瞬间、或没开「阻断非 VPN 流量(kill switch)」时,UDP 探测就从物理网卡漏出去了。靠谱的做法是开启 VPN 的「block non-VPN traffic」开关,把隧道外的 UDP 全部掐死。
跨境电商和多账号运营常用的指纹浏览器/防关联浏览器(如 AdsPower、Octo 这类)走的是另一条路——它们在内核层直接重写 WebRTC 行为,让网页看到的是代理 IP 而非屏蔽,相当于「伪造」一个和代理一致的 srflx,配合时区、语言、IP 归属地做成一套自洽的指纹。这是多账号场景里相对最稳的方案,但前提是你得验证它真的生效——配置错了照样漏,所以每开一个新环境都该实测一次。
最稳的防护不是只靠某一层,而是分层加固。① Chrome/Edge:浏览器内核不提供 about:config,可靠做法是装一个声誉良好的 WebRTC 控制扩展(把 WebRtcIPHandling 设为 disable_non_proxied_udp,即只允许 WebRTC 走代理隧道),或在企业环境用浏览器策略下发同一项。② Firefox:地址栏进 about:config,把 media.peerconnection.enabled 设为 false 可彻底关闭 WebRTC;若要保留通话功能又防泄露,把 media.peerconnection.ice.proxy_only 设为 true,强制 ICE 只走代理、禁掉裸 UDP。③ Safari(macOS)自带 mDNS 对内网有部分保护,Brave 默认就拦 WebRTC 泄露,相对省心。
注意一个权衡:彻底关掉 WebRTC 会让 Google Meet、腾讯会议网页版、Discord 语音等依赖它的功能失效。如果你日常要开网页会议,优先选「只走代理(proxy_only / disable_non_proxied_udp)」而不是一刀切禁用,既保功能又堵漏。
改完一定要复测,别凭感觉。本页顶部的 WebRTC 检测器完全在你本地浏览器里跑 RTCPeerConnection、收集 ICE 候选、和你当前出口 IP 做对比——和 ping0 那类工具不同的是,IPOK 不会把抓到的候选地址回传服务器、不做 IPv4↔IPv6 交叉记录、且默认是你点了才测,查询的 IP 我们也不记录。改一次配置、复测一次,直到结果显示只剩 .local 或 srflx 与代理出口完全一致,才算真正防住。
可在浏览器中禁用 WebRTC(或安装相关扩展),或使用能防止 WebRTC 泄露的代理 / VPN 客户端。
现代浏览器会用 mDNS 把本地地址混淆成 .local,这是正常的防泄露机制,不算泄露。
不是。.local 是现代浏览器用 mDNS 机制对你内网 IP 做的匿名化替换,本意就是保护你的局域网拓扑不外泄。只要候选地址里没有出现和代理出口不一致的公网 IP(尤其是 srflx 类型),仅有 .local 就属于「未泄露」。要警惕的是除了 .local 之外还冒出一个真实公网地址。
因为 WebRTC 的 STUN 探测走 UDP,而不少代理(尤其浏览器里设的 SOCKS5)只接管 TCP,UDP 就绕过隧道直连出去了。Chrome 还移除了 WebRTC 走 SOCKS5 的支持。解决办法是开启全局 VPN 的 kill switch(阻断非 VPN 流量),或在浏览器层强制 WebRTC 只走代理 / 直接禁用 WebRTC。
会影响所有依赖它的实时通信:Google Meet、网页版腾讯会议/飞书会议、Discord 语音、部分网页直播和 P2P 传输工具都会用不了。如果你需要保留这些功能,建议用「强制只走代理」(Firefox 的 ice.proxy_only=true 或 Chrome 的 disable_non_proxied_udp)而不是彻底禁用。
不会。检测全程在你的浏览器本地运行——用 RTCPeerConnection 连公共 STUN、收集 ICE 候选、和当前出口 IP 本地比对,抓到的候选地址不回传我们的服务器。我们也不记录你查询的任何 IP。这一点和会把候选 IP POST 回服务器、还做 IPv4/IPv6 关联日志的某些工具明显不同。