每次打开一个网站,你的设备都要请一台解析服务器把域名换成 IP 地址。这个提问本身就是一条明文记录,记着你接下来要去哪儿,而默认情况下它会发给你所在网络塞给你的那台服务器——一般就是宽带运营商的。
DNS 泄漏就是这些查询跑到了你没打算让它去的地方。常见的情形是:设备明明配好了用私有或加密的解析服务器,却因为若干结构性原因,还是把一部分甚至全部查询发给了运营商。表面上什么都没坏,所以泄漏才会一放好几年都没人察觉。
DNS 到底暴露了什么?
域名、时间戳,还有来源——这些已经足够还原出一段浏览过程。
传统 DNS 走 53 端口,不加密。任何处在你和解析服务器之间的人都能读到这条查询,而解析服务器本身看到的每一条查询,都记在你这条连接名下。它看不到具体页面,但敏感的往往就是域名本身。
加密改变的是这份记录握在谁手里,而不是它存不存在:
| 传输方式 | 加密吗? | 谁能看到查询 |
|---|---|---|
| 明文 DNS(53 端口) | 否 | 你的网络、你的运营商、解析服务器 |
| DNS over TLS(DoT,853 端口) | 是 | 你选的那台解析服务器 |
| DNS over HTTPS(DoH,443 端口) | 是 | 你选的那台解析服务器;网络侧较难把它和普通网页流量区分开 |
| DNSSEC | 否——它做的是验证 | 和明文 DNS 一样;它证明答案是真的,但不会把答案藏起来 |
DNSSEC 是这里最常被误解的一项。它给应答签名,让应答无法被伪造。它完全不提供任何机密性。
泄漏实际上是怎么发生的?
六种结构性成因,几乎涵盖了全部。
| 成因 | 机制 |
|---|---|
| 分流路由 | 一部分流量走隧道,DNS 却走默认网卡 |
| IPv6 没被带进去 | 隧道只处理 IPv4,于是 IPv6 查询走回运营商那条路 |
| 操作系统并行解析 | Windows 会同时向所有网卡发问,谁先回答就用谁的 |
| 浏览器层级的 DoH | 浏览器独立于系统设置自行解析,两个方向都可能出事 |
| 路由器覆盖 | 路由器通过 DHCP 强行指定自己的解析服务器,或者直接拦截 53 端口 |
| 强制门户 | 酒店或机场的网络劫持 DNS,把你导到它的登录页 |
浏览器那一条值得说清楚,因为它是双向的。带自己 DoH 设置的浏览器可能绕过你精心配好的系统解析服务器;反过来,一个配置正确的浏览器,也可能掩盖住「这个浏览器之外的一切都还在泄漏」这件事。只查其中一边、然后想当然地认为另一边没问题,是最常见的检测错误。
那要怎么检查?
每一层分开测,因为它们的结果可能互相矛盾。
操作系统——当前配置了哪些解析服务器:
| 系统 | 命令 |
|---|---|
| macOS | scutil --dns | grep nameserver |
| Windows | Get-DnsClientServerAddress |
| Linux(systemd-resolved) | resolvectl status |
| Linux(通用) | cat /etc/resolv.conf |
实际回答你的是哪一台——配置和实际行为是两回事:
dig +short whoami.akamai.net 会返回那台替你完成查询的解析服务器的 IP 地址。拿它跟你预期的那台比对。
**浏览器层级:**打开浏览器的安全 DNS 设置,看它有没有启用、选的是哪一家服务商。然后在同一个浏览器里打开一个 DNS 泄漏检测页。如果那个页面报出来的解析服务器跟你在命令行测到的不一样,就说明浏览器在自行解析。
**IPv6:**用纯 IPv6 的查询再测一遍。隧道只承载 IPv4,是造成部分泄漏最常见的单一原因。
结果该怎么看?
拿解析服务器的归属方跟你的预期比对,而不是跟一份「安全地址」名单比对。
| 观察到的情况 | 判读 |
|---|---|
| 解析服务器属于你的运营商,可你明明配了另一台 | 泄漏 |
| 列出好几台,其中一台是你的运营商 | 部分泄漏——查询被分流了 |
| IPv4 显示的是预期的那台,IPv6 显示运营商 | IPv6 泄漏 |
| 浏览器和系统报出来的解析服务器不同 | 不一定是泄漏,但意味着有两条独立的路径要各自确认 |
| 解析服务器落在意料之外的国家 | 通常是正常的——anycast 解析服务器由最近的节点应答 |
| 解析服务器是路由器的私有地址 | 无法判定;路由器会继续往上转发,得去看路由器自己的设置 |
最后一行是家庭网络里的坑。结果显示 192.168.1.1,只告诉你「是你的路由器回答的」。路由器再转发给谁是另一个问题,答案在路由器的 WAN 或 DNS 设置里。
修好它的极限在哪儿?
修好 DNS 泄漏,改变的是「谁会知道你查过哪些域名」。它不会让这次访问变得私密,而把这一点说过头,正是这个话题最常被歪曲的方式。
名称解析完之后,你的设备会向那个 IP 地址开一条连接。路径上的任何观察者都能看到目的地址,而大多数 TLS 连接会在握手阶段以未加密的形式发送服务器名称,除非两端都启用了 Encrypted Client Hello。这两个信号都能在完全不依赖 DNS 的情况下认出是哪个网站。
所以诚实的结论范围很窄,但确实成立:把 DNS 加密、发给你自己选的解析服务器,可以让「你访问过的每一个域名」这份明文清单从你的本地网络和运营商日志里消失,转而交到解析服务器运营方手上。它搬动了信任,而不是消除信任——这也让「谁在运营那台解析服务器、他们记录了什么」,成了真正要紧的问题。