
Linux 系统出现 DNS 解析失败,通常表现为 ping www.example.com 报 Unknown host,或 curl、wget 无法访问域名,但用 IP 地址可以正常通信。问题核心在于系统未能正确将域名转换为 IP 地址,需从配置、服务、网络三方面逐层排查。
检查 /etc/resolv.conf 是否有效
该文件是 Linux 解析 DNS 的核心配置,定义了使用的 DNS 服务器地址。
- 运行
cat /etc/resolv.conf,确认至少含有一行nameserver,例如:nameserver 8.8.8.8或nameserver 114.114.114.114 - 若为空、被注释、或指向本地不可达地址(如
127.0.0.53但 systemd-resolved 未运行),解析必然失败 - 注意:某些发行版(如 Ubuntu 18.04+)使用
systemd-resolved管理该文件,手动修改可能被覆盖;应改用resolvectl或配置/etc/systemd/resolved.conf
验证 DNS 服务是否正常运行
即使 resolv.conf 正确,后端 DNS 服务异常也会导致解析中断。
- 若使用
systemd-resolved:执行systemctl status systemd-resolved,确保状态为active (running);再运行resolvectl status查看当前上行 DNS 服务器和链路状态 - 若使用
dnsmasq或bind:检查对应服务状态,如sudo systemctl status dnsmasq - 临时绕过本地服务测试:直接用
dig @8.8.8.8 google.com或nslookup github.com 114.114.114.114,若成功说明本地 DNS 服务或转发链路异常
确认网络连接与防火墙限制
DNS 查询依赖 UDP 53 端口(偶尔 TCP 53),网络不通或策略拦截会导致超时或无响应。
- 用
ping -c 3 8.8.8.8测试基础连通性;若不通,先解决路由或网卡问题 - 用
nc -zv 8.8.8.8 53或timeout 3 bash -c 'echo > /dev/tcp/8.8.8.8/53' 2>/dev/null && echo ok || echo fail检查 53 端口是否可达 - 检查本机防火墙:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-all(CentOS/RHEL),确认未屏蔽出站 UDP 53 - 企业或校园网络可能劫持或过滤公共 DNS,可尝试更换为 DoH(如
cloudflare-dns.com)或切换至内网指定 DNS
排查 NSS 与解析顺序配置
Linux 使用 /etc/nsswitch.conf 决定主机名解析的优先级来源(如 files、dns、mdns4)。
- 查看关键行:
host: files dns表示先查/etc/hosts,再走 DNS;若误写为host: files,则完全跳过 DNS - 检查
/etc/hosts是否存在错误条目(如把www.baidu.com指向了错误 IP),导致解析被提前终止 - 部分环境启用 mDNS(如 Avahi),若配置不当可能干扰常规 DNS;可临时注释
mdns4测试










