讲解 Linux DNS 解析故障中 IP 与域名测试、systemd-resolved、resolvectl、dig、UDP/TCP 53、缓存和容器差异。
Linux 云服务器出现“能访问 IP、不能访问域名”时,问题通常在 DNS 解析链路;如果连目标 IP 都无法访问,则应先排查路由、安全组、防火墙或对端服务。DNS 排障的关键是把域名记录、系统解析器、上游 DNS 和 UDP/TCP 53 网络路径分开验证。

先确认故障是否只影响域名
getent ahosts example.com
ping -c 3 1.1.1.1
curl -I --connect-timeout 5 https://example.com
cat /etc/resolv.conf
getent 经过系统名称服务配置,更接近应用实际解析路径。直接 ping 公网 IP 成功、解析域名失败,才把重点放到 DNS。部分网络禁用 ICMP,因此 ping 失败不能单独证明网络中断,可结合 TCP 连接测试。
systemd-resolved 环境怎么检查
systemctl is-active systemd-resolved
resolvectl status
resolvectl query example.com
readlink -f /etc/resolv.conf
journalctl -u systemd-resolved --since '-30 min' --no-pager
resolvectl status 会显示全局和每个网卡的 DNS 服务器、搜索域及默认路由。多网卡、VPN 或容器环境中,请确认查询流量实际走向哪一个接口,而不是只看 /etc/resolv.conf 中的本地 stub 地址。
绕过本机缓存直接测试上游 DNS
安装有 dig 时,可分别查询系统默认解析器和指定上游服务器。
dig example.com A
dig @1.1.1.1 example.com A +time=3 +tries=1
dig @1.1.1.1 example.com A +tcp +time=3 +tries=1
默认查询失败、指定上游成功,通常指向本机解析配置;UDP 失败而 TCP 成功,可能是 UDP 53 路径被过滤或响应被截断;两者都超时,需要检查出站规则、网络 ACL、路由和上游可达性。生产环境应使用组织批准的 DNS 地址,不要把公共解析器写成固定答案。
确认域名记录本身是否正确
dig example.com A +noall +answer
dig example.com AAAA +noall +answer
dig example.com CNAME +noall +answer
dig example.com SOA +noall +answer
NXDOMAIN 表示查询名称不存在;SERVFAIL 可能涉及权威 DNS、DNSSEC 或上游故障;无答案但没有 NXDOMAIN,可能是查询的记录类型不存在。刚修改记录时还要考虑递归缓存和 TTL,不能通过反复重启服务器让全球缓存立即失效。
容器正常而宿主机异常,或反过来
Docker、Kubernetes 和本机可能使用不同的解析配置。先分别在宿主机和目标容器内执行查询,并检查容器的 /etc/resolv.conf。不要直接覆盖容器自动生成的配置;应在容器运行时或编排层修改 DNS 设置。
docker exec APP_CONTAINER cat /etc/resolv.conf
docker exec APP_CONTAINER getent hosts example.com
刷新缓存与临时修改
sudo resolvectl flush-caches
sudo resolvectl reset-server-features
resolvectl statistics
刷新缓存只对过期或异常缓存有帮助,不能修复错误权威记录和网络阻断。使用 resolvectl dns INTERFACE ADDRESS 的临时设置可能在网络重连后消失,长期配置应写入 Netplan、NetworkManager、systemd-networkd 或云初始化实际管理的配置层。
| 结果 | 更可能的范围 | 下一步 |
|---|---|---|
| IP 和域名都不通 | 网络路径或目标服务 | 检查路由、安全组、防火墙和端口 |
| 指定 DNS 成功,默认失败 | 本机解析配置 | 检查 resolv.conf、resolved 和网卡 DNS |
| UDP 53 失败,TCP 53 成功 | UDP 路径或响应大小 | 检查网络 ACL、防火墙和 DNS 服务 |
| 返回 NXDOMAIN | 名称或权威记录 | 核对域名、区域和记录是否存在 |
操作边界
不要长期锁定 /etc/resolv.conf 或删除符号链接来掩盖配置问题,这可能破坏 DHCP、VPN 和云网络下发。修改生产 DNS 前保留当前配置,并准备通过控制台登录恢复。

