dns 污染 DNS 污染检测方法与排查手段

DNS污染这件事,很多人第一次遇到的时候以为是网站挂了。打开一个平时常去的站,浏览器转半天然后报错,但问朋友,朋友那边一切正常。换手机流量试试,又能打开了。这种“有些人能上有些人不能上”的情况,大概率就是DNS被污染了。

要理解污染是怎么回事,得先知道DNS在干嘛。你输入一个域名,电脑得先问DNS服务器这个域名对应哪个IP。正常情况下,DNS服务器会返回一个真实的IP,你顺着这个IP去访问网站。污染的做法是在这个问答环节动手脚。你问出去的请求被人截住,塞回来一个假IP。你拿着假IP去访问,要么连不上,要么连到一个莫名其妙的地方。整个过程你完全不知情,浏览器也不会提示你“刚才有人骗了你”。

dns 污染 DNS 污染检测方法与排查手段

检测污染,最直接的办法是换不同的DNS服务器去问同一个域名,看返回结果一不一样。在Windows上打开命令行,敲 nslookup 域名 8.8.8.8,再敲 nslookup 域名 114.114.114.114,对比两次返回的IP。如果一个是正常的、你认识的IP,另一个是奇怪的、你从没见过的地址,那基本可以确认污染存在。正常解析出来的IP通常跟你网站的实际服务器一致,污染返回的往往是保留地址、境外无关IP,或者干脆是超时无响应。

用dig命令会更清楚一些。Linux和Mac上直接敲 dig @8.8.8.8 域名,看ANSWER SECTION里返回了什么。如果返回的IP跟你知道的真实IP对不上,而且TTL值特别短(比如几秒),那可能是污染的特征。污染注入的应答包通常TTL设得很小,因为它要确保你很快再去问,好继续骗你。

还有一个更省事的判断方法。找一个你知道被污染的域名,比如某些社交网站或者新闻站点,在命令行里ping一下,看返回的IP是不是你预期的。如果你预期的IP是A,返回的是B,而B这个IP你从任何正常渠道都查不到,那多半就是污染。也可以同时ping域名和直接ping真实IP,如果真实IP能通、域名不通,说明解析环节出了问题。

在线工具也能帮忙。DNS Leak Test、DNS Checker这类网站可以同时从全球多个节点查询同一个域名的解析结果。如果只有中国大陆的节点返回了异常IP,境外节点返回的都一样且正常,那污染的位置就很明显了。Cloudflare的1.1.1.1帮助页面也有一个DNS查询工具,可以对比不同解析器返回的结果。

排查的时候有几个容易混淆的地方。DNS污染和DNS劫持不是一回事。污染是给你返回假IP,劫持是直接把你引导到另一个网站。污染通常影响的是域名解析这一步,劫持可能发生在更上层。另外,本地hosts文件如果被人改过,也会造成类似污染的效果。检查一下 C:WindowsSystem32driversetchosts 或者 /etc/hosts,看有没有奇怪的条目把某个域名硬编码到一个IP上。

还有一个常见情况是本地DNS缓存的问题。你之前问过这个域名,拿到过正常IP,后来污染发生了,但你电脑里还存着旧记录。这时候你反复刷新也没用,得先清缓存。Windows上 ipconfig /flushdns,Mac上 sudo dscacheutil -flushcache,浏览器自己的DNS缓存也要清,Chrome进 chrome://net-internals/#dns 点Clear host cache。

确认污染之后,临时应对的办法有几个。换成加密DNS,比如DNS over HTTPS或者DNS over TLS。Cloudflare的1.1.1.1和Google的8.8.8.8都支持DoH,在浏览器或者系统设置里开启之后,你的DNS请求会加密传输,中间人看不到你在问什么,也就没法精准地塞假应答。Firefox和Chrome都内置了DoH开关,在设置里搜“DNS over HTTPS”就能找到。另一个办法是直接用IP访问,绕过DNS解析。前提是你知道正确的IP地址,而且网站没有做基于域名的虚拟主机托管。大多数现代网站都有SNI检查,直接拿IP访问可能会被拒。

长期来看,污染是一个网络层面的问题,普通用户能做的有限。加密DNS是目前最实际的缓解手段,但它解决的是“别人看不到你问什么”的问题,如果污染发生在更底层的环节,效果也会打折扣。检测和排查的意义在于,让你在遇到访问异常的时候能快速判断问题出在哪一段,而不是对着浏览器干瞪眼。知道是污染之后,至少能换个思路绕过去,或者换个网络环境继续干活。

免责声明:本文提供的方法与建议仅供技术参考,实际部署效果受机房环境、运营商线路、系统配置等多重因素影响。请在专业人员指导下操作,因自行操作导致的业务损失本站不承担责任。