DNS污染和DNS劫持有什么区别?怎么检测、怎么解决
DNS污染和DNS劫持,结果都是你查一个域名、拿到了错误的 IP,区别在于是谁、在哪一步动的手。DNS污染发生在查询途中:你的查询还没到 DNS 服务器,途经的网络设备就抢先塞回一个伪造的答案。DNS劫持发生在 DNS 服务器或你的路由器上:服务器本身被改了,或者你根本没连到正确的服务器。
两者解决办法不一样。网上不少老文章说「把 DNS 改成 8.8.8.8 就行」,对劫持可能有用,对污染基本没用。这篇讲清两者的区别,给一个能自己动手的检测方法,再说现在真正有效的解决办法。
污染和劫持的区别
| 对比项 | DNS污染 | DNS劫持 |
|---|---|---|
| 在哪一步 | 查询途中,被途经的设备抢答 | DNS 服务器或你的路由器上 |
| 谁干的 | 网络中间的过滤设备 | 运营商的 DNS、被篡改的路由器、恶意软件 |
| 典型表现 | 某些境外网站的域名解析到毫不相干的 IP,打不开 | 打开网页被跳到广告页,输错网址跳到导航页 |
| 换个 DNS 服务器地址有没有用 | 基本没用,查询照样在途中被抢答 | 往往有用,绕开了被动手的服务器 |
| 真正的解决办法 | 加密 DNS(DoH / DoT),或让代理那边解析 | 换 DNS、检查路由器、查杀恶意软件 |
为什么改成 8.8.8.8 挡不住污染
普通的 DNS 查询是明文的,用 UDP 发出去,不验证答案是谁回的。污染的原理就是:途经的设备看到你在查某个域名,立刻伪造一个答案先回给你,你的电脑收到第一个答案就用了,真正的答案后到,被丢掉。
你把 DNS 改成 8.8.8.8,查询仍然是明文、仍然要途经同样的网络,照样会被抢答。所以改地址对污染没用。
加密 DNS 不一样:DoH 把查询放在 HTTPS 里,DoT 放在 TLS 里,途中的设备既看不到你查的是什么,也没法伪造一个能通过验证的答案。
自己检测是不是被污染了
第一步:查出解析结果
# 用系统默认的 DNS 查
nslookup www.google.com
# 换一个 DNS 服务器再查一次
nslookup www.google.com 223.5.5.5
第二步:查这个 IP 是谁的
把上面拿到的 IP 填进去:
curl -s https://ipinfo.io/查到的IP/org
google.com 解析出来的 IP 应该属于 Google(结果里会出现 Google LLC)。如果显示的是毫不相干的公司,或者根本连不上,就是被污染了。
第三步:用加密 DNS 对照
DoH 查询走的是 HTTPS,可以直接用 curl 发:
curl -s "https://cloudflare-dns.com/dns-query?name=www.google.com&type=A" -H "accept: application/dns-json"
返回的 JSON 里 Answer 部分就是 IP。它跟第一步的结果对不上、而且它的 IP 归属正确,就能确认普通查询被污染了。这个地址本身在部分网络下也可能访问不了,那种情况可以连着代理再测。
怎么解决
| 你的情况 | 办法 |
|---|---|
| 不用代理,只想防劫持 | 换一个可信的公共 DNS,检查路由器的 DNS 设置有没有被改 |
| 想防污染 | 系统或浏览器开启加密 DNS(DoH / DoT)。Windows 11 和主流浏览器的设置里都有这个选项 |
| 用代理客户端 | 让要走代理的域名由代理那边解析,本地不查也就不会被污染 |
| 命令行、Git 走代理 | 用 socks5h:// 写法,域名交给代理解析,见 SOCKS5代理设置方法 |
代理客户端处理 DNS 的方式,FakeIP 是其中一种,它让要走代理的域名根本不在本地解析,原理和利弊见 FakeIP是什么。
两个常见误区
「改 hosts 文件就能解决」
hosts 里写死一个 IP,确实能跳过 DNS。但网站的 IP 会变,写死的很快就失效;而且很多网站即使 IP 对了,连接还会在其他环节被拦下。现在改 hosts 只适合临时救急,不是长期办法。
「DNS 污染和 DNS 泄漏是一回事」
污染是你拿到了错误的答案;泄漏是用了代理之后,DNS 查询还是从你本地的网络发出去了,暴露了你在访问哪些网站。两者可能同时存在,但检查方法不同,泄漏的检查见 IP泄漏性能测试。
我们的客户端怎么处理 DNS
我们的电脑端把域名分成两类:国内域名交给本地 DNS 解析;其余域名经代理用加密 DNS 解析,查询从境外发出,也就不会被途中污染。安卓端对要走代理的域名用 FakeIP,本地不做真实解析,同样避开了污染。
说一句对我们不利的实话:国内域名我们照样用本地 DNS 解析,这样国内网站才快。如果你的运营商或路由器劫持了国内域名(比如把打错的网址跳到广告页),我们的客户端不会帮你处理,要按上面防劫持的办法自己解决。
常见问题
DNS 污染是什么意思?
你查一个域名时,查询在途中被网络设备抢先回了一个伪造的答案,于是拿到了错误的 IP,网站打不开。
DNS 污染怎么解决?
改用加密 DNS(DoH / DoT),或者让代理客户端在境外解析要走代理的域名。只把 DNS 地址改成 8.8.8.8 基本没用,查询照样会被途中抢答。
DNS 劫持是什么意思?
DNS 服务器或你的路由器返回了被篡改的结果,常见的是打开网页被跳到广告页,或者输错网址被带到导航页。
DNS 劫持怎么解决?
先检查路由器的 DNS 设置有没有被改,再换一个可信的公共 DNS;电脑上出现的话,顺便查一下有没有恶意软件。
DNS 污染怎么检测?
用 nslookup 查出域名的 IP,再查这个 IP 归哪家公司所有。比如 google.com 解析出来的 IP 不属于 Google,就是被污染了。也可以用 DoH 查一次做对照。