【计算机网络】DNS 解析 & DNS 污染
解析流程:客户端 → 递归解析器 → 根 → TLD → 权威 → 缓存 → 返回。缓存中毒:攻击者注入伪造响应到递归解析器缓存,从而影响大量用户。污染后果:钓鱼、隐私泄露、可用性下降。检测方法:对比多个解析器、dig +trace、查询权威服务器、检查 DNSSEC。防护:DNSSEC、DoH/DoT、使用可信解析器、递归解析器加固、权限与速率限制、监控告警。
1. DNS 解析(工作流程、参与方与缓存)
DNS 的目标:把人类可读的域名(如 www.example.com)映射为 IP 地址(如 93.184.216.34)。
🚀 DNS 解析完整流程(逐级查找)
假设你访问:
https://cdn.company.com/logo.png
浏览器为了得到 cdn.company.com 的 IP,会依次查询:
🔍 ① 浏览器缓存(最快)
浏览器会先查自己的 DNS 缓存:
有没有 cdn.company.com 的 IP 缓存?
有缓存 → 直接使用,省掉后面所有流程。
前端常见场景:
- Webpack/Vite 本地 devServer:
localhost会被缓存 - 线上访问较频繁的 CDN 静态资源
🔍 ② 系统缓存(OS 缓存)
浏览器没有,就问 操作系统 DNS 缓存:
- Windows 查询:
ipconfig /displaydns - Mac/Linux:查询
/etc/hosts优先解析
hosts 文件可以跳过 DNS 服务器,常用于公司内部调试:
10.0.1.233 test.company.com
🔍 ③ 路由器缓存
如果系统内也没有,就问:
路由器:有没有解析过?
路由器一般会缓存最近解析的域名,提高用户家庭网络访问速度。
🔍 ④ DNS 递归解析(向外问别人)
找不到才会真正发网络请求 → 递归 DNS 服务器
一般由 ISP(移动 / 电信 / 联通) 或 企业内部提供。
Browser → Local DNS (递归服务器)
递归服务器负责帮你继续查询。
🔍 ⑤ 根 DNS 服务器
递归服务器问 根 DNS:
“.com 在哪里?”
根 DNS 不会告诉你 IP,只会告诉你 顶级域名服务器的地址。
🔍 ⑥ 顶级域 DNS (.com)
递归服务器去问:
“company.com 的权威服务器在哪?”
顶级域 DNS 返回:
“去找权威 DNS:ns.company.com”
🔍 ⑦ 权威 DNS
权威 DNS 才知道最终答案:
cdn.company.com → 93.184.216.34
递归服务器拿到 IP:
✅ 回传给浏览器
✅ 记录在缓存(提高后续查询速度)
✅ 总结流程图
浏览器缓存 → 系统 hosts → 路由器缓存
↓没有
递归 DNS 服务器
↓
Root DNS(根服务器)
↓
Top-level DNS(.com)
↓
Authority DNS(权威,有域名记录)
↓
返回 IP 地址
优化—— dns-prefetch
提前去解析域名:
<link rel="dns-prefetch" href="//cdn.company.com">
优化——preconnect
直接建立 TCP + TLS 连接:
<link rel="preconnect" href="https://cdn.company.com">
在 Webpack/Vite 项目中,可以通过 HtmlWebpackPlugin 自动注入。
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、使用可信解析器、递归解析器加固、权限与速率限制、监控告警。
更多推荐
所有评论(0)