Linux DNS 解析故障排查:从 dig 到 resolv.conf 的完整路径

举报
yd_283936595 发表于 2026/11/13 12:57:34 2026/11/13
【摘要】 DNS 解析出问题时的表现很统一:ping 域名报「域名解析暂时失败」,curl 卡很久才超时,但直接 ping IP 却是通的。这说明网络连通没问题,故障在域名解析这一层。排查的关键是按解析的实际顺序一层层验证,而不是上来就改配置。第一步先分清「解析失败」和「解析结果不对」。用 dig 或直接打 nslookup 查目标域名,比如 dig 后面跟上要查的域名。看返回里的 status 字段...

DNS 解析出问题时的表现很统一:ping 域名报「域名解析暂时失败」,curl 卡很久才超时,但直接 ping IP 却是通的。这说明网络连通没问题,故障在域名解析这一层。排查的关键是按解析的实际顺序一层层验证,而不是上来就改配置。

第一步先分清「解析失败」和「解析结果不对」。用 dig 或直接打 nslookup 查目标域名,比如 dig 后面跟上要查的域名。看返回里的 status 字段,NXDOMAIN 是域名不存在,SERVFAIL 多半是上游递归服务器出了问题,NOERROR 但没 A 记录则可能是记录类型配错。如果 dig 直接超时,先查默认 DNS 服务器:dig 命令默认用的是 /etc/resolv.conf 里的 nameserver,可以显式指定一台公共 DNS 对比(比如 223.5.5.5),指定服务器能解、默认的不能解,问题就锁定在本机配置的 DNS 服务器上。

第二步看 resolv.conf 本身。cat /etc/resolv.conf,确认 nameserver 指向的地址是公司内网 DNS、网关还是公共 DNS,再 ping 一下这个地址确认可达。注意这个文件经常被覆盖:CentOS 上由 NetworkManager 管理,Ubuntu 18 以后由 systemd-resolved 管理,容器里是 Docker 写入的。手动改完重启或续租 DHCP 后被还原是常见现象,要改应该改 NetworkManager 的 DNS 配置或 netplan/netconfig,而不是直接改文件。resolved 系统上 resolv.conf 实际指向 127.0.0.53,这时要用 resolvectl status 和 resolvectl query 看真实生效的上游。

第三步检查本地缓存和 hosts。很多机器跑着 nscd 或 systemd-resolved,解析结果会被缓存,改完配置感觉不生效先清缓存:resolvectl flush-caches 或重启 nscd。/etc/hosts 优先级最高(由 /etc/nsswitch.conf 的 hosts 行决定,默认 files 在 dns 之前),开发机上人为写的静态映射忘了删,是「别人能解析我不能」的常见原因。遇到解析结果和 dig 不一致时,先 grep 一下 hosts。

第四步处理特殊场景。Docker 容器内解析不了,先看容器的 /etc/resolv.conf 是否继承了宿主机能用的 nameserver;容器跑在不能访问内网 DNS 的网络命名空间里也很常见。K8s 里则是看 CoreDNS 的日志和 pod 的 dnsPolicy。超时类故障注意 dig 的默认超时和重试逻辑:应用里解析慢但 dig 正常,往往是应用使用的超时太短,或 glibc resolver 的 options timeout/attempts 需要调。

最后记一个经验:把「域名解析失败」当成结果而不是原因。先 dig 指定 DNS 缩小范围,再查 resolv.conf 的来源是谁管理的,再排缓存和 hosts,最后才怀疑网络或上游。按这个顺序,绝大多数 DNS 故障五分钟内能定位到层。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。