Net Go Easy

使用排障

Ubuntu无法解析域名?用getent和resolvectl定位失败环节

遇到 Could not resolve host 或域名打不开时,用 getent 与可选 resolvectl 检查名称解析,读懂成功、超时和服务不可用结果,再决定下一步。

· 更新于

先确认报错中的域名

curl 提示 Could not resolve host,或应用说“无法解析主机”时,先核对拼写:把 https://、端口、路径去掉,只保留主机名。例如 https://example.com/help 对应的检查输入是 example.com。

本文用于 Linux/Ubuntu 的名称解析排查,不承诺自动修复所有 DNS 问题。脚本已在 Ubuntu 24.04 运行验证,需要 Bash、getent、timeout 和 awk。它使用你的现有系统解析方式,不替你换成公共 DNS。

1. 下载并运行域名检查脚本

下载 dns-check.sh,或者进入你准备存放文件的目录,依次执行:

curl --fail --location --output dns-check.sh https://netgoeasy.com/scripts/dns-check.sh
less dns-check.sh
bash dns-check.sh example.com

在 less 中按 q 返回。将 example.com 换成出错的主机名。下载地址固定、公开访问;无法联网下载时,可从其他设备下载后复制过来。下载网站本身也需要能解析,下载失败不等于脚本已经做过检查。

不要把完整 URL、订阅链接或密码传给它。中文域名请使用对应的 ASCII/Punycode 形式;当前脚本不接受 IP 字面量、IPv6 地址或带端口的输入。

2. 看第一项:系统能不能取得地址

脚本先运行有时间上限的 getent ahosts,成功时显示去重后的地址。这个检查走系统的名称服务路径,结果也可能来自 hosts 或缓存,不能拿它证明某台外部 DNS 服务器正常。

下面是输出样式,不是某个服务的实测结果:

系统名称解析: 成功(结果可能来自 DNS、缓存或 hosts)
地址: 192.0.2.10

若你想先验证脚本能否在本机正常运行,可用本地主机名:

bash dns-check.sh localhost

localhost 通常由本机配置解析;即使这一步成功,也不能据此认定互联网 DNS 已恢复。

3. 第二项 resolvectl 为什么可能失败?

装有 resolvectl 时,脚本还会尝试通过 systemd-resolved 查询同一个名字。没有这个命令会跳过;有命令但没有运行中的服务或系统总线,也可能返回非零。

因此,容器里显示“systemd-resolved 查询失败”,不等于宿主机 DNS 出了问题;也不表示必须安装或启动这项服务。先看第一项能不能解析,以及你的实际应用是否仍失败。

检查结果 下一步做什么
系统解析成功,应用仍说无法解析 检查应用是否运行在另一个容器、网络空间,或使用自己的解析方式;在出错的环境里重跑
只有某一个名字失败 再查拼写,并与一个你确认存在的普通域名对照,不要先改全局 DNS
多个普通域名都无法取得地址 对比同网络其他设备,再检查本机 DNS 和联网状态
getent 成功,resolvectl 不可用 保留系统解析结果,不把服务不可用当成整体断网
命令超时 记录目标、时段与网络,再对照重试,不用反复刷新配置文件

脚本的退出状态为 0 时,表示这次系统名称解析取得了地址;1 表示没取到,2 表示输入有误,3 表示缺少依赖。resolvectl 的状态单独打印,不替代第一项的结果。

4. 需要继续查时,先读取配置,不覆盖文件

在自己设备上查看当前解析文件和管理方式:

ls -l /etc/resolv.conf
cat /etc/resolv.conf

如果它是符号链接,或内容提示由其他工具生成,直接覆盖可能会被下次联网重新生成。看到本机环回地址也不一定是错误,它可能指向本地解析服务。

使用NetworkManager的桌面用户,在“设置→网络”或Wi-Fi连接详情的IPv4/IPv6页,查看DNS是否自动;若故障紧接着你自己的一次手动DNS改动出现,先按原记录恢复自动或原地址,应用设置后重新连接,再对同一域名运行脚本。没有改动记录就不要猜填地址。

服务器或容器用户先在实际报错的环境中运行上面两条只读命令。容器解析成功不代表宿主机成功,反过来也一样;将各自结果分开。如果由Netplan或组织配置管理,交由管理者修改,不能用覆盖/etc/resolv.conf代替。

系统提供 resolvectl 且服务可用时,可在自己设备上进一步查看:

resolvectl status
resolvectl query example.com

状态输出可能含内网域名和 DNS 地址,不要原样公开。本文不要求重启服务,也不要求把某个公共 DNS 地址写进系统文件;定位到配置问题后再按对应管理方式做修改,并保留恢复办法。

5. 解析成功后,继续确认连接

取得地址只是第一层。接下来用原来的应用再次访问目标;如果报错变成连接超时、证书或登录问题,按新错误继续处理,不要把它们统称为 DNS 故障。终端代理残留可看Linux 代理检查与临时直连方法。

脚本不需要 sudo,不改 hosts、resolv.conf,也不上传结果。查询会使用系统现有的解析服务,目标名称可能被该服务记录;不要输入不适合发给当前解析器的敏感名称。只想查看工具用途,可回到脚本工具栏目。

参考资料

  • Linux getent 手册 · 资料日期 2026-10-22
  • systemd resolvectl 手册 · 资料日期 2026-10-22