为什么同一个域名,换个 DNS 就"活了"?问题往往不在域名本身,而在你查询的路上——有设备抢先递了一份假答案。
DNS 污染指位于你与正规解析器之间的中间设备,在明文 DNS 查询经过时抢先返回伪造响应,让你把目标域名解析到错误 IP(常见表现:特定域名打不开、跳转到广告页或可疑 IP)。它利用了传统 DNS(UDP 53)明文、无身份认证的缺陷。检测方法很简单:用 dig @A服务器 域名 对比不同 DNS 返回的 IP 是否一致;规避的根本办法是改用加密 DNS——DoH(RFC 8484)或DoT(RFC 7858),查询内容加密后,中间设备看不到你查了哪个域名,也就无法伪造针对性答案。
明文 UDP 53 的设计缺陷,让"抢跑"变得极易实现
传统 DNS 查询走 UDP 53 端口,报文内容(你要查哪个域名)全程明文,且协议本身不对响应方做身份认证——客户端只认"先到达、事务 ID 对得上"的那一个包。这给了链路上的中间设备可乘之机。
典型过程是这样的:你的设备发出查询 dig www.example.com,报文在到达递归解析器之前,会经过运营商网络、骨干网等一系列中间节点。链路上的干扰设备识别出你查询了某个特定域名后,会立刻伪造一个 DNS 响应包(附上错误 IP,甚至把事务 ID 也猜出来),抢在真实解析结果返回之前递给你的设备。客户端先收到这个假包,就直接采信了——真实答案随后到达时反而被丢弃。
关键理解:污染是"被动监视 + 主动抢答"——它不需要劫持你的 DNS 设置,只需要你的查询报文从它眼皮底下明文经过。
记住这些症状,下次遇到就知道从哪里查起
| 表现 | 具体现象 | 可能原因 |
|---|---|---|
| 解析到错误 IP | 访问某域名却打开了广告页、停车场页面或与内容无关的站点 | 伪造响应指向了指定 IP |
| 特定域名异常 | 大部分网站正常,个别特定域名始终打不开、超时或证书报错 | 基于域名关键词的针对性干预 |
| 换个 DNS 就好 | 把 DNS 从运营商默认换成 223.5.5.5 / 1.1.1.1 后问题消失 | 污染发生在原 DNS 之前的链路上 |
| 返回 0.0.0.0 / 黑洞 IP | dig 结果出现 0.0.0.0、127.0.0.1 等不可能的地址 | 伪造响应直接指向黑洞 |
| 结果不稳定 | 同一域名多次解析,IP 时对时错、时而超时 | 伪造包与真实包的到达顺序在竞争 |
核心思路:用不同 DNS 查同一域名,对比结果
污染的本质是"同一份查询,在不同链路上得到不同答案"。所以最可靠的检测方法是指定不同的 DNS 服务器对比查询,而不是只看系统默认结果。
判读方法:如果用 223.5.5.5、1.1.1.1 等加密/境外 DNS 查到的 IP 一致且能正常访问,而你本机默认 DNS 查到的是另一个可疑 IP,基本可以判定:你的默认 DNS 链路被污染了。也可以借助公共在线检测站点对比多地解析结果。注意:如果所有 DNS(包括加密 DNS)都返回同一错误 IP,那问题可能出在权威记录本身或路由层面,而不是污染。
加密是釜底抽薪:让中间设备看不到你查了什么
| 方案 | 做法 | 能解决什么 | 局限 |
|---|---|---|---|
| DoH(推荐) | 把查询封装进 HTTPS,443 端口,按 RFC 8484 执行 | 查询内容全程 TLS 加密,中间人看不到域名,无法伪造针对性答案;证书校验让伪造响应直接被拒 | 依赖 DoH 服务商本身可信 |
| DoT | TLS 加密隧道,专用 853 端口,按 RFC 7858 执行 | 同样加密查询内容,安卓私人 DNS、iOS、路由器原生支持 | 853 端口在个别网络会被单独封锁 |
| 更换备用公共 DNS | 把默认 DNS 换成 223.5.5.5 / 119.29.29.29 等 | 绕开被运营商劫持的默认 DNS,简单见效 | 仍是明文 UDP,换汤不换药,仍可能被污染 |
| 自建递归解析器 | 本地跑 Unbound / AdGuard Home,上游走 DoH/DoT | 查询内容与缓存完全自控 | 需要一定运维能力 |
推荐落地路径:手机端在 Android 9+「私人 DNS」填 DoT 主机名;桌面浏览器开启「安全 DNS」填 DoH 地址(Firefox 操作见官方文档);路由器上游换 https://dns.alidns.com/dns-query 或 Cloudflare DoH。换成加密 DNS 后,再用上面的 dig 对比法复测,确认结果稳定一致。
dig 分别向不同公共 DNS 查询同一域名并对比:dig @223.5.5.5 域名 与 dig @8.8.8.8 域名,若返回 IP 不一致、或对特定域名总是解析到可疑 IP/0.0.0.0,而换加密 DNS 后恢复正常,基本可判定为链路污染。