Skip to content
VDS · 故障排查

名称无法解析(DNS)

机器能看到地址却看不到名称:如何检查解析器,修复 resolv.conf,以及避免重启后设置丢失。

更新于 2026年8月23日

这种故障的表现很好辨认:ping 1.1.1.1 正常,ping millida.net 返回“Temporary failure in name resolution”,apt update 卡住并超时。网络本身没有问题——只是名称到地址的转换坏了。

第 1 步:确认问题出在名称解析上

ping -c3 1.1.1.1
getent hosts millida.net
dig +short millida.net @1.1.1.1

如果指定服务器时 dig 有响应,而 getent 没有,说明系统不知道该联系哪个解析器。这是配置问题,不是连通性问题。

第 2 步:检查由谁负责解析

cat /etc/resolv.conf
systemctl status systemd-resolved
resolvectl status

可能有三种情况:

  • 文件为空或没有 nameserver 行——没有设置解析器;
  • 文件中包含 nameserver 127.0.0.53,但 systemd-resolved 没有运行——请求无处可去;
  • 配置了第三方服务器,但从我们的网络无法访问。

第 3 步:修复

快速恢复,让 apt 和 curl 重新可用:

echo 'nameserver 1.1.1.1' > /etc/resolv.conf
echo 'nameserver 8.8.8.8' >> /etc/resolv.conf

这样会立即生效,但只能维持到重启或下一次网络重新配置。永久修复取决于系统。

使用 systemd-resolved 的 Debian 和 Ubuntu:

systemctl enable --now systemd-resolved
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
resolvectl dns ens18 1.1.1.1 8.8.8.8

AlmaLinux 和 CentOS Stream:

nmcli con mod "System ens18" ipv4.dns "1.1.1.1 8.8.8.8"
nmcli con up "System ens18"

如果 /etc/resolv.conf 是指向 /run 的符号链接,请不要手动编辑它。这样的文件会被服务覆盖,您的修改会在第一次重启后消失——一周后您会再次遇到同样的故障,却想不起来原因。

第 4 步:特殊情况

解析器工作正常,但某个特定名称找不到。检查该记录是否已发布:

dig millida.net A @1.1.1.1
dig millida.net A @8.8.8.8

两台服务器返回不同结果,说明该区域最近发生过变更,某处仍存在旧缓存。请等待 dig 响应中该记录的生存时间(TTL)。

机器地址的反向记录(PTR)与这个问题无关:邮件服务器需要它,它在“访问”标签页中设置,不影响机器自身如何解析名称。

另一个常见发现是 /etc/hosts 中残留了迁移后过期的行。系统会在 DNS 之前检查它,并固执地继续访问旧地址:

cat /etc/hosts

删除多余的行,只保留 127.0.0.1 localhost 和包含机器自身名称的那一行。

如果从任何服务器都无法解析名称

那么问题范围更大:请使用文章机器网络丢失检查基本连通性,并确认出站端口 53 没有被您自己的数据包过滤器拦截。