首页/网络/协议速查/DNS 解析故障排查流程
DNS 与域名解析60 条

DNS 解析故障排查流程

从「客户端实际拿到什么」出发逐层往上:NSS/hosts → 本机解析器 → 递归器 → 权威 → 委派/DNSSEC,每一步都可单独验证。

协议速查网络更新于 2026-10-13

从客户端视角逐层向上

排查解析故障最忌讳上来就改配置。合理的顺序是先确认客户端实际拿到什么,再一层层向上验证:应用的查询入口、本机解析器配置、递归器返回结果、权威服务器的回答,最后核对整条委派链路。每一层都能单独测试,因此可以很快把范围收敛到某一层,而不是在整条链路上凭感觉猜。

五步排查

五步排查
getent hosts www.example.com                        # 1 应用视角:与程序实际调用同一套解析入口
cat /etc/nsswitch.conf | grep hosts                  # 2 看解析顺序:files 与 dns 谁在前
resolvectl status 2>/dev/null | head -20             # 3 本机解析器配置与当前使用的上游
dig @8.8.8.8 www.example.com +short                  # 4 递归器视角:公共解析器能否得到答案
dig +norecurse @ns1.example.com www.example.com A    # 5 权威视角:直接问该域的权威服务器
dig +trace www.example.com | tail -20                # 6 全链路委派:从根一路看到权威

现象与最可能层级

现象定位方向先做什么
ping 域名失败但 dig 正常应用或 NSS 或 hosts 层用 getent 复现,检查 hosts 与 nsswitch
所有域名解析都慢本机 DNS 超时或网络问题换一个上游解析器对比,抓包看是否超时
单个域名 SERVFAIL该域权威或 DNSSEC 配置异常直连权威查询并检查 DNSSEC 链
换网络后恢复正常本地递归器被污染或被劫持对比默认解析器与公共解析器结果
新记录迟迟不生效负缓存或旧 TTL 尚未过期查各级缓存剩余时间并等待或刷新
只在部分客户端失败客户端缓存或分流策略差异分别在两端执行 getent 与 dig 对比

典型使用场景

  • 业务上线后域名解析失败,需要快速判断是权威未生效还是客户端缓存
  • 跨运营商访问异常的定位,比较不同上游解析器的返回差异
  • 邮件投递异常时确认 MX 记录与 SPF 相关记录是否正确下发
  • 排查间歇性解析失败,判断是否由 DNSSEC 校验失败引起
  • 迁移解析服务商时验证新旧权威返回是否一致

dig 输出读法

字段含义怎么看
statusNOERROR 与 NXDOMAIN 与 SERVFAIL 与 REFUSEDSERVFAIL 往上游查,REFUSED 说明对方拒绝递归
ANSWER SECTION最终答案记录与 TTL与预期值逐个核对,注意 TTL 剩余秒数
AUTHORITY SECTION权威服务器与 SOA 信息判断答案来自缓存还是权威
ADDITIONAL SECTION附加记录,如 NS 的地址排查粘合记录缺失时看这里
query time查询耗时明显偏高常见于上游超时后重试
SERVER实际应答的服务器地址确认到底问的是谁,别误读结果
对比「指定公共解析器」与「使用系统默认解析器」的结果差异,是判断污染与劫持最快的一刀;两者不一致时,问题多半出在本地递归器或链路上的中间设备。
排查顺序上先固定结论再动配置:确认每一层的实际返回之后,再决定改哪一层。多改一处会让下一次验证失去对照,反而延长故障时间。

易错点

  • 把「换成公共解析器就好了」当成最终方案,没有查清默认解析器为什么异常,换一台机器后会再次出现
  • 只用 dig 验证而不用 getent 复现,忽略 hosts 文件与 NSS 顺序带来的差异,业务程序与命令行看到的结果并不相同
  • 忽略负缓存:删掉记录后仍然返回 NXDOMAIN,以为权威没生效,实际是各级缓存还在记住否定结果
  • 同时修改权威、递归器与客户端配置,出问题后无法判断改动是否生效,排查周期被拉长

数据来源与参考

  • RFC 1034
  • 企业级 DNS 运维实践

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌