II///8 分钟/2,593

DNS 污染是怎么回事:原理、诊断与防御

从一次「网站打不开」出发,把 DNS 污染这件事拆开讲清楚:明文 DNS 为什么天生可欺骗、污染和劫持有什么区别、怎么用 dig 亲手验证,以及 DoH、DoT、DNSSEC 各自防得住什么、防不住什么。

本页目录 · 7

你大概遇到过这种情况:一个网站突然打不开,ping 域名得到一个莫名其妙的 IP,换了个 DNS 服务器又时好时坏。别人告诉你「这是 DNS 污染」。这四个字听起来像个结论,但它其实是一整套机制的结果——而这套机制,恰好是理解「为什么明文协议不可信」的最好教材。

这篇文章不教任何绕过手段的操作细节,重点在三件事:污染在协议层面是怎么发生的、怎么亲手确认你遇到的是它、以及各种防御方案的边界在哪里

先回顾:一次 DNS 查询长什么样

当你在浏览器输入 example.com,操作系统会向配置好的递归解析器(通常是运营商下发的,或者你手动填的 8.8.8.8 之类)发一个 DNS 查询。传统 DNS 有两个对本文至关重要的特征:

  1. 默认走 UDP 53 端口,明文传输。 查询和应答都没有加密,链路上的任何设备都能看到你在查什么。
  2. 没有身份验证。 客户端判断「这个应答是不是给我的」只靠几个弱条件:来源 IP 和端口对得上、查询 ID(一个 16 位随机数)对得上、问题段一致。谁先满足这些条件把应答送到,客户端就信谁。

第二点是一切问题的根源。协议设计于 1983 年,那时的假设是网络中间人是善意的。

DNS 污染的工作方式:抢答

DNS 污染(更准确的英文是 DNS spoofing / injection)的原理可以概括成一句话:

链路上的某个设备看到了你的明文查询,赶在真正的应答回来之前,伪造一个应答抢先塞给你

拆开看是这样一个时序:

你            中间设备              真正的 DNS 服务器
 │  查询 example.com  │                    │
 ├──────────────────>│───────────────────>│
 │                   │                    │
 │  伪造应答(假 IP)  │                    │
 │<──────────────────┤                    │
 │                   │   真应答(晚到了)   │
 │<──────────────────┼────────────────────┤
 │  ↑ 已经采信假应答,真应答被丢弃            │

注意几个关键点:

  • 真正的 DNS 服务器可能完全无辜。 它老老实实回了正确结果,只是回来得比伪造应答晚。这也是为什么「换一个国外公共 DNS」经常没用——查询包还是要经过同一段链路,照样会被看到、被抢答。
  • 伪造的 IP 可能是完全无关的地址、不可路由的地址,或者干脆是黑洞地址。连接结果表现为超时、重置或跳到莫名其妙的页面。
  • 因为抢答只需要「看得到查询」,这种攻击天然适合部署在网络出口等流量必经之路上。

容易混淆的三个概念

中文语境里「污染」「劫持」「投毒」经常混用,但机制不同,防御手段也不同:

概念发生位置机制典型场景
DNS 污染 / 注入链路中间监听明文查询,伪造应答抢先送达大范围网络审查
DNS 劫持解析器本身解析器故意返回错误结果运营商广告跳转、404 劫持
缓存投毒递归解析器的缓存攻击者向解析器塞入伪造记录,污染的是缓存Kaminsky 攻击(2008)

区分方法很实用:劫持换一个可信解析器就能解决,因为问题出在解析器;污染换解析器通常无效,因为问题出在路上;缓存投毒是针对解析器基础设施的攻击,普通用户很少直接面对,现代解析器靠源端口随机化和 0x20 编码等手段已大幅缓解。

亲手诊断:确认你遇到的是污染

与其看别人的结论,不如自己动手验证。工具只需要 dig(Windows 上可以用 nslookup 或 WSL)。

第一步:对比多个解析器的结果。

dig example.com @223.5.5.5 +short   # 国内公共 DNS
dig example.com @8.8.8.8  +short   # Google DNS
dig example.com @1.1.1.1  +short   # Cloudflare DNS

如果几个互不相关的解析器返回同一个可疑 IP,这本身就很反常——正常情况下大型网站在不同解析器上常会因 CDN 而得到不同结果,反而是「处处一致的错误答案」更像统一注入。

第二步:向一个「不存在的 DNS 服务器」发查询。

这是最有说服力的一个实验。挑一个根本没有运行 DNS 服务的 IP(甚至是不可达的地址),对它发起查询:

dig example.com @<一个不提供 DNS 服务的 IP>

正常情况下这个查询必然超时——对面根本没有服务在听。如果你居然收到了「应答」,那么这个应答只可能来自链路中间的注入设备。它等于当场自证了存在。

第三步:观察应答的细节特征。

被注入的应答常有可识别的痕迹:TTL 异常(和真实记录的 TTL 模式对不上)、没有 EDNS 扩展段、应答中只有一条孤零零的 A 记录、或者对同一域名短时间内返回一批看似随机轮换的假 IP。把可疑 IP 拿去查一下归属(whois),归属和网站毫无关系也是重要信号。

防御手段:各自防得住什么

没有银弹,每种手段的能力边界都值得说清楚。

加密 DNS:DoH 与 DoT

DoH(DNS over HTTPS) 把 DNS 查询装进 HTTPS 里走 443 端口,DoT(DNS over TLS) 走专用的 853 端口。两者的核心价值相同:

  • 查询内容加密——中间设备看不到你在查什么域名,抢答的前提(看到明文查询)直接消失;
  • TLS 证书验证了解析器身份——伪造应答无法通过校验。

区别主要在可识别性:DoT 的 853 端口特征明显,容易被整体阻断;DoH 混在普通 HTTPS 流量里,阻断的附带成本更高。主流浏览器(Firefox、Chrome)和操作系统(Android 的 Private DNS、Windows 11)都已内置支持,这是普通用户成本最低、收益最大的选项。

但要注意 DoH 的信任转移:链路上的人看不到了,DoH 服务商本身看得一清二楚。你只是把「信任运营商链路」换成了「信任某家解析服务商」。

DNSSEC:签名验证

DNSSEC 给 DNS 记录加上密码学签名,让解析器可以验证「这条记录确实是域名所有者发布的、没被篡改过」。它在原理上正面回答了「应答可信吗」这个问题,但现实中有两个明显局限:

  1. 验证通常发生在递归解析器上,而不是你的电脑上。解析器到你之间的「最后一公里」如果是明文的,照样可以被注入——所以 DNSSEC 需要和加密 DNS 配合才完整。
  2. 部署率仍然有限,大量域名根本没有签名,此时 DNSSEC 帮不上忙。

另外,对于「返回超时/黑洞」式的污染,DNSSEC 只能让你知道结果被篡改了,并不能帮你拿到正确结果——完整性保护和可用性保障是两回事。

hosts 文件

在本机 hosts 文件里手动写死「域名 → IP」,等于跳过 DNS 解析。它能应对最简单的场景,但缺点也直白:IP 一旦变更就失效,对使用 CDN、IP 池频繁轮换的网站几乎不可维护,而且解决不了后续连接本身被干扰的问题(见下一节)。适合当临时的诊断工具,不适合当长期方案。

可信递归解析器

如果你面对的只是运营商层面的劫持(广告注入、错误页跳转),换成公共 DNS(223.5.5.5、8.8.8.8、1.1.1.1 等)配合 DoH/DoT 就能解决——这类问题出在解析器,绕开那台解析器即可。

修好了 DNS,不等于修好了连接

最后一个容易踩的认知误区:DNS 只负责「查号」,不负责「通话」。

即使你通过加密 DNS 拿到了完全正确的 IP,后续的 TCP 连接和 TLS 握手仍然走在同一条链路上。TLS 的 ClientHello 里有一个明文字段 SNI(Server Name Indication),它同样暴露了你要访问的主机名——干扰完全可以在这一层继续发生(连接重置、丢包)。这就是为什么有时候「DNS 明明解析对了,网站还是打不开」。

针对这一层的协议演进是 ECH(Encrypted Client Hello),它把 SNI 也加密起来,目前仍在推进部署中。理解这一点能帮你把问题定位得更准:DNS 层的问题用 DNS 层的工具解决,连接层的问题则超出了本文范围。

小结

  • 明文 DNS 没有身份验证,「谁先应答谁赢」,这是污染得以成立的协议基础;
  • 污染发生在链路上,劫持发生在解析器上——换解析器能解决后者,解决不了前者;
  • 用「向不提供 DNS 服务的 IP 发查询」这个实验,可以令人信服地确认注入的存在;
  • DoH/DoT 通过加密让「看见查询」这个前提消失,是目前性价比最高的防御,但意味着信任转移;
  • DNSSEC 提供完整性验证,但需要加密传输配合,且救不了可用性;
  • DNS 正确不代表连接畅通——SNI 层面的干扰是另一个战场。

对网络专业的学生来说,DNS 污染其实是个难得的「活教材」:它把协议设计的历史包袱、威胁模型的变迁、以及每一层防御的边界,全都摆在了你每天都在用的网络里。


初稿写于 2026-03-17,2026-07-26 重写。

留言 · 来聊聊

滚动到这里时再加载评论…