DNS 污染、劫持与投毒的区别及各自的判定方法
知识DNS 污染、DNS 劫持、缓存投毒经常被混着叫,但三者出问题的位置不同,判定方法和解决办法也完全不同。先分清是哪一种,再谈怎么处理。
三者的区别
| 发生位置 | 典型表现 | |
|---|---|---|
| DNS 污染 | 链路中途 | 抢先返回一个伪造应答,真应答随后到达但被丢弃 |
| DNS 劫持 | 递归服务器 | 递归服务器自己改了答案,比如把不存在的域名指到广告页 |
| 缓存投毒 | 递归服务器缓存 | 攻击者把伪造记录塞进缓存,在 TTL 内影响所有用户 |
直观的区分方法:污染是「路上被人插了一句」,劫持是「问的人自己撒谎」,投毒是「问的人被骗了、然后一直照着骗人的话答」。
怎么判定
污染
特征是应答快得不正常,而且换任何 DNS 服务器结果都一样——因为伪造包在中途就返回了,根本没走到真正的服务器。向一个明确不提供 DNS 服务的 IP 发查询,正常情况应该超时,如果居然拿到了应答,那基本可以确认链路上有人在抢答。
劫持
特征是换一个递归服务器结果就变了。同一个域名,用运营商 DNS 查是 A 结果,用公共 DNS 查是 B 结果,且 B 和权威服务器一致,那就是运营商这一层动了手脚。查一个随便编的不存在的域名,正常应该返回 NXDOMAIN,如果返回了某个可访问的 IP,那就是典型的 NXDOMAIN 劫持。
投毒
特征是同一台递归服务器上,解析结果和权威服务器不一致,且过一段时间(TTL 到期后)自己恢复了。这种最少见,但影响面最大。
排查顺序
- 先用 DNS 记录查询 直接问权威服务器,拿到「正确答案」作为基准。
- 用 全国 DNS 解析分布 看各地各运营商的解析结果,和基准比对。全国一致但都和权威不一样 → 域名配置问题;部分地区不一样 → 污染或劫持。
- 用 DNS 检测 与 劫持检测 确认异常类型。
- 怀疑本机或本地网络有问题时,用 DNS 泄漏检测 看实际出口用的是哪台递归服务器——很多时候「换了公共 DNS」只是改了配置,流量还是被透明代理到了运营商那里。
能做什么
- 站点方:全站 HTTPS 是最有效的止损手段。DNS 被改到错误 IP,证书对不上,浏览器会拦下来,至少不会把用户送到假页面。同时确认权威服务器的 TTL 设置合理,出事时能快速切换。
- 用户侧:改用 DoH 或 DoT。加密之后中途没法看到查询内容,也就抢答不了。单纯把 DNS 改成公共 IP 地址对污染无效。
- 企业内网:自建递归服务器并开启 DNSSEC 校验,可以防住投毒,对污染帮助有限。
一个提醒
解析异常里,真正属于攻击的其实是少数。更常见的是自己改了记录还没等 TTL 过期、CDN 配置出错、或者域名到期忘了续费。下结论之前,先把这几种平凡的原因排掉。