网站突然打不开了,或者被跳转到一个莫名其妙的广告页面,但用手机流量访问又一切正常。这种情况,有经验的人会立刻想到一个词:DNS污染。而排查DNS污染,最顺手的工具就是系统自带的nslookup。
nslookup不是什么高级工具,Windows、Linux、macOS都自带,不需要额外安装。它的作用很简单:向DNS服务器查询一个域名对应的IP地址。但就是这么简单的功能,配合“对比法”,就能快速判断DNS有没有被动手脚。
核心逻辑:对比法
DNS污染的本质是:你查询域名时,得到的不是真实IP,而是被中间节点篡改过的错误IP。
判断方法很直接:用本地默认DNS查一次,再用可信的公共DNS查一次,对比两个结果。如果结果不一致,且本地返回的IP明显有问题,那基本可以确认污染。
这里的关键在于“找一个可信的参照物”。Google和Cloudflare是目前最常用的公共DNS,在国内大部分网络环境下可以正常访问,返回的结果也相对可信。
第一步:查本地DNS的解析结果
打开命令提示符(Windows)或终端(Linux/macOS),输入:
nslookup 你的域名.com
以example.com为例,输出大概是这样的:
服务器: UnKnown
Address: 192.168.1.1
非权威应答:
名称: example.com
Addresses: 93.184.216.34
这里有两个关键信息:
“服务器”那一行显示的是你当前使用的DNS服务器地址。192.168.1.1通常是你家路由器的地址,说明你的查询请求先发给了路由器,再由路由器转发给运营商的DNS。如果这里显示的是8.8.8.8或1.1.1.1,说明你之前已经手动改过DNS设置。
“Addresses”那一行就是解析结果,也就是域名对应的IP地址。记下这个IP。
第二步:查公共DNS的解析结果
现在,绕开你本地的DNS服务器,直接向公共DNS发起查询:
nslookup 你的域名.com 8.8.8.8
输出会类似:
服务器: dns.google
Address: 8.8.8.8
非权威应答:
名称: example.com
Addresses: 93.184.216.34
同样记下这个IP地址。
第三步:对比结果,做出判断
现在你手上有两个IP了。对比它们:
情况一:两个IP完全一样
说明你的本地DNS解析结果是正确的,没有污染。如果网站还是打不开,问题可能出在服务器本身、本地hosts文件、或者网络路由上,跟DNS没关系。
情况二:两个IP不一样
这是DNS污染的典型特征。但先别急着下结论,还要进一步判断“哪个IP是错的”。
判断本地IP是否“有问题”的方法:
用ping测试本地DNS返回的那个IP。如果完全ping不通,或者丢包率100%,说明这个IP很可能是个无效地址。如果ping得通但延迟异常高,或者返回的是一个你根本不认识的IP(比如127.0.0.1、0.0.0.0、或者某个明显的广告服务器IP),那基本可以确认被污染了。
一个更精确的验证方法:用nslookup查询一个你确定没有被污染的域名(比如baidu.com),看看本地DNS和公共DNS的结果是否一致。如果连百度都解析出不同的IP,说明你的本地DNS整体都有问题,不只是某个特定域名被污染。
第四步:用-type参数看更多记录类型
有些污染只针对A记录(IPv4地址),不针对AAAA记录(IPv6地址)或CNAME记录。用nslookup的-type参数可以查询不同类型的记录:
nslookup -type=AAAA 你的域名.com
nslookup -type=CNAME 你的域名.com
nslookup -type=MX 你的域名.com
如果A记录被污染了,但AAAA记录返回的是正确的IPv6地址,那说明污染只影响了IPv4解析。这种情况下,如果你的网络支持IPv6,可以通过IPv6访问网站。
第五步:排除“假阳性”——先清缓存
在确认污染之前,有一个容易被忽略的干扰项:本地DNS缓存。
你的操作系统和路由器都会缓存DNS解析结果。如果之前查询过一次,拿到了被污染的IP,这个IP会被缓存一段时间(通常是几分钟到几小时)。即使后来污染消失了,你查到的还是缓存里的旧结果。
清理方法:
Windows:
ipconfig /flushdns
macOS:
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
Linux(systemd-resolved):
sudo systemd-resolve --flush-caches
清完缓存后重新执行nslookup对比。如果结果变了,说明之前是缓存问题,不是污染。
第六步:检查hosts文件
nslookup的结果会受到hosts文件的影响。如果你在hosts文件里写了某个域名的静态绑定,nslookup会优先使用hosts里的记录,而不是去查DNS服务器。
检查hosts文件:
- Windows:C:\Windows\System32\drivers\etc\hosts
- Linux/macOS:/etc/hosts
如果里面有针对目标域名的条目,删掉再重新测试。
如果确认被污染了怎么办?
短期方案:把本机DNS服务器改成公共DNS,清空缓存。如果路由器也缓存了污染结果,需要重启路由器并在路由器后台修改DNS设置。
长期方案:启用加密DNS(DoH/DoT)。Chrome和Firefox都内置了DoH功能,在设置里开启后,DNS查询会被加密传输,中间节点无法篡改。但需要注意,部分网络环境可能会屏蔽DoH服务器的IP。
如果污染发生在运营商层面,换公共DNS可能也没用——运营商可以在更上游的位置篡改解析结果。这种情况下,修改hosts文件(把正确的IP写死)或者使用代理是更直接的绕过方式。
总结:用nslookup检测DNS污染,核心就一句话:本地查一次,公共DNS查一次,对比结果。
如果两个IP不一致,且本地返回的IP明显有问题(内网地址、ping不通、陌生IP),那基本可以确认污染。先清缓存排除假阳性,再检查hosts文件排除静态绑定。确认污染后,换DNS、启用DoH、或者修改hosts文件都能解决。这个方法不需要装任何软件,Windows、Linux、macOS都能用。花两分钟做一次对比,比盲猜“是不是DNS的问题”高效得多。
相关内容
