Linux 中 DNS 无法解析的原因与解决方法

在 Linux 中,如果出现“可以连上网络,但打不开网站”“可以 ping 通 IP 地址,却无法通过域名访问”的情况,通常说明 DNS 解析可能出了问题。DNS 的作用是把 example.com 这样的域名转换成实际的 IP 地址。一旦这个环节异常,即使网络本身没有断开,很多常见的联网操作也会失败。

常见症状

  • 浏览器提示“找不到服务器”
  • ping 8.8.8.8 成功,但 ping google.com 失败
  • aptdnfyumpacman 等软件包管理器无法下载数据
  • 终端中出现 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.confsystemd-resolvedNetworkManager、DHCP 和 VPN 配置,大多数问题都能定位出来。不要只做临时修复,更重要的是弄清楚系统中究竟是谁在管理 DNS,然后进行长期正确的配置。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注