DNS 看起来只是「名字变 IP」,实际是一条多层协作流水线。研讨排障时,我习惯把它拆成三个角色:
- Stub Resolver:操作系统/浏览器侧的轻量查询端;
- Recursive Resolver:替客户端跑完查询过程并缓存结果;
- Authoritative Server:对某区域数据有最终发言权的服务器。
一次典型解析
访问 www.example.com 时,若缓存未命中,递归服务器大致会:问根 → 获知 .com 的 TLD → 再问 TLD 获知 example.com 权威 → 最后问权威拿到 A/AAAA。中间任意一跳延迟或错误,都会表现为「网站打不开」,但根因完全不同。
常见故障分层
- 本地 Stub:错误的 DNS 服务器配置、公司代理劫持、Hosts 残留。
- 递归层:缓存了旧答案(TTL 未到期)、UDP 被防火墙限制、DoH/DoT 策略不一致。
- 权威层:记录漏改、NS 不一致、DNSSEC 验证失败导致 SERVFAIL。
实用排查顺序
# 看系统解析到什么
dig www.example.com +short
# 指定公共递归,排除本机
dig @1.1.1.1 www.example.com
# 追问权威与链路
dig www.example.com +trace
若公共递归正常而本机异常,问题多半在 Stub 或本地中间盒;若权威 trace 中某级异常,就沿着 NS 委托往下修。
研记要点:DNS 问题优先「分层定位」,不要一上来改业务代码或重装客户端。