打开 ipleak.net,页面刷出来那一瞬间,露测我盯着 DNS 地址那一栏看了好几秒——三个 IP,露测两个在荷兰,露测一个在德国。露测而我当时挂的露测 VPN 节点明明在东京。这就叫 DNS 泄露。露测你连的露测网站,你发的露测请求,你以为走的露测是东京那条线,实际上域名解析这一步,露测早被你家宽带运营商或者本地网络给出卖了。露测
这事儿得从 DNS 本身说起。露测你敲一个域名,露测比如 example.com,露测电脑不知道它对应哪个 IP,得问 DNS 服务器。正常情况下,你用 VPN,这个“问”的动作也应该走 VPN 隧道。但系统有时候不听话——它可能还惦记着本地网络配的那个 DNS,或者 VPN 客户端没把 DNS 请求接管干净。结果就是:你的流量走加密隧道,但域名解析请求从本地出口溜出去了。别人一看就知道你在访问什么,哪怕流量本身是加密的。
我自己做过一个粗糙的测试。不挂 VPN,先访问 dnsleaktest.com,跑标准测试,出来的 DNS 服务器是本地电信的,IP 归属地跟我实际位置一致。挂上 VPN 再跑,如果配置没问题,DNS 服务器应该变成 VPN 提供商的,位置跟着节点走。但有一次我用某个小众客户端,跑完一看,DNS 还是电信的。那个瞬间我就知道,这 VPN 的 DNS 处理有毛病。
为什么会泄露?常见的原因有几个。一是 VPN 客户端没强制接管所有 DNS 请求,系统还在用 resolv.conf 或者 Windows 网络适配器里手动配的 DNS。二是用了“智能 DNS”或者分流转发,某些域名故意走本地解析,图个速度,但隐私就没了。三是 IPv6 没关——很多 VPN 只处理 IPv4 的 DNS,IPv6 的请求直接漏出去。四是浏览器自己的 DNS 设置,比如 Chrome 的“安全 DNS”功能,可能绕过系统走 DoH,但 DoH 服务器是谁的,你未必清楚。
测试方法其实不复杂。dnsleaktest.com 有标准测试和扩展测试,标准测试跑六次查询,看返回的 DNS 服务器 IP 和地理位置。扩展测试更狠,会生成一堆随机子域名,看哪些 DNS 服务器在响应。如果响应里出现你本地 ISP 的 IP,或者出现跟 VPN 节点地理位置不符的 IP,那就是泄露了。另一个工具是 ipleak.net,它同时看 IP、DNS、WebRTC,信息更全。我习惯两个都跑一遍,交叉验证。
有个细节值得说:DNS 泄露不一定意味着你的真实 IP 暴露。你的流量出口还是 VPN 的 IP,但 DNS 请求暴露了你的大概位置和访问意图。对于做敏感操作的人来说,这已经够致命了。比如你在调查某个话题,DNS 查询记录里全是相关域名,本地 ISP 一看就知道你在干嘛。
怎么防?最直接的办法是手动指定 DNS。在 VPN 客户端里,找 DNS 设置,强制用 VPN 提供商的 DNS,或者用公共的加密 DNS,比如 1.1.1.1 或者 9.9.9.9。Windows 上还得去网络适配器里把 IPv6 的 DNS 也改掉,或者干脆禁用 IPv6。浏览器层面,Chrome 的“安全 DNS”要么关掉,要么设成跟 VPN 一致的 DoH 服务器。Firefox 类似,about:config 里把 network.trr.mode 调对。
我自己的习惯是:每次换 VPN 节点或者换网络环境,先跑一遍 DNS 泄露测试。花不了两分钟,但能避免很多尴尬。有一次在咖啡厅连公共 Wi-Fi,挂上 VPN 后顺手测了一下,发现 DNS 请求全走的是咖啡厅路由器的默认 DNS。那个路由器我根本不信任。赶紧手动改 DNS,再测,干净了。
还有个小坑:有些 VPN 客户端在连接成功后,会临时修改系统 DNS,但断开时没恢复干净。结果你下次不挂 VPN 上网,DNS 还指着 VPN 的服务器,解析慢不说,还可能失败。所以断开 VPN 后,也值得看一眼 DNS 设置有没有还原。
DNS 泄露测试不是什么高深技术,它就是个照妖镜。你以为藏得好好的,一测才发现裤衩都露在外面。别偷懒,该测就测。
补充一句:如果你用 Tor,DNS 泄露是另一个层面的问题。Tor 默认会处理 DNS,但浏览器配置不对照样漏。不过那是另一个话题了,下次再聊。
```