DNS_PROBE_FINISHED_NXDOMAIN怎么解决?服务器应答了却说查无此人,先分清一个网站还是全部

上礼拜三早上,书房那台台式机开一个常去的网站,Chrome地址栏底下蹦出来一串大写字母——DNS_PROBE_FINISHED_NXDOMAIN。别的网站全正常,就它一个打不开,转了半分钟还是这行字。
我第一反应是网站挂了。掏出手机关掉WiFi用流量开同一个站,秒开。这下有意思了:网站活得好好的,是我家这台机器问路的时候,拿回来一个「查无此人」的错误答案。
先分清:这行报错和「服务器未响应」是两种病
这串字母得分两截读。DNS_PROBE_FINISHED是前半截,意思是「DNS这趟查询办完了」;真正定病的是尾巴上那个NXDOMAIN,翻译成人话:域名不存在。注意,是「办完了、答案是没有」,不是「没办成」。
我之前写过DNS服务器未响应那篇,那是对面电话没人接,等了半天超时。而这个NXDOMAIN是电话打通了,对面明确回了句「没这个人」。看着像双胞胎,病根完全两码事,一个查链路通不通,一个查答案对不对。浏览器把DNS这边的毛病报得比Windows疑难解答还细,同一家族还有个兄弟叫DNS_PROBE_FINISHED_NO_INTERNET,那个是真断网了,别弄混。
| 报错 | 问路的下场 | 病根方向 |
| DNS服务器未响应 | 打电话没人接,超时 | 链路断了,DNS服务器够不着 |
| DNS_PROBE_FINISHED_NXDOMAIN | 接了,答「查无此人」 | 答案本身错了,或者域名真没有 |
「查无此人」这四个字在DNS协议里有正式编号,叫rcode 3。DNS每笔回答都带一个状态码,0是有答案,3是名字不存在——跟HTTP那边404是同一种设计思路,服务器没坏,它只是告诉你找不到。
为什么手机流量能开、家里WiFi打不开
这是整件事里最值钱的线索。手机流量走的是运营商基站的DNS,家里电脑走的是路由器这级——两边的问路通道不一样,答案不一样,说明错答案是我家这条链路上的人给的。
我拿脚本实际问了一轮,把「真没有的域名」和「正常域名」的回答摆在一起对比。问一个瞎编的域名bucunzai-test-9x8y7.shunot.com,阿里DNS 97毫秒、腾讯DNS 162毫秒,两家的回答一模一样:rcode 3,答案条数0。问正常的www.baidu.com,14毫秒就回,rcode 0,带俩IP门牌。这套对比后面定位还要用,先记着。
那错误答案是谁塞给我的?家用网络里能干出这事的角色就三个:电脑自己的记事本(缓存)、路由器的代办、还有真·DNS服务器。一个个排。
最省事的两下:清两本抄错答案的记事本
电脑问路有个习惯——问到的答案会抄在本子上,下次直接翻本子不再问。麻烦在于,「查无此人」这种失败答案它也抄。头天晚上这个网站的DNS真抽过风,我的电脑把「查无此人」记在本子上,第二天网站明明缓过来了,电脑还照着本子念错答案。这个东西有个正经名字叫负缓存,连错误答案带有效期一起缓存,有效期不过期,它就一直念。
所以先清两本本子。第一本在浏览器里:Chrome地址栏敲chrome://net-internals/#dns,页面上一个Clear host cache按钮,点一下。第二本在系统里:Win键加R,敲cmd回车,粘一句ipconfig /flushdns,看到「已成功刷新DNS解析缓存」就行。浏览器缓存和系统缓存是两层,各清各的,只清一层经常白干。
我那天清完两本,网站当场就开了。但要是一两小时后接着犯,或者压根没治好,说明错答案不在本子上,是每次现问现错的,往下挖。
只有一个网站报:四个来路对号
单个网站打不开、其它全正常,是NXDOMAIN里最常见的一类。四个来路,我对着号入座:
第一个,域名打错了或者真没有。我把www.baidu.cmo(结尾打错成cmo)拿去问阿里DNS,56毫秒,rcode 3——拼错和不存在是一个下场,DNS分不出来。地址栏自动补全有时候会帮你「记住」一个错域名,越熟越容易栽。碰到只有某一个网站永远打不开,先把域名一个字母一个字母过一遍。
第二个,负缓存。就是上面说的那本错答案记事本,网站临时故障时你恰好访问过,就把错答案记下了。清缓存两下能治,或者放着等负缓存过期,一般几分钟到几小时。
第三个,内网域名拿到家里问。上班的人对这类最熟:公司内部系统的域名只在公司自己的DNS里登记,公网DNS根本没这一号。人到家VPN忘了连,直接敲公司系统网址,浏览器报的就是NXDOMAIN——公网DNS答「查无此人」答得没毛病,连上VPN走公司的问路通道才认。判断方法也简单:这网站在公司能开、在家开不了,九成是这事。
第四个,路由器在背后拦人。家用路由器的「上网控制」「家长控制」里有按域名拉黑的功能,实现方式就是路由器的DNS代办对黑名单域名直接回一个「查无此人」,跟真DNS没关系。我之前写屏蔽网站那篇讲过这套拦截的层次。家里有人动过路由器后台的,去设备管理或者上网控制里翻翻黑名单。
全部网站都报:问题升级了
要是每个网站都报NXDOMAIN,微信还能发(还是那个道理,长连接不用问路),那病根就俩。
一个是DNS地址被改错了。手滑把DNS填成了一个不是DNS的东西,或者某些软件改完没还原,它对着你的问路请求回些驴唇不对马嘴的东西。进网卡设置或者路由器后台看DNS那一栏,小米在常用设置→上网设置最底下,水星藏在WAN口高级参数里,该填223.5.5.5和119.29.29.29的就填回去。
另一个是路由器DNS代办卡死了。路由器默认替全家问路,它要是卡在一个「逢问必答查无此人」的状态,全家设备集体遭殃。拔电三十秒再插回,再把DNS钉死成上面那两个公共地址,基本断根。顺带防一手运营商抢答的进阶玩法是加密DNS,另开一篇写过。
十秒定位法:两连问加一个对照
收尾把整套排查收成一套固定动作。Win键加R敲cmd,问两句话,再用手机做个对照:
第一问,nslookup 打不开的域名,用电脑默认的DNS问。第二问,nslookup 打不开的域名 223.5.5.5,绕开默认通道直接问阿里。nslookup输出怎么逐行看我写过专门一篇,这里只看有没有答案,不看别的字段。第三下,手机关WiFi用流量开同一个网站。
| 两连问的结果 | 说明 | 下一步 |
| 默认查无、223.5.5.5有答案 | 错答案是本机或路由器给的 | 清两层缓存,再查路由器拦截 |
| 两问都答查无 | 域名真没有,或被DNS污染 | 核对拼写;公司域名就连VPN |
| 两问都有答案、浏览器还是打不开 | DNS没问题,卡在浏览器层 | 查浏览器缓存和代理残留 |
手机流量对照是给两问都查无的情况兜底:流量能开说明域名活着,是家里这条链路被污染或者被拦;流量也打不开,大概率域名本身的事,别在自己设备上瞎折腾了。
这法子不只治NXDOMAIN。哪天浏览器又蹦出DNS_PROBE_FINISHED别的尾巴,或者网络直接被标成未识别,先跑一遍两连问,答案落在哪一格,病根就定在哪一层。我那台台式机最后定位就是负缓存加浏览器那本记事本,两下清完,五分钟收工。
