泄露检测
WebRTC 泄露自测
要点
在这台浏览器上测一次
按下按钮后,浏览器会和公共 STUN 服务器打一次招呼,下面列出 WebRTC 能看到的地址。结果只在你的屏幕上,本站不收。
- 本站读到的出口 IP
- —
- WebRTC 暴露的公网地址
- —
- WebRTC 暴露的局域网地址
- —
- 结论
- —
问:上面的按钮测的是什么?
短答:让浏览器向 stun.cloudflare.com 问一次「从外面看你是哪个地址」,再和本站读到的出口 IP 比。
按「开始测」以后,浏览器会建一条只在本机存在的 WebRTC 连接,向公共 STUN 服务器发一个 UDP 请求,约 2.5 秒后列出结果。结果只显示在你的屏幕上,本站不收、不存。四行分别是:
- 本站读到的出口 IP:网页请求经过代理后到达本站时的地址,也就是节点出口。在本地预览打开本页时这一行读不到。
- WebRTC 暴露的公网地址:STUN 服务器回报的地址,网页拿到的就是它。
- WebRTC 暴露的局域网地址:浏览器直接报出的内网地址;现在的浏览器多半用随机的 .local 名字代替,所以常显示「没有」。
- 结论:按前两行是否一致给出的判断。
问:四行结果怎么读?
短答:盯住第二行,它为空或等于出口 IP 就没漏,是别的地址再往下查。
| 你看到的 | 读法 | 要不要改 |
|---|---|---|
| 公网地址一行写「没有」 | 浏览器没拿到 STUN 回报:WebRTC 已被限制,或本机 UDP 出不去 | 不用改 |
| 公网地址等于出口 IP | WebRTC 的 UDP 也经过了代理,露出来的是节点地址 | 不用改 |
| 公网地址和出口 IP 不同,查归属是本地运营商 | 真实宽带地址漏出去了 | 按下一节限制 |
| 一个是 IPv4、一个是 IPv6 | 可能是同一节点的两种地址,也可能是 IPv6 直连漏出 | 把 WebRTC 那个地址拿去 IP 风险查询 看归属 |
| 局域网一行列出 192.168 或 10 开头的地址 | 浏览器没用 .local 名字隐藏内网地址 | 只露内网,介意再限制 |
STUN[协议]帮浏览器问出「外面看到的地址」的服务。① 走 UDP,系统代理(HTTP 或 SOCKS 端口)接管不到;② 回报的就是那个 UDP 包实际出去时的地址。参见:srflx 候选。
srflx 候选[WebRTC 字段]STUN 回报的公网地址,按钮第二行显示的就是它。① 客户端开 TUN 模式时,UDP 进隧道,回报的是节点出口;② 只开系统代理时,UDP 直接出门,回报的是你家宽带的地址。参见:STUN、.local 地址。
.local 地址[WebRTC 字段]浏览器用来代替真实内网 IP 的随机名字,以 .local 结尾。① 看到它说明浏览器已在隐藏内网地址;② 它和公网地址是否泄露无关。
问:漏了怎么在浏览器里限制?
短答:两条路:在代理客户端开 TUN 模式让 UDP 也进隧道;或者让浏览器的 WebRTC 只经代理走。
| 浏览器 | 做法 | 生效后的样子 |
|---|---|---|
| Chrome | 设置页没有开关。用浏览器策略 WebRtcIPHandling,取值 disable_non_proxied_udp | 地址栏打开 chrome://policy 能看到这条策略,状态为正常 |
| Edge | 策略名是 WebRtcLocalhostIpHandling,取值同上 | edge://policy 能看到这条 |
| Firefox | about:config 里把 media.peerconnection.ice.proxy_only_if_behind_proxy 设为 true;要彻底关掉,把 media.peerconnection.enabled 设为 false | 刷新本页再测,读数没变就重启 Firefox |
| Safari | 没有关闭 WebRTC 的开关;网页没拿到摄像头和麦克风权限时,Safari 本来就不报本机地址 | 仍漏就改用客户端的 TUN 模式 |
Windows 上给 Chrome、Edge 写策略(在管理员 PowerShell 里执行,写完把浏览器完全退出再开):
reg add "HKLM\SOFTWARE\Policies\Google\Chrome" /v WebRtcIPHandling /t REG_SZ /d disable_non_proxied_udp /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Edge" /v WebRtcLocalhostIpHandling /t REG_SZ /d disable_non_proxied_udp /f
Linux 上的 Chrome 把策略写成 JSON 文件:
sudo mkdir -p /etc/opt/chrome/policies/managed
echo '{ "WebRtcIPHandling": "disable_non_proxied_udp" }' | sudo tee /etc/opt/chrome/policies/managed/webrtc.json
写了策略以后,浏览器设置页会显示「由你的组织管理」,这是策略生效的正常提示。不想要了就删掉:
reg delete "HKLM\SOFTWARE\Policies\Google\Chrome" /v WebRtcIPHandling /f
reg delete "HKLM\SOFTWARE\Policies\Microsoft\Edge" /v WebRtcLocalhostIpHandling /f
disable_non_proxied_udp 的意思是:WebRTC 只用代理支持的 UDP,否则退回经代理的 TCP。系统代理一般不转 UDP,所以设置后按钮第二行多半会变成「没有」。
问:改完怎么确认?
短答:完全退出浏览器再开,回本页按「再测一次」,再用第二个检测站对照。
- 把浏览器完全退出(Windows 看任务栏托盘、macOS 用 Command+Q),再重新打开本页。
- 按「再测一次」,看第二行是否变成「没有」或等于出口 IP。
- 打开 browserleaks 的 WebRTC 页面或 ipleak.net,对照 Public IP Address 那一行;两边的读法写在 ipleak 一页。
- 两处都不再出现你家宽带的地址,才算限制成功。
问:按钮显示没漏,网站还是认出了你,问题在哪?
短答:WebRTC 只是三条泄露路径之一,剩下两条是 DNS 和出口本身。
先做一次 DNS 泄露检测,看域名查询是否还在交给本地运营商;DNS 也干净,就去比几个检测站对你出口的判定,读法见 IP 纯净度检测网站。出口被判成机房、地区又和服务要求对不上,那就不是浏览器设置能解决的了。