1. DNS 解析(工作流程、参与方与缓存)
DNS 的目标:把人类可读的域名(如 www.example.com
)映射为 IP 地址(如 93.184.216.34
)。
典型解析流程(递归解析器 + 迭代查询):
-
客户端(stub resolver):浏览器/操作系统发起 DNS 查询,通常询问配置的递归解析器(resolver,如 ISP 提供或 8.8.8.8)。
-
递归解析器:如果缓存命中就直接返回;否则它会代替客户端向上级 DNS 进行查询(Root → TLD → 权威):
- 询问 根服务器(
.
)得到对应顶级域(TLD,如.com
)的 NS 列表。 - 询问 TLD 服务器 得到目标域名的权威服务器(Authoritative Name Server)。
- 询问 权威服务器 获取真实记录(A/AAAA/CNAME 等)。
- 询问 根服务器(
-
递归解析器 返回结果给客户端,并把结果缓存(受 TTL 限制)。
关键名词:
- 权威(Authoritative)服务器:负责某个域名的真实 DNS 记录(由域名持有者或 DNS 提供商托管)。
- 递归解析器(Resolver):为客户端完成上面整个查询流程的服务器(通常由 ISP、企业或公共 DNS 提供)。
- Stub resolver:客户端一侧的轻量解析组件(操作系统/浏览器)。
- TTL:记录在解析器缓存中的存活时间。
2. DNS 污染 / 中毒:概念与类型
DNS 污染/中毒(DNS poisoning) 是指 DNS 响应被篡改或劫持,导致客户端获得错误的 IP,常见后果是访问错误或被引导到恶意站点。
常见类型与成因:
-
DNS 缓存中毒(Cache poisoning)
- 攻击者向递归解析器注入伪造的响应(例如伪造 A 记录或 NS 记录),导致解析器缓存错误数据,从而把多个用户引导到恶意 IP。
- 经典手段:伪造事务 ID、源端口等,使得伪造响应被接受。现代 DNS/操作系统通过随机端口等减小风险,但并非万无一失。
-
劫持/篡改(Hijacking)
- ISP 或中间网络设备基于策略或商业目的修改解析结果(例如将无法解析的查询指向运营商广告页或拦截)。
- 国家级审查(DNS 污染/污染返回错误 IP 或 NXDOMAIN/截断)也属于这一类。
-
中间人攻击(Man-in-the-Middle)
- 攻击者在通信链路中拦截并修改 DNS 请求或响应(在未加密的情况下可行),常见于局域网或被劫持的 DNS 服务器。
-
域名劫持 / 域名解析权更改
- 域名注册信息被篡改,修改了域名的权威服务器或 A 记录,这属于对域名注册/托管的直接攻击或滥用。
3. DNS 污染会带来哪些风险/危害?
- 钓鱼/流量劫持:把合法域名解析到恶意服务器,窃取凭证或注入恶意内容。
- 隐私泄露:用户被重定向到被监控的节点。
- 可用性损失:合法服务不可达(被解析到虚假 IP 或 NXDOMAIN)。
- 流量拦截/广告注入:ISP 或中间人通过修改解析插入广告或提示页。
- 信任破坏:如果 DNSSEC 被绕过或未启用,客户端无法验证响应真实性。
4. 如何检测 / 鉴别是否被污染
快速诊断步骤(用户侧)
-
对比多个解析器的结果:
dig +short example.com @8.8.8.8 dig +short example.com @1.1.1.1 dig +short example.com @本地递归解析器
如果不同解析器返回不同 IP(且权威服务器并非变化),说明可能被污染或本地 resolver 缓存有问题。
-
追踪权威来源:
dig +trace example.com
+trace
会显示从根、TLD 到权威服务器的逐步结果,便于定位哪个层级返回了错误结果。 -
查询权威服务器:直接向域的权威服务器查询:
dig @ns1.example-authoritative.com example.com A
若权威服务器给出正确值,但递归解析器给出错误值,很可能是递归解析器被中毒。
-
查看本机缓存:
- Windows:
ipconfig /displaydns
,清空缓存ipconfig /flushdns
。 - macOS:
sudo killall -HUP mDNSResponder
(不同系统命令略有差异)。
- Windows:
-
检查 DNSSEC:如果域名启用了 DNSSEC,使用
+dnssec
或dig
输出检查 RRSIG/AD 标志,或使用delv
等工具验证签名是否有效。DNSSEC 能检测劫持(若验证失败即可发现篡改)。 -
判断是 ISP 层面还是本地问题:在同一网络下,用手机切换到蜂窝网络或使用 VPN,再次查询;若换网络未重现问题,则可能是本地或本 ISP 的污染。
5. 如何缓解与防护(用户 & 运维/服务方)
用户端(普通用户/客户端)
-
使用可信公共解析器:如 Google (8.8.8.8 / 8.8.4.4)、Cloudflare (1.1.1.1)、Quad9(9.9.9.9)。注意某些 ISP 会拦截/劫持 DNS,即使设置了 DNS 也可能被重写。
-
启用加密 DNS:DNS over HTTPS (DoH) 或 DNS over TLS (DoT),可防止中间人篡改:
- 浏览器层:Firefox/Chrome 支持 DoH。
- 系统/路由器:使用支持 DoT/DoH 的解析器或本地代理(例如 Cloudflared、stubby)。
-
使用 VPN:将 DNS 解析通过 VPN 隧道走,可以绕过本地 ISP 的污染(但要信任 VPN 提供商)。
-
DNSSEC 验证客户端:部分系统/解析器可以启用本地 DNSSEC 验证(比如
unbound
可以启用严格验证),能检测到被篡改的响应。 -
定期清缓存:遇到解析问题时清空本机 DNS 缓存。
递归解析器 / ISP(运维侧)
- 启用 DNSSEC 验证:在递归解析器(如
unbound
、bind
、knot-resolver
)上启用 DNSSEC 验证,拒绝或标记不合法签名的响应。 - 使用随机源端口与事务 ID:现代解析器默认启用,提高伪造响应难度。
- 限制递归对外开放(防止被滥用):禁用开放递归或限制访问白名单。
- 实现速率限制 / 反放大 / 抗缓存中毒策略:防止针对大规模伪造响应的攻击。
- 监控与告警:监控异常解析结果、TTL 突变、权威 NS 变化等,及时告警。
- 限制区域传送(AXFR)和使用 TSIG:保护权威服务器数据。
- 定期打补丁:修补已知的 DNS 软件漏洞(比如某些 DNS 服务器历史漏洞可被利用做缓存中毒)。
权威域名持有者
- 启用 DNSSEC 并正确签名区域:让下游解析器/用户进行验证。
- 控制 NS/Registrar 安全:使用 registrar 的安全功能(锁定转移、强认证)。
- 限制对 AXFR 的访问并保护管理接口。
6. 区分“DNS 污染”与“DNS 污染 / 劫持”的实际示例
- ISP “污染/重定向”:当查询无法解析或为某些敏感域名时,ISP 返回错误 IP(运营商提示页或黑洞 IP)。这是有意为之,目的可能是审查或广告。
- 真实的缓存中毒攻击:攻击者利用解析器漏洞或网络中间节点注入错误响应,使大量用户解析到恶意网站。
- DNSSEC 可检测场景:若权威域启用了 DNSSEC,递归解析器在收到伪造响应时会验证失败(如果解析器开启 DNSSEC 验证),从而拒绝返回给客户端—这能显著降低缓存中毒成功率。
7. 常用工具(命令行)用于排查与诊断
-
dig
(Linux/macOS):dig +trace example.com
(追踪解析链路)dig @8.8.8.8 example.com A
(向指定解析器查询)dig example.com +dnssec
(检查 DNSSEC)
-
nslookup
(Windows/跨平台) -
delv
(用于 DNSSEC 验证) -
Get-Command
/ipconfig /displaydns
/ipconfig /flushdns
(Windows) -
tcpdump
/wireshark
:抓包分析 DNS 流量,观察是否有伪造响应或中间人篡改。 -
unbound-control
(若用 unbound),rndc
(BIND)等解析器管理工具。
8. 总结
- 解析流程:客户端 → 递归解析器 → 根 → TLD → 权威 → 缓存 → 返回。
- 缓存中毒:攻击者注入伪造响应到递归解析器缓存,从而影响大量用户。
- 污染后果:钓鱼、隐私泄露、可用性下降。
- 检测方法:对比多个解析器、
dig +trace
、查询权威服务器、检查 DNSSEC。 - 防护:DNSSEC、DoH/DoT、使用可信解析器、递归解析器加固、权限与速率限制、监控告警。