Linux不能解析域名,绝大多数情况下是DNS配置问题或网络服务异常,不是系统本身坏了。按“先本地、再网络、后服务”的顺序排查,几分钟内就能定位原因。
先分清是“完全不能解析”还是“部分域名解析失败”
排查之前先做个快速测试,在终端里执行:
ping 8.8.8.8
如果这条命令能通,但 ping www.baidu.com 提示 unknown host,那说明网络链路正常,问题确实在DNS解析环节,反之,如果连IP地址都ping不通,说明物理网络或路由配置有故障,这时候修DNS是没用的。
接下来再用 dig 或 nslookup 做一次显式查询:
dig www.baidu.com @223.5.5.5
注意后面加了 @223.5.5.5,意思是直接指定阿里DNS服务器查询,如果这条命令能返回IP地址,而系统默认解析失败,那问题基本锁定在本地DNS配置文件上。
检查 /etc/resolv.conf 是否被清空或指向错误
Linux系统解析域名时,第一件事就是读取 /etc/resolv.conf 文件,查看系统配置了哪些DNS服务器,很多Ubuntu或CentOS用户遇到“linux不能解析域名”的情况,打开这个文件后会发现里面要么是空的,要么只剩下一行 search 指令,没有任何 nameserver。
执行下面的命令查看:
cat /etc/resolv.conf
正常文件至少应包含两行,
nameserver 223.5.5.5 nameserver 8.8.8.8
如果没有nameserver,直接用文本编辑器加上即可,但要注意,很多Linux发行版会由NetworkManager或systemd-resolved动态覆盖这个文件,手动改了重启网络后又会变回原样,这时候需要判断系统用的是哪种DNS管理方式。
查看是否存在systemd-resolved进程:
systemctl status systemd-resolved
如果服务是运行状态,且 /etc/resolv.conf 是软链接指向 /run/systemd/resolve/stub-resolv.conf,说明系统走的是systemd托管DNS,此时不要直接改resolv.conf,而是应通过 resolvectl dns 命令设置,或修改 /etc/systemd/resolved.conf 文件。
场景举例:一台Ubuntu 22.04服务器突然无法访问外网域名,ping 114.114.114.114 正常,dig www.taobao.com 却报错,排查后发现是 /etc/resolv.conf 被云平台初始化脚本重置,里面只剩一行 options edns0,重新写入nameserver后问题立即消失。

Netplan 或 ifcfg 配置中的DNS项是否正确
现代Linux系统很少直接读resolv.conf,而是从网络配置文件中生成DNS设置,如果这里写错了,每次重启网络都会覆盖手动修改。
Ubuntu/Debian使用Netplan
配置文件在 /etc/netplan/ 目录下,通常是 .yaml 后缀,编辑后执行:
sudo netplan apply
配置示例:
network:
version: 2
ethernets:
eth0:
dhcp4: true
nameservers:
addresses:
- 223.5.5.5
- 119.29.29.29
这里有个容易踩的坑:如果服务器通过DHCP获取IP,但nameservers段里写的IP是内网网关地址,而内网DNS服务没响应,就会出现“能上内网、打不开外网域名”的怪现象,因此建议使用公共DNS如5.5.5(阿里DNS)或29.29.29(腾讯DNS)。
CentOS/RHEL使用ifcfg
老版本CentOS 7或8的配置在 /etc/sysconfig/network-scripts/ifcfg-eth0 中,重点检查两行:
DNS1=223.5.5.5 DNS2=119.29.29.29
修改后重启网络:
systemctl restart network
CentOS 8及以上版本可能使用NetworkManager的nmcli命令,查看当前DNS:
nmcli device show eth0 | grep DNS
修改DNS:
nmcli con mod eth0 ipv4.dns "223.5.5.5 119.29.29.29" nmcli con up eth0
DHCP获取的DNS覆盖了手动配置
很多linux不能解析域名的问题,恰恰出在“系统确实有DNS配置,但配置的是内网DNS”,比如家里路由器分配了 168.1.1 作为DNS,这个地址本身负责转发解析请求,如果路由器DNS设置错误或上游断连,Linux一样无法解析。
此时观察 /etc/resolv.conf 内容,如果nameserver指向的是网关IP,且手动改成公共DNS后暂时恢复,但重启网络又变回原样,说明DHCP客户端在覆盖配置。
解决方法:
- 如果是dhclient,编辑
/etc/dhclient.conf添加:
supersede domain-name-servers 223.5.5.5, 119.29.29.29;
- 如果是NetworkManager,在连接配置中设置忽略自动DNS:
nmcli con mod eth0 ipv4.ignore-auto-dns yes
- 如果是dhcpcd,编辑
/etc/dhcpcd.conf:
nolookup domain_servers 223.5.5.5 119.29.29.29
行业共识认为,自动获取的DNS地址不一定是最优解,尤其在内网环境复杂的情况下,手动指定公共DNS往往更稳定

。
检查 nsswitch.conf 中的解析顺序
还有一个不起眼但影响很大的文件:/etc/nsswitch.conf,它决定了系统按什么顺序查找主机信息,正常情况下包含这样一行:
hosts: files dns
意思是先查 /etc/hosts 文件,再走DNS,如果这行变成了 hosts: files 或者其他没有dns的写法,那么即使DNS配置正确,系统也不会去查询。
检查命令:
grep "^hosts" /etc/nsswitch.conf
如果缺少dns,直接编辑文件补上,另外需要留意 /etc/hosts 文件中的特殊条目:
0.0.1 localhost
有些教程会建议把主机名也绑定到127.0.0.1,但如果你的hosts文件里写了 0.0.1 www.baidu.com,那么解析永远走本地文件,DNS服务器再快也没用,这属于“域名能解析但被劫持”的隐蔽情况。
防火墙或安全组阻断DNS端口
DNS解析依赖UDP和TCP的53端口,如果服务器上开了iptables或firewalld,且阻止了出站UDP 53流量,解析就会超时。
测试命令:
timeout 1 bash -c "</dev/udp/223.5.5.5/53" ; echo $?
如果返回非0,说明UDP 53出站被阻,查看iptables规则:
sudo iptables -L OUTPUT
以及firewalld:
sudo firewall-cmd --list-all
很多云服务器厂商的安全组默认只放开TCP 22端口,UDP 53端口需要单独放行,业内专家指出,这类问题在云上环境约占解析故障的两到三成。
systemd-resolved 的缓存或解析器故障
使用systemd的Linux发行版,systemd-resolved 服务一旦出现异常,也会导致linux不能解析域名,症状表现为 ping 报 Temporary failure in name resolution。
先看服务状态:
systemctl status systemd-resolved
如果服务处于failed或deactivating状态,尝试重启:
systemctl restart systemd-resolved
然后检查当前生效的DNS:
resolvectl status
对于systemd-resolved管理的系统,推荐使用 resolvectl query 测试:
resolvectl query www.baidu.com
如果DNS实际工作正常,但应用仍然解析失败,可能是nsswitch.conf中使用了 resolve 而不是

dns,检查确认:
grep hosts /etc/nsswitch.conf
配置应为:
hosts: files resolve [!UNAVAIL=return] dns
这是确保systemd-resolved解析失败后能回退到传统DNS的经典写法。
常见问题排查顺序总结
按以下步骤操作,绝大多数场景下都能解决linux不能解析域名的问题:
- 用
ping 8.8.8.8判断网络通断 - 用
dig @223.5.5.5 目标域名测试显式解析 - 查看
/etc/resolv.conf- 确认Netplan或ifcfg配置是否正确
- 检查DHCP是否覆盖DNS
- 检查nsswitch.conf是否包含dns或resolve
- 放行UDP/TCP 53端口
- 重启systemd-resolved或网络服务
如果上述步骤都无效,尝试开启另一个终端执行 sudo tcpdump -i eth0 port 53,同时发起解析请求,观察是否有DNS查询包发出,如果能看到请求发出但收不到响应,说明公网DNS服务器可能被污染或阻断,更换DNS服务器地址再试。
哪些DNS服务器更适合Linux服务器使用
国内服务器优先推荐阿里DNS 5.5.5 和腾讯DNS 29.29.29,连通性普遍好于国外公共DNS,海外云主机可考虑 1.1.1(Cloudflare)或 8.8.8(Google)。
不同DNS在解析速度和准确性上有一定差异。对于Linux服务器来说,稳定比速度更重要,建议配置两个不同运营商的DNS作为主备。
Q&A
linux不能解析域名和ping不通外网的区别是什么?
前者是网络通畅但域名无法转换出IP,后者是底层网络连接直接失败,区分方式很简单:ping 一个IP地址(比如223.5.5.5),能通说明网络正常,真正的问题在DNS环节;不通则说明需要先解决路由或网络连接问题,修DNS没有意义。
修改/etc/resolv.conf后重启网络又失效怎么办?
这种情况说明系统使用NetworkManager或systemd-resolved自动管理DNS,应根据发行版选择对应配置方式:Ubuntu修改Netplan配置文件,CentOS修改ifcfg文件,或通过nmcli命令设置静态DNS,单纯手动修改resolv.conf只能临时生效,无法抵抗网络服务重启时的覆盖行为。
为什么某些域名能解析,某些域名解析失败?
现象通常指向DNS服务器本身对特定域名返回了异常响应,或者本地DNS缓存中保留了错误的解析记录,先执行 sudo systemd-resolve --flush-caches 清空缓存,再使用 dig 域名 @223.5.5.5 对比测试,如果公共DNS能解析而默认DNS不能,说明默认DNS服务器的上游链路有问题,更换DNS即可。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/910042.html


评论列表(3条)
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是检查部分,给了我很多新的思路。感谢分享这么好的内容!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于检查的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
@brave709fan:读了这篇文章,我深有感触。作者对检查的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!