← 全部笔记
DNS 排查:一次解析到底经过了谁
「域名解析有问题」这句话下面其实藏着好几种完全不同的故障:
记录没配、TTL 还没过期、本机 /etc/hosts 挡了、或者解析器本身不可用。
要分清,就得知道一次解析经过哪些角色。
一、两类服务器
-
递归解析器(recursive resolver):你电脑配置的那个(运营商 DNS、
8.8.8.8、223.5.5.5)。它负责替你把问题问到底,并把结果缓存起来。 - 权威服务器(authoritative):域名的 NS 记录指向的那台,保存着真正的记录。 它只回答自己负责的域,不做转发。
递归解析器找不到缓存时,会从根开始逐级问:
根服务器 → 问 "com 的权威在哪"
.com → 问 "example.com 的权威在哪"
example.com 的权威 → 给出 A 记录
这条链路可以用 dig +trace 完整看到,排查「到底哪一级不对」时非常有用。
二、常见记录类型
| 类型 | 作用 |
|---|---|
A / AAAA |
IPv4 / IPv6 地址 |
CNAME |
别名,让解析转到另一个名字上 |
MX |
邮件服务器,带优先级数字,小的优先 |
TXT |
任意文本,常用于域名验证、SPF |
NS |
这个域由哪几台服务器负责 |
CAA |
只允许哪些 CA 给这个域签证书 |
CNAME有一个硬规则:同一个名字上不能再有别的记录(DNSSEC 相关记录除外)。 所以example.com若已有一条CNAME,就不能同时挂MX和TXT—— 这是很多人给根域加 CDN 后邮件收不到的原因。
三、dig 怎么读
dig example.com A # 默认问本机配置的解析器
dig @8.8.8.8 example.com A # 指定解析器
dig @ns1.example.com example.com A # 直接问权威(跳过缓存)
dig example.com A +short # 只要答案
dig +trace example.com # 从根开始逐级追踪
输出里这几个字段值得看:
status: NOERROR正常。若ANSWER: 0,说明名字存在但没有这类记录。status: NXDOMAIN这个名字不存在。status: SERVFAIL解析器自己出了问题(上游超时、DNSSEC 验证失败等),不是域名没配。;; SERVER:实际回答你的是哪台,确认有没有走你预期的解析器。- 记录后的数字(如
300)是剩余 TTL,秒。
四、NXDOMAIN 和「查到了但空」不是一回事
这一条能把排查方向直接分开:
- NXDOMAIN:这个名字在权威上根本不存在 → 记录没加,或者名字拼错了。
- NOERROR + ANSWER 0:名字存在,但没有你要的那类记录 → 比如只配了
A没配AAAA,查 AAAA 就是这个结果。
还有第三种:返回了记录但指向 0.0.0.0 或内网地址——那是有人故意用解析层做拦截,
不是 DNS 故障。
五、TTL 与「改了不生效」
TTL 的单位是秒,表示「这个答案最多可以被缓存多久」。 改记录之前如果原来的 TTL 是 86400(一天),那么旧值最长会留一天——所以变更前一天就该把 TTL 调小:
# 变更前:把 TTL 降到 300,等旧 TTL 自然过期
example.com. 300 IN A 203.0.113.10
# 变更后再按需调回
另外几个会挡住「新记录」的地方,按发生频率排:
- 本机
/etc/hosts(Windows 是C:\Windows\System32\drivers\etc\hosts)里有旧条目。 - 系统或浏览器自己的 DNS 缓存。
- 递归解析器缓存还没到期的旧答案。
- 权威服务器有多个、其中一个还没同步(serial 不一致)。
# 清本机缓存
sudo systemd-resolve --flush-caches # 或 sudo resolvectl flush-caches
# 看权威的 serial 是否一致(改过应当递增)
dig @ns1.example.com example.com SOA +short
dig @ns2.example.com example.com SOA +short
六、一个实用的排查顺序
dig @权威服务器 域名 类型—— 记录本身对不对。dig @8.8.8.8 域名 类型—— 公共解析器怎么看(有没有缓存旧值)。dig 域名 类型—— 本机配置的解析器怎么说。- 三级结果不一致,问题就落在缓存或那一级解析器上,而不是记录配置。
一句话总结:先 dig 权威服务器确认记录本身对不对,再看递归解析是不是缓存了旧值;NXDOMAIN 是「没这个名字」,空回答是「有名字没这类记录」。