↓ 跳过正文

DNS 泄露是什么?检测与修复指南

·1536 字·4 分钟
作者
吾便宜

事情要从今年年中的一个晚上说起。我帮朋友排查"开了代理但某些网站还是打不开"的问题,常规操作都走了一遍:换节点、换协议、重启客户端,全都没用。最后随手打开一个 DNS 泄露检测网站,返回的结果让我愣住了——显示的 DNS 服务器是他本地宽带的,根本不是节点那边的。

代理开着,流量却"裸奔"了一半。这就是 DNS 泄露。

DNS 泄露是怎么发生的

你访问一个网站时,第一步是 DNS 查询:把域名翻译成 IP 地址。理想情况下,这个查询应该走代理隧道。但很多客户端默认配置下,DNS 查询会走系统默认通道,直接发给本地运营商。结果就是:你的浏览流量走了代理,但"查了哪些网站"这份清单,明明白白躺在本地网络手里。

几种常见诱因:客户端没开启"接管 DNS"选项、系统里手动设置过 114 之类的国内 DNS、浏览器开了"安全 DNS"却指向国内服务商。

怎么检测自己有没有泄露

很简单,打开任意一个 DNS 泄露检测网站(搜"dns leak test"一抓一大把),连上代理后点检测。如果返回的 DNS 服务器 IP 和你节点所在地对不上,比如节点在美国、DNS 却显示国内运营商,那就是泄露了。建议多测两次,换不同节点确认。

各客户端的修复思路

原理相通:让 DNS 查询也走代理。具体操作因客户端而异:

用 Clash / Mihomo 内核的客户端,检查配置文件里 DNS 部分是否启用, nameserver 建议用国外的公共 DNS,并开启 fake-ip 模式。之前写过一篇 Clash Meta 内核科普,里面提到的 Meta 内核在 DNS 分流上做得更细,值得一看。

v2rayNG 用户可以在设置里找到 DNS 相关选项,把远程 DNS 改成 1.1.1.1 或 8.8.8.8,同时确认路由规则没有把 DNS 流量直连。进阶的路由玩法可以参考 v2rayNG 进阶玩法:路由规则与分应用代理。

DNS 查询路径示意
*插图来源:[Storyset](https://storyset.com/)*

桌面端开了 TUN 模式的用户相对省心,因为 TUN 会接管全部流量,DNS 自然也被收编。具体可以看 TUN 模式科普。但注意:TUN 开了不代表万事大吉,浏览器自带的"安全 DNS"如果指向国内地址,依然可能绕过隧道,建议改成 Cloudflare 或 Google 的 DoH。

修复后的验证

改完设置别急着收工,重新跑一遍泄露检测,确认返回的 DNS 服务器和节点地区一致。另外推荐开个无痕窗口测,避免缓存干扰结果。

手机端的特别提醒

手机上更容易中招。安卓的 v2rayNG、iOS 的 Shadowrocket 都要在设置里确认 DNS 接管已开启。另外,手机浏览器(尤其是 Chrome)的"安全 DNS"功能如果开着,可能会绕过代理的 DNS 设置,建议统一改成手动指定的 DoH 地址,或者直接关闭让代理接管。

还有一个隐蔽的坑:部分国产手机的"智能网络加速"“双通道加速"功能,会在后台用直连通道补发请求,DNS 查询可能就从这里漏出去。如果你开了这类系统功能又查出泄露,先关掉它们再测一次。

别忘了 IPv6

很多人只查 IPv4 的 DNS,忽略了 IPv6。如果你的网络支持 IPv6,而代理只接管了 IPv4 流量,DNS 查询可能从 IPv6 通道漏出去。检测网站一般会同时显示两种结果,都确认干净才算过关。如果客户端不支持 IPv6 分流,最简单的办法是在系统里暂时禁用 IPv6,简单粗暴但有效。

定期检查清单

把 DNS 泄露检测加入你的日常维护:每次更换客户端、重装系统、更新订阅后都测一次;出差、换网络环境后也建议测一次。检测本身只要一分钟,但能帮你堵住一个"毫无感知"的隐私漏洞。

写在最后

DNS 泄露的可怕之处在于它毫无感知:代理图标亮着、IP 查询也显示国外,但你的上网记录一直在"裸奔”。把它加入你的定期检查清单,每次换客户端或重装系统后都测一次。协议层面想再深挖的,可以看看 Hysteria 协议详解,理解不同协议处理流量的方式差异。