什么是 DNS 劫持和 DNS 污染?
为了让你通俗易懂地理解 DNS 劫持和 DNS 污染,我们需要先简单回顾一下 DNS(域名系统) 是做什么的。
DNS 就像互联网的“电话簿”。
当你在浏览器输入 www.google.com(域名)时,电脑并不知道它的具体位置,它需要去问 DNS 服务器:“请问 Google 的 IP 地址是多少?”DNS 服务器回答:“是 142.250.x.x。”然后电脑才能根据这个 IP 地址去访问网站。
如果这个“问路”的过程出了问题,就是 DNS 劫持或 DNS 污染。
1. DNS 劫持 (DNS Hijacking)
通俗解释:
你打电话给查号台(DNS 服务器)问某人的电话,但是查号台的工作人员是假的,或者被收买了。他故意给了你一个错误的号码(比如披萨店的号码),让你打过去听广告,或者骗你的钱。
原理:
DNS 劫持通常发生在用户端到ISP(运营商)DNS 服务器之间。攻击者通过某种手段,篡改了你的 DNS 配置,或者拦截了你的 DNS 请求,强行把你引向错误的服务器。
常见形式:
- 运营商劫持: 早期最常见。当你访问一个不存在的域名时,本该显示“无法访问”,结果运营商把你劫持到了一个满是广告的导航页面。或者你在访问网页时,右下角突然弹出的运营商广告,往往也是通过 DNS 劫持插入的。
- 路由器/木马劫持: 黑客入侵了你的路由器,或者你的电脑中了病毒,把你电脑里的“首选 DNS 服务器”改成了黑客控制的服务器。你去访问银行网站,它把你解析到一个做得一模一样的假银行网站(钓鱼网站),盗取你的账号密码。
特点:
- 位置: 通常发生在“最后一公里”,即用户设备、路由器或本地运营商处。
- 目的: 多为了商业利益(弹广告、推广链接)或网络诈骗(钓鱼)。
2. DNS 污染 (DNS Pollution / DNS Cache Poisoning)
通俗解释:
你站在广场上大喊:“谁知道 Google 的电话号码?”真正的查号台还在翻书准备回答你,旁边突然冲出来一个坏人,抢先大喊了一个假号码。因为你听到了第一个回答,你就信以为真,记下了假号码,不再理会后面真正查号台传来的声音。
原理:
DNS 查询通常使用 UDP 协议,这是一种“不建立连接”的协议(只管发,不确认收到)。
在中国互联网环境下,DNS 污染特指 GFW(防火长城) 的一种封锁手段。当你的 DNS 请求经过骨干网时,如果包含敏感域名(如 Google、Facebook 等),GFW 会检测到,并抢在真正的 DNS 服务器响应之前,伪造一个错误的 DNS 应答包发给你。
你的电脑(或本地 DNS 服务器)收到了这个错误的 IP,就会把它存入缓存(Cache)。接下来的一段时间里,不管你再问多少次,得到的都是这个错误的 IP,导致网站无法访问。
特点:
- 位置: 发生在骨干网络节点,是一种“旁路攻击”。
- 目的: 主要用于网络审查,阻止用户访问特定的境外网站。
- 表现: 网站无法打开,或者解析到的 IP 地址是随机的、不可用的(有时甚至会解析到完全无关的国外服务器上)。
3. 两者的核心区别
| 特性 | DNS 劫持 (Hijacking) | DNS 污染 (Pollution) |
|---|---|---|
| 形象比喻 | 查号台是黑店,故意给你假号码。 | 坏人抢答,用假号码淹没真声音。 |
| 发生层级 | 本地设置、路由器、ISP 接入层。 | 国际出口、骨干网层级。 |
| 主要手段 | 修改配置、拦截端口、重定向。 | 抢答(伪造数据包抢先响应)。 |
| 主要目的 | 弹窗广告、网络钓鱼、流量变现。 | 屏蔽网站(国家防火墙主要手段)。 |
| 解决难度 | 较易(修改 DNS、杀毒、投诉运营商)。 | 较难(需要加密传输或代理)。 |
4. 如何应对?
针对这两种情况,普通的解决方法如下:
更换公共 DNS(针对部分劫持):
不要使用运营商默认分配的 DNS,手动在电脑/路由器网络设置里改为公共 DNS,例如:- Google:
8.8.8.8 - Cloudflare:
1.1.1.1 - 阿里 DNS:
223.5.5.5 - 注意:这能解决运营商弹广告的劫持,但无法解决 DNS 污染,因为请求发往
8.8.8.8的途中依然会被 GFW 抢答。
- Google:
使用 DoH (DNS over HTTPS) 或 DoT (DNS over TLS):
这是目前最有效的手段。- 原理: 传统的 DNS 查询是明文的,谁都能看,谁都能改。DoH 把 DNS 请求像普通网页数据(HTTPS)一样加密打包。
- 效果: 运营商和 GFW 既不知道你在问哪个域名,也无法插入伪造的回答。
- 操作: 现在的 Chrome、Edge、Firefox 浏览器设置里都有“安全 DNS”选项,开启并选择 Cloudflare 或 Google 即可。
修改 Hosts 文件(最原始的方法):
直接告诉电脑“不要去问 DNS 服务器了,我直接告诉你这个域名的 IP 是多少”。- 前提是你必须知道该网站正确且未被封锁的 IP 地址。
使用梯子/代理:
将 DNS 请求通过加密隧道发送到海外,由海外的服务器代为解析,从而绕过本地的污染和劫持。