DNS 返回 SERVFAIL 的定位与修复
dig 的返回状态是 status: SERVFAIL,nslookup 报 server can't find 或 SERVFAIL,应用侧表现为 Temporary failure in name resolution、server misbehaving 或解析超时。SERVFAIL 不是“域名不存在”,它表示解析器无法完成这次查询:可能是权威服务器不可达、委派配置错误、DNSSEC 校验失败、传输受阻,或解析器自身资源不足。
要和 NXDOMAIN 区分开:NXDOMAIN 是权威服务器明确回答“这个名字不存在”,通常不需要继续排查链路;SERVFAIL 则是没有拿到可用答案,必须继续定位。SERVFAIL 也可能来自缓存中的旧失败结果,失败缓存有效期内重复查询会持续失败,必要时清缓存后再验证,但清缓存不是根因修复。
先确认影响范围,再逐层查询:
dig example.com
dig +short example.com
dig @<resolver> example.com
dig @8.8.8.8 example.com
dig +trace example.com
dig NS example.com
dig SOA example.com
dig +norecurse @<auth-ns> example.com
检查 DNSSEC 和传输:
dig +dnssec example.com
dig +cd example.com
dig +tcp example.com
dig +bufsize=512 example.com
dig +dnssec 仍然失败、dig +cd 能成功,通常说明 DNSSEC 验证有问题。+tcp 成功、UDP 失败,常见于大响应被丢或 UDP 53 受限。如果所有域名都 SERVFAIL,先检查 /etc/resolv.conf 和本机解析器;如果只有某个域失败,再查该域的委派、权威服务和 DNSSEC。
本机解析器:
resolvectl status
cat /etc/resolv.conf
journalctl -u systemd-resolved --since '30 min ago'
Kubernetes 集群内:
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
kubectl get svc,endpoints -n kube-system kube-dns
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100
kubectl run -it --rm dnstest --image=<debug-image> --restart=Never \
-- nslookup kubernetes.default
集群内只有内部域名失败、外部域名正常,重点查 CoreDNS 的 kubernetes 插件和 API 连通性;只有外部域名失败,重点查 forward 上游和出站网络。
dig +trace 跟随委派链,直接查询各级权威服务器;如果权威本身不响应,修 NS、glue 和权威服务。+cd 只用于诊断,不能作为长期关闭校验的方案。合上页面,先回答,再展开对照。
SERVFAIL 和 NXDOMAIN 的含义有什么不同?dig +dnssec 返回 SERVFAIL,但 dig +cd 能解析成功,说明什么?SERVFAIL 表示解析器无法完成查询,可能是权威不可达、委派错误、DNSSEC 失败、传输受阻或解析器资源问题;NXDOMAIN 是权威服务器明确回答该名称不存在。+cd 只用于诊断,不能长期关闭校验。
小程序版
微信扫码,随时查命令