两种截然不同的使用时刻
dig / nslookup
完整协议细节,可脚本化,可离线使用
网页版工具
无需配置,支持批量查询,可分享
修复“Server DNS Address Could Not Be Found”
电话里通常是这样开头的:“网坏了,但只有一个网站打不开。”Chrome 显示一个灰色页面、一只小恐龙,还有这行字 Server DNS address could not be found,下面用小一号的字写着 DNS_PROBE_FINISHED_NXDOMAIN。其他一切都加载正常。电话那头的人已经重启过两次路由器了。
这个错误我修过太多次,多到数不清,而它几乎从不是人们担心的那个意思。Chrome 没有毛病,网站通常也没有消失。你的电脑去问网站的地址,链条上某个环节回了一句“没有这个地方”。这条链条——浏览器的缓存、操作系统的缓存、路由器、提供商的解析器——有好几个环节,任何一个都可能在说谎。全部工作就是找出是哪一个。
第一个问题:是所有人都打不开,还是只有你?
在动任何设置之前,先拿起手机。关掉 Wi-Fi,让手机用移动数据,然后打开网站。你刚刚做完了整篇指南里最有用的一个测试,因为你在五秒钟内换掉了整条网络路径。
- 网站在移动数据下能打开。 网站本身没问题。你的电脑和提供商的解析器之间有东西在给你错误答案,下面的一切都能修好它。
- 网站在那边也打不开。 再试一个你每天都用的网站。如果那个能打开,问题多半在网站那一端:域名注册过期、DNS 改动搞砸了,或者主机商拔了电源。这个你在椅子上可修不了。
- 到处全都打不开。 那就不再是这个错误了,那是连接本身的问题。问题不同,指南也不同。
如果你想得到比手机覆盖更广的同一答案,DNS 传播检查器 会查询多个国家的公共解析器,并显示它们对网站地址是否一致。如果世界各地的解析器都返回 NXDOMAIN,说明网站有真正的 DNS 问题。如果它们都痛快地返回地址,错误答案就是在离你很近的地方产生的。
这个错误到底是什么意思
DNS 就是把 example.com 这样的名字变成浏览器真正要连接的数字地址的那次查询。这个错误意味着查询不是意外地空手而归——解析器主动报告说这个名字不存在。这正是 NXDOMAIN 的含义,我们关于 NXDOMAIN 是什么意思 的讲解深入讲了这个响应本身。
最容易把人绕晕的是这一点:“不存在”既可能是关于一个已被删除网站的真实答案,也可能是你自己的设备早先缓存下来、还在反复重复的过时答案。两种情况下错误消息看起来一模一样。所以下面的修复都冲着缓存和解析器去,而不是浏览器本身——为这个重装 Chrome,就像因为一个联系人的号码变了就去买一部新手机。
把症状和原因对上号
| 症状 | 可能原因 | 快速测试 |
|---|---|---|
| 只有一个网站打不开,其他都正常 | 缓存过时或 hosts 文件里有错误条目 | 用移动数据在手机上打开网站 |
| 每个网站都报同样的错误 | 你的解析器或路由器 DNS 挂了 | 更改电脑上的解析器地址 |
| 只有连着 VPN 时才打不开 | VPN 的 DNS 坏了或被屏蔽 | 断开 VPN 并重新加载页面 |
| 昨天还好,网站搬家后就坏了 | 旧答案还缓存在离你近的地方 | 在传播检查器里检查网站 |
| 修好后过一天又坏了 | 路由器在下发一个失效的解析器 | 对比路由器和电脑的 DNS 设置 |
修复方法,按我实际尝试的顺序
刷新 DNS 缓存
在 Windows 上,打开命令提示符并运行
ipconfig /flushdns。在 Mac 上,在终端里运行sudo dscacheutil -flushcache。这会扔掉电脑保存的答案,包括那个错误答案,并强制进行一次全新查询。只需要十秒钟,也不会造成任何损害,所以它永远是我的第一步。换成公共解析器
如果刷新后毫无变化,错误答案来自更上游。把电脑的 DNS 服务器改成公共解析器,例如
1.1.1.1或8.8.8.8,然后重新加载。如果网站一下子活了过来,说谎的就是提供商的解析器:保留这个设置,或者一直用到提供商自己恢复正常。检查 hosts 文件
hosts 文件会完全覆盖 DNS。如果其中一行把网站的名字映射到了一个旧地址——是旧软件留下的、过去某次实验留下的,或者你多年前粘贴进去又忘掉的东西——换解析器也没用,因为你的电脑根本不会去问。打开这个文件,查找网站的名字,删掉你找到的任何一行,或者将其注释掉。
重启路由器,只重启一次
路由器也会缓存答案,便宜的路由器还缓存得很差。重启一次就能清掉那份缓存并重新协商连接。我说一次,是因为连着重启四次——来电者常这样坦白——效果和重启一次完全一样。
关掉 VPN 再测一次
VPN 会把你的 DNS 查询转到它自己的服务器上。如果那些服务器宕机、配置错误,或者隧道半死不活而连接还撑着,名字查询就会失败,尽管一切看起来都连着。彻底断开——不是暂停,是断开——然后重新加载页面。
人们发誓有用却很少有用的两件事
重装浏览器。浏览器确实有自己的一小份缓存,但这个错误是系统级查询失败产生的,新安装会继承同一个解析器、同一个 hosts 文件、同一个路由器。你会花二十分钟恢复书签,最后又回到那只恐龙面前。
另一件是像念咒一样重复的“等 48 小时”。等待确实能真正修好一种情况:网站最近真的改了 DNS,旧答案还在从世界各地的缓存里慢慢排干。我们关于 诊断“无法访问此网站” 的指南把这种等待和你能自己修的故障区分开来。但如果网站今天在你手机上就能打开,等下去修不好你的网络——上面的五个步骤可以,通常十分钟内搞定。
当只有一个浏览器显示此错误时
有一种变体能让人走错几个小时的弯路:网站在 Chrome 中打不开,但在同一台机器、同一个网络、同一分钟内,用另一个浏览器却能正常加载。单凭这一事实,就能一次性排除你的路由器、你的服务商和网站本身。差别就存在于浏览器内部。
现代浏览器越来越多地自己执行查询,而不是信任系统。Chrome 有一个 Secure DNS 设置,可以通过加密连接把查询发送到浏览器自己选择的解析器,绕过你电脑所配置的那个;Firefox 也有类似功能,有它自己的默认设置。如果浏览器选择的这条路径坏了——或者只是保存着一个系统其他部分早已忘记的过时答案——你就会在恰好一个程序里看到这个错误,而其他一切都正常。把浏览器的安全 DNS 设置为使用系统解析器,或者直接关掉它,就是那个两分钟就能得出结论的测试。
相反的情况同样能提供线索:所有浏览器都失败,但命令行查询却成功,这指向浏览器共有的东西——系统解析器设置、hosts 文件、网络本身。一个程序对比所有程序,是我所知定位哪一层保存着错误答案的最快方法,这也是为什么我在这类求助中的第一个问题从来不是关于设置的。而是:“是到处都失败,还是只在这里失败?”
你也可以逐个盘问解析器,而不是靠猜。像 nslookup example.com 1.1.1.1 这样的命令会向一个特定的解析器询问它的答案,忽略你的默认设置。先问你平常用的解析器,再问一个公共解析器。如果公共解析器返回了一个地址,而你的解析器返回 NXDOMAIN,你就当场抓住了说谎者——而且你也清楚剩下的工作是清缓存、等待,还是彻底改掉这个设置。
同样的故障在别处穿着不同的外衣,这让搜索帮助的人感到困惑。Android 上的 Chrome 把它叫做 ERR_NAME_NOT_RESOLVED,Firefox 说找不到服务器,Safari 则报告它找不到服务器。措辞不同,底下是同一件事:一次查询回来说这个名称不存在。如果某个指南针对其中任何一条消息给出的修复方法实际上是关于缓存或解析器的,那它同样适用于你的情况——翻译错误名称,保留方法。
当这真的不是你的问题时
有时候我在电话里的回答是:问题在他们,不在你。一个注册过期的域名会被摘掉名称服务器,地球上每个解析器都开始回答 NXDOMAIN——完全相同的错误,只是这次它说的是真话。正在迁移中的网站所有者也可能发布一条坏掉的记录,一下子让这个名字对所有人消失。
线索就是一致性。你的手机打不开,邻居的手机也打不开,我们关于 修复 Windows 的 DNS_PROBE_FINISHED 错误 的指南里的本地招数也改变不了什么——而世界各地的公共解析器都一致认为没有地址。到了这一步,关掉设置标签页吧。你这边已经没什么可修的了;网站会在所有者修好记录时回来,或者永远不会回来。
需要查看某个域名的公网 DNS 地址?使用 Domain IP Lookup 工具。
常见问题
NXDOMAIN 响应。这个答案有时是真的,比如域名过期或被移除时。同样常见的是,它是缓存、路由器、提供商的解析器或 VPN 产生的过时或错误答案,而网站本身活得好好的,从其他网络也能访问。相关阅读
四种结果,四种不同的后续处理
ERR_NAME_NOT_RESOLVED:含义与修复方法
ERR_NAME_NOT_RESOLVED 在 Chrome 中是什么意思,以及如何在电脑、Android 和 iPhone 上修复,附症状对照表和 DNS 检查方法。
四个层级,按顺序排查
DNS
解析域名
传输层
TCP 连接
TLS
证书验证
应用层
HTTP 响应
排查“无法访问此网站”:分层排障法
逐步修复“无法访问此网站”:先看错误类别,再用 dig、curl 和 openssl 依次测试 DNS、路由、TCP、TLS 和 HTTP。
四种结果,四种不同的后续处理
修复 Windows 上的 DNS_PROBE_FINISHED_NXDOMAIN:找出出问题的那一层
按顺序排查浏览器、Windows、路由器和运营商,附上具体命令,修复 Windows 上 Chrome 的 DNS_PROBE_FINISHED_NXDOMAIN 错误。