在 Linux 中,如果出现“可以连上网络,但打不开网站”“可以 ping 通 IP 地址,却无法通过域名访问”的情况,通常说明 DNS 解析可能出了问题。DNS 的作用是把 example.com 这样的域名转换成实际的 IP 地址。一旦这个环节异常,即使网络本身没有断开,很多常见的联网操作也会失败。
常见症状
- 浏览器提示“找不到服务器”
ping 8.8.8.8成功,但ping google.com失败apt、dnf、yum、pacman等软件包管理器无法下载数据- 终端中出现
Temporary failure in name resolution
先做故障定位
首先要区分:到底是整个网络有问题,还是只有 DNS 解析有问题。
ping -c 4 8.8.8.8
ping -c 4 google.com
ip addr
ip route
如果能访问 8.8.8.8,但不能访问 google.com,通常说明问题集中在 DNS 配置或 DNS 服务本身。如果连 IP 地址都无法访问,那更可能是网卡、Wi-Fi、网关或路由层面的问题。
主要原因
1. /etc/resolv.conf 配置错误
在很多 Linux 发行版中,DNS 服务器信息会写入 /etc/resolv.conf。如果这里没有正确的 nameserver,就无法完成域名解析。
cat /etc/resolv.conf
示例内容:
nameserver 8.8.8.8
nameserver 1.1.1.1
如果文件为空,或者指向了错误的本地 DNS,就会导致解析失败。不过要注意,很多现代 Linux 系统会由 NetworkManager 或 systemd-resolved 自动生成这个文件,手动修改可能会被覆盖。
2. systemd-resolved 异常
在 Ubuntu 等系统中,systemd-resolved 负责 DNS 解析,并常常使用 127.0.0.53 作为本地解析入口。如果这个服务停止,域名解析就会失败。
systemctl status systemd-resolved
resolvectl status
出现异常时可以重启服务:
sudo systemctl restart systemd-resolved
3. NetworkManager 下发 DNS 失败
桌面 Linux 中,NetworkManager 常通过 DHCP 获取 DNS 信息。如果网络配置损坏、Wi-Fi 重连异常,或者配置文件出错,就可能拿不到正确的 DNS。
nmcli dev show | grep DNS
nmcli connection show
必要时可以重启它:
sudo systemctl restart NetworkManager
4. VPN、代理或防火墙影响
启用 VPN 后,DNS 请求可能被发往错误的通道;有些防火墙也可能阻止 53 端口通信,导致只有 DNS 解析失败。这在公司网络或启用了安全软件的环境中较为常见。
5. DNS 缓存异常
本地缓存过旧或损坏时,可能只有部分域名无法解析。使用 systemd-resolved 或 nscd 的系统,可以尝试清理缓存。
sudo resolvectl flush-caches
实用排查步骤
步骤1:直接查询外部 DNS
nslookup google.com 8.8.8.8
dig google.com @8.8.8.8
如果这样可以正常返回结果,通常说明外部 DNS 没问题,问题更可能在本机配置。
步骤2:临时设置公共 DNS
sudo sh -c 'printf "nameserver 8.8.8.8\nnameserver 1.1.1.1\n" > /etc/resolv.conf'
这种做法适合临时恢复,但系统重启或网络重新连接后可能会被覆盖。长期来看,应该修复 NetworkManager、netplan 或 systemd-resolved 的配置。
步骤3:检查 Ubuntu 的 netplan
sudo nano /etc/netplan/*.yaml
示例:
nameservers:
addresses: [8.8.8.8,1.1.1.1]
修改后应用配置:
sudo netplan apply
步骤4:重新获取 DHCP 信息
sudo dhclient -r
sudo dhclient
如果是 DHCP 下发了错误的 DNS,重新获取地址后有时可以恢复正常。
常用检查命令
ping -c 4 8.8.8.8
ping -c 4 google.com
cat /etc/resolv.conf
systemctl status systemd-resolved
resolvectl status
nmcli dev show | grep DNS
nslookup google.com
dig google.com
journalctl -u systemd-resolved --no-pager | tail -n 50
预防建议
- 不要只靠手动修改
/etc/resolv.conf - 确认系统到底由 DHCP、NetworkManager 还是 systemd-resolved 管理 DNS
- 连接 VPN 后检查 DNS 是否被改写
- 服务器环境建议明确设置固定 DNS
总结
当 Linux 无法进行 DNS 解析时,最重要的是先确认“IP 能不能通”,以判断问题是否仅限于名称解析。随后按顺序检查 /etc/resolv.conf、systemd-resolved、NetworkManager、DHCP 和 VPN 配置,大多数问题都能定位出来。不要只做临时修复,更重要的是弄清楚系统中究竟是谁在管理 DNS,然后进行长期正确的配置。