DNS 污染是什么:原理、症状、和 DNS 泄露的区别,以及客户端里怎么用远程 DNS 和 DoH 规避
DNS 污染是域名被解析到错误 IP 导致网站打不开的现象,和 DNS 泄露是两回事。本文讲污染的原理、怎么确认自己遇到的是污染、为什么开了机场有时仍受影响,以及 Clash、sing-box、Shadowrocket 里用远程解析、Fake-IP、DoH 规避的具体设置。
一句话版本
DNS 污染是:你问「这个网站的 IP 是多少」,得到的答案是假的。于是浏览器去连一个错误的、根本不提供服务的地址,页面显示「无法访问此网站」或一直转圈。它和「DNS 泄露」是两个完全不同的问题,很多人把二者混为一谈,排错时自然找不到方向。
污染是怎么发生的
正常的域名解析是明文 UDP 请求,发往 53 端口。请求和回复都没有加密、没有签名,所以链路中间的设备可以在真正的回复到达前,抢先塞回一个假回复。你的电脑收到第一个回复就信了,后面真的回复被丢弃。
这种抢答是针对特定域名列表进行的,所以症状有明显特征:国内网站一切正常,只有特定一批海外网站打不开。返回的假 IP 往往固定在几个无意义的地址段,有时是别国的 IP,有时甚至是保留地址。
污染和「封锁 IP」不同。IP 被封时,你拿到的 IP 是对的,只是连不上;污染时,你拿到的 IP 一开始就是错的。两者可以同时存在,也经常同时存在。
典型症状
- 浏览器提示 DNS_PROBE_FINISHED_NXDOMAIN、ERR_NAME_NOT_RESOLVED,或长时间转圈后超时。
- 换一个 IP 查询站 ping 这个域名,返回的地址和官方公布的服务器完全不在一个地区。
- 同一台电脑,连上机场的 TUN 模式后能打开,关掉就打不开,但系统代理模式下有时也打不开。
- 终端里用
nslookup example.com多查几次,结果变来变去。
最后一条是最可靠的判据。真实解析结果通常稳定,污染回复则随机。
和 DNS 泄露的区别
| 维度 | DNS 污染 | DNS 泄露 |
|---|---|---|
| 本质 | 解析结果被篡改 | 解析请求走了错误的路径 |
| 症状 | 网站打不开 | 网站能打开,但隐私暴露、流媒体判定代理 |
| 影响 | 可用性 | 隐私与解锁 |
| 根因 | 明文 DNS 在途中被注入 | 客户端用本地 DNS 解析了代理域名 |
| 修复方向 | 让解析在远端或加密通道里完成 | 让代理流量的解析也走代理 |
两者的修复手段高度重叠,核心都是「不要在本地用明文 DNS 解析海外域名」。但目的不同:防污染是为了能打开,防泄露是为了不被看见。DNS 泄露的检测与修复另有专文,见 DNS 泄露是什么。
为什么开了机场还会中招
机场解决的是「流量怎么出去」,但解析发生在流量出去之前。如果客户端的工作方式是「本地先把域名解析成 IP,再把 IP 发给节点」,那么解析这一步仍然在你家宽带上进行,污染照样发生,节点收到的是一个假 IP,自然连不上。
这也是为什么有些人系统代理模式下一切正常,换一个客户端或换一种模式就出问题。系统代理(HTTP / SOCKS5)默认是把域名原样交给节点,由节点在海外解析;而 TUN 模式下,如果 DNS 配置不当,就会退回本地解析。
规避方法一:让远端节点解析
对代理流量来说,最干净的方案是根本不在本地解析。Clash 系客户端里,这取决于 DNS 的 enhanced-mode:
- Fake-IP:客户端收到解析请求时直接返回一个假的内网地址(如 198.18.x.x),并记住「这个假 IP 对应哪个域名」。程序连假 IP 时,客户端把域名还原后发给节点,由节点在海外解析。本地从未发出真实查询,污染无从下手。
- Redir-Host:本地真实解析后再把域名和 IP 一起交给节点。此时本地解析用的 nameserver 必须是加密的(DoH / DoT),否则会被污染。
Clash Verge Rev 在「设置 → Clash 设置 → DNS」里切换;FlClash 在「配置 → DNS」里;Mihomo Party 在「DNS 设置」。新手直接选 Fake-IP,兼容性问题通常出在少数局域网设备和游戏上,把它们加进 fake-ip-filter 即可。
规避方法二:加密 DNS(DoH / DoT)
DoH 把查询包进 HTTPS,DoT 包进 TLS。中间设备看到的只是一条加密连接,无法知道你在问哪个域名,也就没法抢答。
在 Clash 的 DNS 段里,nameserver 填 https://1.1.1.1/dns-query 或 https://dns.google/dns-query,并配合 fallback 与 geoip 规则,国内域名走国内 DNS、其他走 DoH。sing-box 在 dns.servers 里加一条 https://1.1.1.1/dns-query 并设置 detour 走代理,效果更好,因为连 DoH 服务器本身的连接都从节点出去。
Shadowrocket:设置 → DNS 覆写,填 DoH 地址。Surge:DNS 设置里直接有「加密 DNS」项。Stash、Loon、Quantumult X 也都有对应项,名字略不同但都在 DNS 相关页面。
一个常见误区是只改系统 DNS 为 8.8.8.8。普通 53 端口查询到任何服务器都会被污染,换服务器不换协议没有意义。
规避方法三:浏览器自带的 DoH
Chrome、Edge、Firefox 都能单独开安全 DNS。它能让浏览器自己绕开污染,但代价是绕开了客户端的分流:浏览器自己把国内域名也拿去 DoH 解析,可能让国内网站被解析到海外 CDN 节点,访问变慢,还可能和 Fake-IP 冲突。
建议:用了机场客户端就关掉浏览器的安全 DNS,让客户端统一管。只有在没开客户端又想临时打开某些被污染但 IP 没封的网站时,浏览器 DoH 才有用处。
排查流程
- 关掉客户端,用
nslookup 目标域名查三次。结果跳动或明显不对,确认污染。 - 打开客户端,看 DNS 模式。Fake-IP 直接跳到第 4 步。
- Redir-Host 模式下,把 nameserver 改成 DoH 地址,重载配置。
- 仍打不开,看日志里该域名匹配的规则:如果被判成 DIRECT,说明规则集把它划成了国内站,手动加一条 DOMAIN-SUFFIX 指向代理。
- 规则没问题还是不行,大概率是 IP 层被封,和 DNS 无关,换节点。
更多开了代理却仍打不开部分网站的情况,见 连上了但没网。
对选机场的意义
污染是在你和入口之间发生的,和机场本身没有直接关系,任何机场都无法「防污染」。但机场配套的订阅配置可以帮你省事:好的机场订阅会预设合理的 DNS 段,Fake-IP 加 DoH 加国内外分流,导入即用。订阅里 DNS 段空空如也、全靠客户端默认值的,就需要你自己动手。订阅转换与配置结构见 订阅链接是什么。
相关
DNS 泄露是什么 · 代理模式与规则 · Clash Verge 教程
常见问题
DNS 污染和 DNS 泄露有什么区别?
污染是解析结果被篡改,表现为网站打不开;泄露是解析请求走了国内 DNS,表现为隐私暴露和流媒体判定代理。污染影响能不能用,泄露影响安不安全。
开了机场为什么还会被 DNS 污染?
客户端在本地先解析了域名,拿到的是被污染的假 IP,再把假 IP 发给节点。解决办法是让远程节点解析,或用 Fake-IP 模式。
把系统 DNS 改成 8.8.8.8 能解决污染吗?
不能。污染是在传输途中注入假回复,和你问哪台服务器无关。普通 UDP 53 查询到任何公共 DNS 都可能被污染,只有加密 DNS(DoH / DoT)或在远端解析才有效。
Fake-IP 和 Redir-Host 哪个更能防污染?
Fake-IP 更彻底,因为本地根本不做真实解析。Redir-Host 要配合加密 DNS 和正确的 nameserver-policy 才能避开污染。
怎么确认是 DNS 污染而不是节点挂了?
用 nslookup 查该域名,返回的 IP 明显不属于该服务商、或多次查询结果跳来跳去,就是污染。节点挂了的话所有网站都打不开,而不是只有特定几个。
本文为信息整理与个人经验,不构成购买建议。机场政策与软件界面可能变化,以官方为准。发现过期内容请 联系纠错。