Linux DNS解析失败需逐层排查:先检查/etc/resolv.conf中nameserver配置及可达性,再验证nsswitch.conf解析顺序与hosts文件干扰,最后排查systemd-resolved等本地缓存或代理影响。

Linux 系统出现 DNS 解析失败,通常表现为 ping、curl、wget 等命令无法通过域名访问网络,但 IP 地址直连正常。核心问题在于系统未能正确将域名转换为 IP 地址,需从解析路径的各个环节逐一排查。
检查 /etc/resolv.conf 配置是否有效
这是 Linux 域名解析的起点。系统默认读取该文件中的 nameserver 行来获取 DNS 服务器地址。
- 运行
cat /etc/resolv.conf,确认至少有一行以nameserver开头,且 IP 地址可路由(如8.8.8.8、114.114.114.114或内网 DNS) - 注意:若使用 NetworkManager 或 systemd-resolved,该文件可能被自动覆盖或指向本地 stub(如
127.0.0.53),此时需进一步查实际上游 DNS - 临时测试可手动修改(需 root 权限):
echo "nameserver 8.8.8.8" > /etc/resolv.conf,再试解析
验证 DNS 服务是否可达且响应正常
即使配置了 nameserver,也可能因网络不通、防火墙拦截或 DNS 服务宕机导致失败。
- 用
dig google.com @8.8.8.8或nslookup baidu.com 114.114.114.114直接向指定 DNS 发起查询,绕过系统缓存和配置链路 - 若超时,说明网络层无法到达该 DNS(检查路由、iptables/nftables 规则、云平台安全组)
- 若返回
SERVFAIL或REFUSED,可能是 DNS 服务异常或拒绝递归查询
确认 nsswitch 和解析库行为是否符合预期
Linux 通过 /etc/nsswitch.conf 决定主机名解析顺序(如先查 files 再查 dns),并依赖 glibc 的 resolver 库实现 DNS 协议。
- 查看
cat /etc/nsswitch.conf | grep hosts,典型应为hosts: files dns;若误配为hosts: dns且 DNS 不可用,将完全无法解析 - 检查是否有自定义的
/etc/hosts条目干扰(如错误映射了目标域名到 127.0.0.1) - 用
getent hosts example.com测试完整解析链路(触发 nsswitch + resolver),比 ping 更底层、更可靠
排查本地 DNS 缓存与代理干扰
systemd-resolved、dnsmasq、NetworkManager 或代理工具(如 privoxy、squid)可能劫持 DNS 请求,造成静默失败。
- 查 systemd-resolved 状态:
systemctl is-active systemd-resolved;若启用,其监听在127.0.0.53:53,用resolvectl status查当前上行 DNS - 查 dnsmasq:
ps aux | grep dnsmasq,确认是否在转发或缓存,配置文件通常为/etc/dnsmasq.conf - 检查环境变量:
echo $DNS、echo $http_proxy,某些程序(如 curl)会受 proxy 设置影响 DNS 解析行为











