什么是 DNS 泄露和 WebRTC 泄露?

当您的设备把域名查询发送到 VPN 隧道之外(通常是发给运营商的解析器)时,就发生了 DNS 泄露,运营商因此仍能看到您访问了哪些网站。WebRTC 泄露是与之相关的浏览器问题:即使您的 VPN 或代理已开启,网页仍可以发现您的真实 IP 地址。

这两种泄露都悄无声息:VPN 显示“已连接”,网站在正常流量中看到的也是 VPN 的 IP。本指南将介绍每种泄露的成因、检测方法和修复办法,以及与之密切相关的 IPv6 泄露。

什么是 DNS 泄露

浏览器要连接 www.example.com,必须先向 DNS 解析器询问该网站的 IP 地址。这个问题及其答案,会暴露您即将访问哪个网站。如果您还不熟悉查询过程,我们的DNS 工作原理指南会一步步讲解。

配置正确的 VPN 会把 DNS 查询通过隧道发送给 VPN 服务商运营的解析器,或您自己选定的解析器。如果这一步失败,查询直接发给了运营商的解析器,就出现了 DNS 泄露。网站看到的仍是 VPN 的 IP,但运营商却掌握了您查询过的每个域名及其时间戳清单。

DNS 泄露的常见原因

  • 操作系统仍在使用旧的解析器。VPN 客户端没能替换系统的 DNS 设置,或者另一个网络适配器的 DNS 服务器优先级更高。
  • Windows 上的并行查询。Windows 可以同时向多个网络接口的 DNS 服务器发送查询,并采用最快的答复,因此即使 VPN 的解析器也收到了查询,运营商的解析器同样能看到。
  • IPv6 DNS。VPN 处理了 IPv4 的 DNS,但系统同时还有来自路由器的 IPv6 解析器,它在隧道之外使用。
  • 分流隧道(Split tunnelling)。被排除在 VPN 之外的应用,按设计就会使用常规解析器来解析域名。
  • 设备或路由器上的手动 DNS 设置覆盖了 VPN 所做的设置。
提示:浏览器内置的 DNS over HTTPS(DoH)设置,会在加密的 HTTPS 连接中把查询发送给您选择的 DoH 服务商。在 VPN 运行时,该连接同样会经过隧道,所以运营商无法读取它,但您的查询会发给 DoH 服务商,而不是 VPN 的解析器。

如何检测 DNS 泄露

专门的 DNS 泄露测试的原理是:让您的浏览器查询某个域名下多个随机且唯一的子域名,而该域名的权威服务器由测试方控制。权威服务器会记录是哪些解析器 IP 地址请求了这些名称。如果其中有任何一个属于您的运营商而不是 VPN 服务商,就说明存在泄露。

您可以在终端里快速做一个简化版测试。Akamai 提供了一个特殊的域名,它会返回向其发起请求的解析器的 IP 地址:

dig +short whoami.akamai.net
nslookup whoami.akamai.net

请在 VPN 已连接时运行,然后把返回的 IP 粘贴到我们的 ASN查询中。如果该网络属于您的运营商,说明您的 DNS 正在泄露。同时也请检查系统配置了哪些解析器:

  • Windows:运行 ipconfig /all,查看每个适配器的“DNS 服务器”。
  • macOS:scutil --dns
  • 使用 systemd-resolved 的 Linux:resolvectl status

如何修复 DNS 泄露

  1. 如果 VPN 客户端提供 DNS 泄露保护选项,请将其开启。目前大多数客户端会强制所有 DNS 走隧道,并阻止到其他服务器的 53 端口。
  2. 删除网络适配器上手动配置的 DNS 服务器,或把它们设置为 VPN 的解析器。
  3. 如果 VPN 不支持 IPv6,请在适配器上禁用 IPv6,或开启客户端的 IPv6 泄露保护。
  4. 启用终止开关(kill switch),这样在隧道重新连接期间,包括 DNS 在内的任何流量都不会离开设备。
  5. 每次更改后都重新测试,切换到另一个 Wi-Fi 网络并重新连接后也要再测一次。

什么是 WebRTC 泄露

WebRTC 是视频通话和点对点文件传输背后的浏览器技术。为了让两个浏览器直接连接,它必须找出每个浏览器可能被访问到的所有地址。它通过 ICE(交互式连接建立)来完成这项工作,ICE 会收集一份候选地址列表:

候选地址类型来源示例
Host(主机)设备自身的网络接口192.168.1.23 或 mDNS 名称
Server reflexive(srflx,服务器反射)STUN 服务器报告它看到请求所来自的公网 IP 和端口203.0.113.50
Relay(中继)在直连失败时转发媒体的 TURN 服务器TURN 服务器的 IP

任何网页都可以用几行 JavaScript 启动这个过程,无需征求许可,并读取这些候选地址。当 STUN 请求在 VPN 或代理之外离开您的设备时,就会发生泄露。这在使用浏览器代理扩展和 SOCKS 代理时很常见,因为它们转发网页请求,却不转发 WebRTC 的 UDP 流量;使用分流隧道时也是如此。此时 server reflexive 候选地址就包含了您真实的公网 IP。

本地地址的 mDNS 混淆

过去,Host 候选地址会暴露 192.168.1.23 这样的局域网私有地址,有助于对用户进行指纹识别。Chrome、Firefox、Safari 和 Edge 的当前版本会把它们替换为 3f1c2a9e-7b4d-4c1e-9a52-6d8e0f1b2c3a.local 这样的随机名称,仅在本地网络内通过多播 DNS 解析。浏览器通常只有在网页获得摄像头或麦克风权限之后,才会显示真实的本地地址。

如何检测并修复 WebRTC 泄露

请在开启 VPN 或代理的情况下运行我们的 WebRTC泄露测试。它会列出您的浏览器暴露的每个候选地址。如果任何公网地址与您关闭 VPN 时的地址相同,就存在泄露。修复方法:

  • 使用全隧道 VPN,而不是仅限浏览器的代理。当所有 UDP 流量都经过隧道时,STUN 服务器看到的就是 VPN 的 IP。
  • Firefox:打开 about:config,把 media.peerconnection.enabled 设置为 false。这会完全禁用 WebRTC,因此浏览器中的视频通话将无法使用。
  • 基于 Chromium 的浏览器:没有简单的用户设置,但可以通过 WebRtcIPHandling 企业策略(例如 disable_non_proxied_udp)或信誉良好的扩展,来限制 WebRTC 使用哪些网络接口。

IPv6 泄露

现在许多网络会同时给设备分配 IPv4 和 IPv6 地址。如果您的 VPN 只建立了 IPv4 隧道,操作系统仍然有一条经由运营商的可用 IPv6 路由。支持 IPv6 的网站会优先使用它,因此它们看到的是您真实且全球唯一的 IPv6 地址,这往往比隐藏在 NAT 之后共用的 IPv4 地址更容易识别身份。

请在 VPN 已连接时,用我们的 IPv6测试进行检测。理想的结果是没有 IPv6 连接,或者显示属于 VPN 服务商的 IPv6 地址。若出现来自您自己运营商地址段的地址,就意味着存在泄露;修复方法是启用客户端的 IPv6 支持或泄露保护,或者在使用 VPN 期间禁用网络适配器上的 IPv6。

常见问题

如果存在 DNS 泄露,我的运营商能看到我的浏览记录吗?

它能看到您查询的域名,但看不到具体页面或内容。流量本身仍然经过 VPN,所以运营商无法看到您在每个网站上做了什么。

如果我没有使用 VPN,DNS 泄露还重要吗?

这个术语只适用于您期望 DNS 流向别处的情况。没有 VPN 时,通常本来就会使用运营商的解析器。您可以改用加密 DNS 服务,避免运营商看到您的查询。

禁用 WebRTC 安全吗?

安全,不会影响正常浏览,但浏览器内的视频通话、屏幕共享和一些文件共享网站在您重新开启之前将无法使用。

为什么 WebRTC 测试显示的是 .local 地址?

这是浏览器的 mDNS 保护在按预期工作。随机生成的 .local 名称会向网站隐藏您的局域网私有 IP。

亲自试试

使用我们的免费工具,把本指南付诸实践。

继续阅读

已复制到剪贴板