DNS 解析排查:从 dig 开始
“网站打不开”有很多可能,DNS 只是其中之一。排查时最怕东试一下西试一下,所以我习惯按固定顺序走:本机配置 → 递归解析器 → 权威服务器,每一步都用命令确认结果。下文用保留域名 example.com 演示。
1. 先确认是不是 DNS 的问题
如果直接访问 IP 正常、访问域名失败,基本可以锁定在解析环节:
ping -c 3 1.1.1.1 # 网络本身是否通
ping -c 3 example.com # 报 "Name or service not known" 多半是解析失败
注意 ping 不通不一定是网络断了,有些主机会屏蔽 ICMP。它在这里的作用主要是看域名能不能被解析成 IP。
2. 本机用的是哪个解析器
cat /etc/resolv.conf
resolvectl status # 使用 systemd-resolved 的系统
如果 resolv.conf 里只有 nameserver 127.0.0.53,说明系统使用
systemd-resolved 的本地存根,真正的上游服务器要看 resolvectl status 中各网卡的
DNS Servers 一项。
另外,应用程序实际得到的结果要经过 /etc/nsswitch.conf,也就是会先查 /etc/hosts。
dig 绕过了这一层,直接问 DNS 服务器。想看应用视角的结果,用:
getent hosts example.com
3. 读懂 dig 的输出
dig example.com A
输出比较长,重点看这几处:
- status:位于
HEADER行,表示这次查询的结果,含义见下表。 - ANSWER SECTION:真正的解析记录,第二列数字是 TTL(剩余缓存秒数)。
- SERVER:这次回答来自哪台服务器,确认问到的是不是你以为的那台。
- Query time:响应耗时,几百毫秒以上要留意解析器是否过载或线路不佳。
| status | 含义 | 下一步 |
|---|---|---|
NOERROR | 查询成功 | 若 ANSWER 为空,说明域名存在但没有该类型记录。 |
NXDOMAIN | 域名不存在 | 检查拼写,确认域名是否已注册、记录是否已添加。 |
SERVFAIL | 解析器无法得到答案 | 换解析器对比;常见于权威服务器故障或 DNSSEC 校验失败。 |
REFUSED | 服务器拒绝查询 | 该服务器不对你提供递归解析,换一个。 |
只想要结果时,加 +short 会清爽很多:dig +short example.com。
4. 换一个解析器对比
用 @ 指定服务器,分别问本地配置的解析器和几个公共解析器:
dig @1.1.1.1 example.com +short
dig @9.9.9.9 example.com +short
dig @223.5.5.5 example.com +short
如果公共解析器都正常,只有本地的不行,问题多半出在本地解析器或其上游;如果大家都失败,就继续往权威服务器那一层查。
5. 追到权威服务器
dig NS example.com +short # 查看域名的权威服务器
dig +trace example.com # 从根服务器开始逐级查询
+trace 会依次展示根、顶级域、权威服务器的应答,能看出卡在哪一级。刚修改过解析记录时,也可以直接问权威服务器,确认新记录是否已经生效:
dig @<权威服务器> example.com A +norecurse
6. 缓存与 hosts 文件
权威服务器上已经改好,但本机看到的仍是旧结果,通常是缓存还没过期,等 TTL 到期即可。着急的话可以清理本机缓存:
resolvectl flush-caches # systemd-resolved
resolvectl statistics # 查看缓存命中情况
最后别忘了检查 /etc/hosts。之前为了测试临时写进去的一行记录,很可能就是“为什么只有我这台机器解析不对”的答案。
小结
DNS 排查的关键是分层:先看本机配置,再用 dig 对比不同解析器,最后追到权威服务器。每一步都有明确的命令和判断依据,就不容易在猜测中浪费时间。