排查域名解析故障的第一步,是确认”当前用哪个 DNS 服务器”以及”该服务器能否返回正确记录”。本文覆盖 dig、nslookup、host、resolvectl 和 resolv.conf 五种常用手段,从”服务器配置”到”逐条解析记录”完整走一遍。
快速判断 DNS 是否正常
确认机器正在使用哪个 DNS 服务器:
resolvectl status
输出里 Current DNS Server 一行就是当前生效的 upstream。如果显示 10.255.255.254 这类内网地址,说明 DNS 走的是网络管理设备(路由器 / Hyper-V / WSL NAT),而非本地递归解析器。
注意:在 systemd-resolved 管理的系统上,/etc/resolv.conf 是自动生成的,手工修改会被下次重启覆盖;正确做法是用 resolvectl 或 NetworkManager 工具调整 upstream。
dig:最完整的 DNS 查询工具
dig(Domain Information Groper)来自 bind9-dnsutils 包,是运维最常用的 DNS 调试工具。[1] 一条命令搞定常见查询:
dig google.com # 完整 A 记录
dig +short google.com # 仅地址
dig +short MX google.com # 邮件路由
dig +short TXT google.com # TXT 记录
dig +short -x 8.8.8.8 # 反向解析 PTR
dig 输出字段含义:ANSWER SECTION 是真实返回,AUTHORITY SECTION 是权威服务器列表,ADDITIONAL SECTION 是补充记录(如 A 记录随 MX 返回)。
nslookup 和 host:轻量替代
nslookup 适合逐步查询,一行命令也能出结果:[3]
nslookup google.com
nslookup -type=MX google.com
host 输出最简洁,适合脚本取地址:[2]
host google.com
host 8.8.8.8
两者都来自 bind9-host 或 bind9-dnsutils 包。
resolvectl:systemd 环境首选
Ubuntu 24.04 等使用 systemd-resolved 的系统,[4] resolvectl 是官方推荐的入口,一条命令覆盖查询和配置查看:
resolvectl query google.com
resolvectl query --type=MX google.com
resolvectl status
query 会同时返回 IPv4 和 IPv6 结果,并标注协议类型(protocol DNS 或 protocol LLMNR 等)。
deprecated:systemd-resolve 在 systemd v256 之后已被移除,Ubuntu 24.04(systemd 255)上仍可调用但实际是 resolvectl 的兼容链接;新系统直接用 resolvectl。[5]
排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
dig 返回 SERVFAIL |
upstream 拒绝递归或 DNS 服务故障 | 换备用 DNS 测试 dig @8.8.8.8 google.com |
nslookup 超时 |
DNS 端口 53 UDP 被防火墙拦截 | 检查出站规则或换 TCP 模式 |
resolv.conf 显示 nameserver 127.0.0.53 |
systemd-resolved stub 模式 | 用 resolvectl 而非直接读 resolv.conf |
| 返回 IP 与预期不符 | hosts 文件 / DNS 缓存覆盖 | 检查 /etc/hosts 和 resolvectl flush-caches |
dig +trace 超时 |
上游 NAT DNS 不响应递归 | 非故障,WSL / 某些容器环境正常 |
局限性
dig +trace需要递归访问根服务器;WSL NAT 和部分容器 DNS 环境无法完成,超时不等于故障。- 本文实测环境:Ubuntu 24.04 LTS,
bind9-dnsutils9.18.39,systemd255;旧版 Debian(如 bullseye)的dig版本较低,部分选项行为不同。 - 企业内网 DNS 过滤(如拒绝外部 MX 查询)会导致
dig MX返回空或超时,需联系网络管理员确认策略。 systemd-resolve在新版 systemd(≥256)已移除,Ubuntu 26.04 及以后请直接用resolvectl。
参考资料
- [1] dig(1) — bind9-dnsutils — Debian trixie(dig-man)
- [2] host(1) — bind9-host — Debian trixie(host-man)
- [3] nslookup(1) — bind9-dnsutils — Debian trixie(nslookup-man)
- [4] resolvectl(1) — Ubuntu Noble manpages(resolvectl-man)
- [5] systemd-resolved.service — freedesktop.org(systemd-resolved)
文中主要命令已在 WSL Ubuntu(24.04)实测,个别条目(未装工具/安装类命令)仅核对官方文档,未实际执行。