名称无法解析(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 没有被您自己的数据包过滤器拦截。