深色模式
DNS 解析失败排查
摘要:DNS 故障常表现为"偶发超时"或"部分域名不通",容易被误判为网络问题。本文用
dig从本机缓存、递归服务器、权威服务器逐级验证,并给出 search 域、ndots、UDP 截断等高频陷阱的识别方法。
适用环境
bash
cat /etc/resolv.conf
cat /etc/nsswitch.conf | grep hosts
systemctl is-active systemd-resolved nscd 2>/dev/null
which dig nslookup getent1
2
3
4
2
3
4
排障步骤
第 1 步:确认是解析问题还是连通问题
bash
getent hosts <域名>
ping -c 2 -W 2 <已知可用IP>1
2
2
第 2 步:看本机解析器配置
bash
cat /etc/resolv.conf
resolvectl status 2>/dev/null1
2
2
注意 search 域与 options ndots:N,它们会直接放大解析请求数量。
第 3 步:dig 基本查询与结果判读
bash
dig <域名> +noall +answer
dig <域名> +stats # 看 Query time1
2
2
看 status(NOERROR/NXDOMAIN/SERVFAIL/REFUSED)与 ANSWER SECTION 是否有记录。
第 4 步:指定 DNS 服务器做对照
bash
dig @<本机DNS> <域名> +noall +answer +stats
dig @223.5.5.5 <域名> +noall +answer # 换公共 DNS 对照
dig @8.8.8.8 <域名> +noall +answer1
2
3
2
3
本机 DNS 失败、公共 DNS 成功 → 问题在本机解析器或上游链路。
第 5 步:完整追踪递归链路
bash
dig <域名> +trace1
+trace 从根服务器开始逐级查询,能精确定位是哪一级(根/TLD/权威)无响应或返回错误。
第 6 步:区分 UDP 截断与 TCP 阻断
bash
dig <域名> +ignore +bufsize=4096 # 触发大响应
dig <域名> +tcp # 强制走 TCP 531
2
2
响应超过 512 字节会转到 TCP
DNS 默认 UDP,超过 UDP 载荷时会自动改用 TCP 53。若防火墙只放行 UDP 53,就会表现为"小结果能解析、大结果超时"。务必同时放行 TCP 53。
第 7 步:抓包确认请求是否发出
bash
tcpdump -i any -nn -c 20 'port 53'1
验证
bash
dig <域名> +noall +answer +stats
getent hosts <域名>
curl -sS -o /dev/null -w 'code=%{http_code} dns=%{time_namelookup}\n' https://<域名>/1
2
3
2
3
常见坑
search 域导致解析奇慢
resolv.conf 中配置了多个 search 域时,一个短主机名会被依次拼接尝试,日志上表现为偶发秒级延迟。
ndots 过大放大请求量
默认 ndots:5 意味着域名中点数少于 5 时先拼 search 域再查原值,容器环境下会成倍放大 DNS 请求,压垮集群 DNS。
resolv.conf 被自动覆盖
systemd-resolved、DHCP、容器运行时都会重写该文件,手工修改重启后失效,应改对应组件的持久化配置。
直接把 resolv.conf 改成公共 DNS
在内网环境会导致所有内网域名解析失败,且绕过了内网 DNS 的安全与调度策略。只在对照测试时临时使用。