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,常见后果是访问错误或被引导到恶意站点。

常见类型与成因:

  1. DNS 缓存中毒(Cache poisoning)

    • 攻击者向递归解析器注入伪造的响应(例如伪造 A 记录或 NS 记录),导致解析器缓存错误数据,从而把多个用户引导到恶意 IP。
    • 经典手段:伪造事务 ID、源端口等,使得伪造响应被接受。现代 DNS/操作系统通过随机端口等减小风险,但并非万无一失。
  2. 劫持/篡改(Hijacking)

    • ISP 或中间网络设备基于策略或商业目的修改解析结果(例如将无法解析的查询指向运营商广告页或拦截)。
    • 国家级审查(DNS 污染/污染返回错误 IP 或 NXDOMAIN/截断)也属于这一类。
  3. 中间人攻击(Man-in-the-Middle)

    • 攻击者在通信链路中拦截并修改 DNS 请求或响应(在未加密的情况下可行),常见于局域网或被劫持的 DNS 服务器。
  4. 域名劫持 / 域名解析权更改

    • 域名注册信息被篡改,修改了域名的权威服务器或 A 记录,这属于对域名注册/托管的直接攻击或滥用。

3. DNS 污染会带来哪些风险/危害?

  • 钓鱼/流量劫持:把合法域名解析到恶意服务器,窃取凭证或注入恶意内容。
  • 隐私泄露:用户被重定向到被监控的节点。
  • 可用性损失:合法服务不可达(被解析到虚假 IP 或 NXDOMAIN)。
  • 流量拦截/广告注入:ISP 或中间人通过修改解析插入广告或提示页。
  • 信任破坏:如果 DNSSEC 被绕过或未启用,客户端无法验证响应真实性。

4. 如何检测 / 鉴别是否被污染

快速诊断步骤(用户侧)

  1. 对比多个解析器的结果

    dig +short example.com @8.8.8.8
    dig +short example.com @1.1.1.1
    dig +short example.com @本地递归解析器
    

    如果不同解析器返回不同 IP(且权威服务器并非变化),说明可能被污染或本地 resolver 缓存有问题。

  2. 追踪权威来源

    dig +trace example.com
    

    +trace 会显示从根、TLD 到权威服务器的逐步结果,便于定位哪个层级返回了错误结果。

  3. 查询权威服务器:直接向域的权威服务器查询:

    dig @ns1.example-authoritative.com example.com A
    

    若权威服务器给出正确值,但递归解析器给出错误值,很可能是递归解析器被中毒。

  4. 查看本机缓存

    • Windows: ipconfig /displaydns,清空缓存 ipconfig /flushdns
    • macOS: sudo killall -HUP mDNSResponder(不同系统命令略有差异)。
  5. 检查 DNSSEC:如果域名启用了 DNSSEC,使用 +dnssecdig 输出检查 RRSIG/AD 标志,或使用 delv 等工具验证签名是否有效。DNSSEC 能检测劫持(若验证失败即可发现篡改)。

  6. 判断是 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 验证:在递归解析器(如 unboundbindknot-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、使用可信解析器、递归解析器加固、权限与速率限制、监控告警。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐