DNS 泄露是指域名查询没有经过 VPN 隧道,而是发给了本地网络下发的解析器。网页流量虽然走了隧道,运营商和公共 Wi-Fi 的管理者仍然能从查询记录里看到你访问了哪些域名。这是最容易被忽略的 VPN 配置问题之一。
DNS 查询为什么会绕过隧道
隧道只处理被路由进去的流量。DNS 查询发往哪个解析器,由系统的解析设置决定,与路由表是两件事。只要系统仍指向本地网卡上的 DNS,查询就会从物理网卡发出。

多网卡同时查询会发生什么
Windows 8 起的智能多宿主名称解析会把同一个查询并行发到所有网卡的 DNS 服务器,取最先返回的结果。隧道网卡和物理网卡都在候选里,本地解析器往往更快,查询就被广播到了隧道之外。
IPv6 为什么会让解析走到本地
如果隧道只承载 IPv4,系统通过 IPv6 下发的 DNS 服务器仍然可用,且优先级不低。这时 AAAA 查询会直接从本地网络出去,和 IPv6 流量泄露是同一类问题。
浏览器内置的 DoH 会不会绕开系统设置
会。Firefox 和 Chrome 都可以启用 DNS over HTTPS,直接用浏览器自己配置的解析服务器,不再读取系统 DNS。查询仍然是加密的,但发往的是不受你控制的第三方,和 VPN 的预期不一致。
三种自查方法
自查的思路是确认“查询到底从哪张网卡、发给了谁”。下面三种方法按验证强度从低到高排列。

方法一:对比连接前后的解析器
连接 VPN 前后分别执行命令查看当前解析器地址:Linux 用 resolvectl status,macOS 用 scutil --dns,Windows 用 ipconfig /all。连接后解析器应当变成隧道内的地址,如果还是路由器的地址,就已经泄露。
方法二:抓包观察 53 端口
在物理网卡上抓包,例如 sudo tcpdump -ni eth0 port 53,然后在浏览器里访问一个很少用到的域名。只要物理网卡上看到了这个域名的查询,就说明有查询绕过了隧道。这一项结论最直接,不依赖任何外部服务。
方法三:用唯一子域名检测站点
在线检测站点的原理是让浏览器解析一个随机生成的子域名,再读取权威服务器记录到的查询来源。如果来源属于你的运营商或当前网络,就是泄露。它使用起来最省事,但只能给出结论,不能解释原因。
泄露现象与修复思路
| 现象 | 原因 | 修复思路 |
|---|---|---|
| 连接后解析器仍是路由器地址 | 隧道没有下发 DNS | 在配置里指定隧道内解析器 |
| Windows 物理网卡上仍有 53 端口查询 | 多网卡并行查询 | 阻止隧道之外的 DNS,或调整网卡优先级 |
| 仅浏览器访问时泄露 | 浏览器内置 DoH | 关闭 DoH,或把它指向隧道内解析器 |
| 只有 AAAA 查询泄露 | IPv6 DNS 仍然可用 | 一并承载 IPv6 或禁用 IPv6 |
怎么从根上止住泄露
WireGuard 在 Interface 里用 DNS = 10.8.0.1 指定隧道内解析器;OpenVPN 用 dhcp-option DNS 下发解析器,Windows 上再加 block-outside-dns 阻止其他网卡的查询。Linux 上可以用 systemd-resolved 的路由域把所有域名都导向隧道网卡。最稳妥的做法是同时加防火墙规则,只允许 53 端口流量走隧道网卡,这样即使配置被改动,查询也发不出去。




