在Linux系统中,Ping IP地址通但Ping域名不通是典型的DNS解析故障。由于Ping IP走的是网络层(ICMP协议),而Ping域名需要先通过DNS协议将域名解析为IP,因此该问题几乎100%指向域名解析环节异常,而非网络链路不通。

一、故障原因分析
1. /etc/resolv.conf 配置异常:这是最常见的原因。文件中没有配置可用的nameserver,或配置的DNS服务器地址错误、不可达,导致系统无法完成域名解析。常见表现为文件为空、被注释或只有search行没有nameserver行。
2. resolv.conf 被系统服务自动覆盖:在较新的Linux发行版中,systemd-resolved 或 NetworkManager 服务会动态管理并覆盖 /etc/resolv.conf。手动修改后可能被重置为127.0.0.53(systemd-resolved本地代理),若该本地解析服务异常,则域名解析失败。
3. /etc/nsswitch.conf 配置缺陷:该文件的hosts行决定了名称解析的查询顺序。若缺少 dns 关键字(如配置为"hosts: files"),系统只查/etc/hosts文件而不查询DNS服务器,导致非本地hosts内的域名无法解析。
4. 防火墙拦截DNS流量:DNS默认使用 UDP 53端口。若iptables、firewalld或云服务器安全组拦截了出站或入站的53端口流量,ICMP(Ping)正常但DNS查询无法得到响应。
5. /etc/hosts 文件错误覆盖:若hosts文件中存在错误的主机名与IP映射记录,可能干扰正常解析(尤其在nsswitch优先查files的情况下)。
6. DNS服务器本身不可用或域名不存在:配置的DNS服务器宕机、响应超时,或目标域名确实无解析记录。
二、排查步骤
第一步:验证网络连通性。执行 ping 8.8.8.8 或 ping 114.114.114.114,确认基础网络链路正常。
第二步:测试DNS解析。执行 nslookup baidu.com 或 dig baidu.com。若返回"server can't find"或"connection timed out",即可确认是DNS解析问题。可使用 dig @8.8.8.8 baidu.com 指定DNS服务器测试,判断是本地配置问题还是DNS服务器问题。
第三步:检查DNS配置。执行 cat /etc/resolv.conf,确认是否包含有效的nameserver行,如"nameserver 8.8.8.8"。
第四步:检查nsswitch配置。执行 cat /etc/nsswitch.conf,确认hosts行包含dns,标准格式为"hosts: files dns"。
第五步:检查防火墙。执行 firewall-cmd --list-all(firewalld)或 iptables -L -n,检查53端口是否被拦截。
第六步:检查解析服务状态。执行 systemctl status systemd-resolved 和 systemctl status NetworkManager,查看服务运行状态。
三、解决方案
方案1:临时修复(立即生效,重启可能失效)
直接编辑 /etc/resolv.conf,添加公共DNS:
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
方案2:永久生效(CentOS/RHEL系统)
编辑网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0(网卡名可能是ens33等),添加:
DNS1="8.8.8.8"
DNS2="114.114.114.114"
然后执行 systemctl restart network 重启网络服务。
方案3:永久生效(Ubuntu/Debian系统)
编辑 /etc/netplan/ 目录下的yaml配置文件,在ethernets下添加nameservers配置:
nameservers: addresses: [8.8.8.8, 114.114.114.114]
执行 netplan apply 使配置生效。
方案4:解决resolv.conf被覆盖问题
若发现resolv.conf被systemd-resolved覆盖为127.0.0.53,可编辑 /etc/systemd/resolved.conf,在[Resolve]段添加:
DNS=8.8.8.8 114.114.114.114
然后执行 systemctl restart systemd-resolved。
或者取消 /etc/resolv.conf 的软链接,直接建立静态文件并执行 chattr +i /etc/resolv.conf 锁定文件防止被覆盖(需谨慎使用)。
方案5:修复nsswitch.conf
确保 /etc/nsswitch.conf 中hosts行包含dns:
hosts: files dns myhostname
方案6:防火墙放行DNS服务
firewalld环境执行:
firewall-cmd --permanent --add-service=dns
firewall-cmd --reload
iptables环境执行:
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
四、验证与预防
配置完成后,执行 nslookup baidu.com 或 ping baidu.com 验证域名解析是否恢复。建议在服务器初始化阶段就规范配置DNS,并使用 resolvectl status(systemd-resolved环境)定期检查解析链路状态。云服务器还需同步检查云平台安全组是否放行53端口出站规则。

查看详情

查看详情