linux dns故障排查需分层验证:先测网络连通性(ping 8.8.8.8/114.114.114),再查resolv.conf及networkmanager配置,接着验证udp/tcp 53端口,用dig @dns +trace深度诊断,最后检查systemd-resolved/nscd缓存与nsswitch.conf解析顺序。

Linux DNS 故障排查核心在于“分层验证”:先确认网络通路是否畅通,再逐级检查配置、服务、协议和解析过程。不跳步、不假设,每一步都有明确的验证信号。
查网络连通性与基础配置
很多所谓“DNS问题”其实卡在第一步——根本没连上网。先执行:
- ping -c 4 8.8.8.8:验证能否到达公网IP,排除网关、路由、物理链路问题
- ping -c 4 114.114.114.114:测试国内常用DNS服务器可达性
- cat /etc/resolv.conf:确认 nameserver 行存在且IP有效;注意某些系统(如使用 NetworkManager 的发行版)会动态覆盖该文件,直接编辑可能无效
- nmcli dev show | grep DNS(若用 NetworkManager):查看实际生效的DNS设置
测DNS端口与服务响应
DNS依赖53端口(TCP/UDP),防火墙或中间设备常拦截UDP 53。验证方法:
- nc -zv -u 8.8.8.8 53:测试UDP 53是否开放(DNS查询主用UDP)
- telnet 8.8.8.8 53 或 nc -zv 8.8.8.8 53:测试TCP 53(用于大响应或区域传输)
- 若失败,检查本地 iptables/nftables 规则,或尝试临时关闭防火墙(systemctl stop firewalld)快速验证
用 dig 深度诊断解析链路
nslookup 提示简略,dig 能暴露完整路径。关键命令:
- dig @8.8.8.8 baidu.com:绕过本机配置,直连公共DNS,判断是否为本地DNS服务器故障
- dig +trace baidu.com:显示从根域(.)→顶级域(com.)→权威服务器的完整递归路径,定位卡在哪一级
- 重点看输出中的:status(NOERROR/SERVFAIL/NXDOMAIN)、SERVER(实际查询的DNS)、ANSWER SECTION(是否有结果)
查系统解析机制与缓存
现代Linux常启用 systemd-resolved 或 nscd,它们可能干扰原始配置:
- systemd-resolve --status:查看当前 resolver 状态及上游DNS
- sudo systemd-resolve --flush-caches:清空 systemd-resolved 缓存
- grep ^hosts /etc/nsswitch.conf:确认是否含 dns(如 hosts: files dns),否则即使 resolv.conf 正确也不走DNS
- 若使用 nscd:sudo systemctl restart nscd










