← 全部文章

· 阅读约 6 分钟

网站打不开时如何检查 DNS

网站无法加载时,DNS 往往是最先需要确认或排除的环节。本文介绍应该查询哪些记录、对比哪些解析器,以及如何区分真正的 DNS 故障和本地问题。

先确认是不是 DNS 问题

浏览器通常会提示域名解析失败。在 Chrome 和 Edge 中,ERR_NAME_NOT_RESOLVED 或 DNS_PROBE_FINISHED_NXDOMAIN 这类错误指向 DNS。而 ERR_CONNECTION_TIMED_OUT、ERR_CONNECTION_REFUSED 或证书警告说明域名已经解析成功,问题出在后续环节:服务器、网络或 TLS。

在命令行中,curl 可以显示它实际连接的地址:

curl -v -o /dev/null https://example.com/

如果 curl 报告 Could not resolve host,说明在你的系统上解析失败。如果它输出类似 Trying 203.0.113.10:443 的行,随后卡住或报错,说明 DNS 已经完成了它的工作,应该转而排查服务器或网络。

查询关键记录

使用 dig 或 nslookup 逐一查询浏览器所依赖的记录类型:

dig example.com A +short
dig example.com AAAA +short
dig www.example.com CNAME +short
dig example.com NS +short
nslookup -type=AAAA example.com
  • A / AAAA:返回 IPv4 和 IPv6 地址。确认它们指向当前的主机或 CDN。迁移后遗留的过期 AAAA 记录是“我这里正常、部分访客打不开”的典型原因,因为支持 IPv6 的客户端通常会优先使用它。
  • CNAME:把一个名称设为另一个名称的别名。CNAME 不能与同名的其他记录共存,因此不允许出现在区域顶点(即 example.com 本身);许多 DNS 服务商为此提供 ALIAS、ANAME 或 CNAME 展平(flattening)等替代方案。
  • NS:列出权威域名服务器。如果它们不是你编辑区域所在的服务器,你做的修改永远不会生效。

去掉 +short 后,dig 还会显示响应的 status、头部标志位以及接下来需要用到的 TTL。

对比公共解析器与权威服务器

每个解析器各自独立缓存,因此在一段时间内返回不同结果是正常的。先询问几个公共解析器,再询问“权威来源”(把 ns1.example.net 替换为 dig NS 返回的名称):

dig @1.1.1.1 example.com A
dig @8.8.8.8 example.com A
dig @ns1.example.net example.com A +norecurse
dig example.com A +trace

权威服务器反映的是区域当前的实际内容;注意查看头部中的 aa(authoritative answer,权威应答)标志。dig +trace 从根服务器开始,沿着每一级委派一直查到你的区域,从而绕过递归缓存,并暴露委派问题,例如 TLD 仍指向旧的域名服务器。

如果权威服务器返回新值,而某个公共解析器返回旧值,那么并没有故障:该解析器只是仍在使用缓存副本。如果权威服务器返回的值本身就是错的,就需要修正区域配置。

读懂错误:NXDOMAIN、SERVFAIL 还是超时

  • NXDOMAIN:该名称不存在。检查是否有拼写错误、缺少记录(常见的是 www)、域名已过期,或区域并没有委派到你以为的地方。
  • NOERROR 但应答为空(通常称为 NODATA):名称存在,但没有所请求类型的记录,例如对仅支持 IPv4 的主机查询 AAAA。
  • SERVFAIL:解析器无法获得可用的应答。常见原因包括权威服务器宕机或未配置该区域(即“跛脚委派”,lame delegation),以及 DNSSEC 验证失败。如果只有加上 +cd(关闭验证检查)才能查询成功,请检查 DS 和 DNSKEY 记录。
  • REFUSED:服务器拒绝回答,通常是向某台权威服务器查询了它并不托管的区域。
  • 超时(connection timed out; no servers could be reached):完全没有回复。要么服务器不可达,要么防火墙拦截了 53 端口上的 DNS 流量;换一个解析器试试,就能判断是哪一种。

TTL、缓存与所谓的“传播”

每条 DNS 记录都有一个以秒为单位的 TTL(生存时间),由管理该区域的一方设置。获取到该记录的解析器最多可以将其缓存这么长时间。查询递归解析器时,dig 显示的 TTL 是该记录在其缓存中的剩余时间。

因此,DNS 变更并不是向外“扩散”的。区域一更新,权威服务器就会提供新值,而每个解析器会继续用缓存副本作答,直到副本过期。人们所说的“传播”,其实就是缓存过期。实际操作中:

  • 在计划变更之前,至少提前一个旧 TTL 周期把 TTL 调低(例如 300 秒),变更完成后再调回去。
  • 否定应答同样会被缓存。如果在你创建某个名称之前就有人查询过它,NXDOMAIN 可能会被缓存一段时间,时长由区域的 SOA 记录决定。
  • 在注册商处更换域名服务器,修改的是父区域(TLD)中的 NS 记录,其 TTL 通常为一天或更长,且不受你控制。
  • 操作系统和浏览器也各有自己的缓存。

排除本地原因

dig 和 nslookup 直接查询 DNS 服务器。而浏览器走的是操作系统解析器,它还会读取 hosts 文件和本地缓存。如果 dig 的结果正确,浏览器却仍然打不开,请检查:

  • hosts 文件:macOS 和 Linux 上是 /etc/hosts,Windows 上是 C:\Windows\System32\drivers\etc\hosts。一条遗忘的测试条目会完全覆盖 DNS。getent hosts example.com(Linux)或 dscacheutil -q host -a name example.com(macOS)可以显示系统解析器返回的结果。
  • VPN 与企业网络:VPN 可能下发自己的 DNS 服务器或分流 DNS 规则。在开启和关闭 VPN 的情况下分别对比 scutil --dns(macOS)、resolvectl status(Linux)或 ipconfig /all(Windows)的输出。
  • 浏览器的 DNS over HTTPS:Chrome、Edge 和 Firefox 可以使用各自的加密解析器,因此浏览器的结果可能与系统不一致。检查“安全 DNS”设置;在基于 Chromium 的浏览器中,可以在 chrome://net-internals/#dns 清除主机缓存。
  • 本地缓存:使用 sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder(macOS)、ipconfig /flushdns(Windows)或 resolvectl flush-caches(systemd-resolved)清空缓存。

快速检查清单

  1. 查看浏览器错误:是域名解析失败,还是 DNS 成功之后的连接或 TLS 错误?
  2. 分别查询顶点域名和 www 的 A、AAAA 和 CNAME 记录。
  3. 确认 NS 记录指向你编辑区域所在的服务商。
  4. 对比 1.1.1.1、8.8.8.8 以及使用 +norecurse 查询的权威服务器的结果。
  5. 记下响应状态:NXDOMAIN、NODATA、SERVFAIL、REFUSED 还是超时。
  6. 在断定变更“还没传播”之前,先查看剩余 TTL。
  7. 排除 hosts 文件、VPN、浏览器 DNS over HTTPS 和本地缓存的影响。

用 WebTraceCheck 检查

如果想从你自己的网络之外再看一次,WebTraceCheck 无需注册账号即可发起 DNS 或网站检查。其网站审计会检查 DNS、HTTP 响应、重定向和技术 SEO,并为每条观察结果注明来源和测量局限。如果要在真实浏览器中复现问题,同时避开本机的 hosts 文件、VPN 和本地缓存,可以使用 GitHub 登录并打开一个临时云浏览器,自行选择浏览器引擎、地区和设备模式。