dig 与 DNS 排查:域名不解析从哪查起

dig 与 DNS 排查:域名不解析从哪查起

digDNSUbuntu网络排查运维
📶 入门 🧩 dig · Ubuntu · BIND

“网站打不开了”,这句话里有三种可能:服务挂了、网络断了、域名解析出问题。先花 10 秒排除第三种,再去重启服务——很多人顺序是反的。dig 就是干这 10 秒活的工具:它直接向 DNS 服务器发查询并把原始应答摆出来,比 ping 域名靠谱得多,因为 ping 失败可能是防火墙拦了 ICMP,但解析问题藏不住。

Ubuntu 24.04 默认没装 dig(装的是精简的 nslookup),一行补上:

sudo apt install dnsutils
dig -v   # 输出 DiG 9.18.x 即可,下文命令均在 9.18 验证

dig 属于 BIND 套件的一部分,但你不需要自建 DNS 服务器才能用它——它就是个客户端查询工具。本文的排查链从近到远:本机配置 → 递归解析器 → 权威服务器,每一步都有对应的 dig 用法。

先读一条最基础的查询输出

dig example.com

输出分四段,排障时各看一处:

; <<>> DiG 9.18.28-0ubuntu0.24.04.1-Ubuntu <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            86400   IN      A       23.192.228.80

;; Query time: 12 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Tue Oct 21 10:00:00 CST 2026
;; MSG SIZE  rcvd: 55

四个关键位置:

位置看什么说明
status:应答状态NOERROR 正常;NXDOMAIN 域名不存在;SERVFAIL 服务器解析失败
ANSWER SECTION解析结果左侧第二列是 TTL(秒),记录还能缓存多久
SERVER:实际应答的服务器不加 @ 时就是 /etc/resolv.conf 里的那台
Query time解析耗时几毫秒正常;上千毫秒说明解析器响应慢

注意 SERVER 这行:dig 默认问的是系统配置的递归解析器,不是域名的权威服务器。你拿到的答案是缓存出来的还是权威给的,从这个字段判断——这是后面所有排查的起点。

排查第一步:确认本机用了哪个 DNS

域名解析异常时,先确认”这台机器在问谁”。/etc/resolv.conf 在 systemd-resolved 接管后是个存根文件,真实配置要看 resolved 自己:

resolvectl status | grep -A2 "DNS Server"

输出里 Global 下的 DNS 服务器是全局配置,每个网卡链接下的才是实际生效的。Ubuntu 24.04 装机后这里往往是云厂商的内网 DNS 或 DHCP 下发的地址。

排除本机配置干扰的更快办法:绕过系统配置,直接指定公共解析器对比查询。

dig @1.1.1.1 example.com +short
dig @8.8.8.8 example.com +short

+short 只输出结果值,去掉所有注释和统计行,对比查询时干净得多。两个公共解析器都返回正常 IP、系统默认解析器返回异常 → 问题锁定在系统配置或上游链路,改 /etc/systemd/resolved.conf 的 DNS= 或检查 DHCP 下发。两边都异常 → 问题在域名本身,往下走。

排查第二步:分别查各类记录

“解析不对”很多时候是记录类型查错了。一个域名挂在 DNS 上的记录不止一种,网站打不开时至少查这四类:

记录类型查询命令内容排查点
Adig example.com AIPv4 地址网站走 IPv4 的主记录
AAAAdig example.com AAAAIPv6 地址IPv6 配错了浏览器可能先试它再超时
MXdig example.com MX邮件服务器收不到邮件查这个
CNAMEdig www.example.com CNAME别名指向CDN/对象存储托管常见

+short 模式下 CNAME 链会完整展示出来,别名指到哪一目了然:

$ dig www.example.com CNAME +short
www.example.com. example.com. 0 IN CNAME example.com.
example.com. 86400 IN A 23.192.228.80

反向解析(IP 反查域名)用 -x,dig 自动把地址转成 in-addr.arpa 格式:

dig -x 8.8.8.8 +short

邮件服务器 IP 没配 PTR 记录会被对方拒信,这个命令是配完 PTR 后的验证步骤。

排查第三步:绕过缓存,问权威服务器

递归解析器给的答案带缓存,TTL 没走完之前改了记录也看不到新值。“我刚改了记录怎么没生效”八成是缓存,不是没改上。要验证改动真的写进了权威服务器,先找出权威 NS:

$ dig example.com NS +short
a.iana-servers.net.
b.iana-servers.net.

然后直接指定其中一台查询:

dig @a.iana-servers.net example.com A +short

这条查询跳过所有中间缓存,权威服务器说什么就是什么。它有新值而本地没有 → 纯粹等 TTL 过期,不用再动配置;权威服务器也没有新值 → 改动没提交成功,回注册商后台检查。

看 TTL 的剩余值也能判断缓存新旧:同一台递归解析器上连续查两次,TTL 递减说明读的是缓存,TTL 回到初始值说明记录刚刷新。

排查第四步:+trace 看完整解析链路

前几步排不出问题、怀疑某一级委派出错时,+trace 从根服务器开始把整条递归链路走一遍:

dig example.com +trace

输出按层级展示:先拿到根服务器列表,再问 .com 顶级域,再拿到 example.com 的 NS 委派,最后拿到 A 记录。链路断在哪一级,输出就停在哪一级——.com 那层之后没有下文,就是顶级域委派出了问题;NS 返回了但没拿到 A,就是权威服务器配置的问题。

对自建 DNS 服务器(BIND 等),+trace 配合 @ 可以区分”权威侧答错了”和”递归侧没问到”:trace 是 dig 自己模拟递归查询,指定 @ 只影响最初的根查询。日常排查不用每次都 trace,前四步命令能覆盖的场景轮不到它。

两种失败状态:NXDOMAIN 和 SERVFAIL 指向不同问题

status含义常见原因下一步
NXDOMAIN域名不存在域名过期、记录被删、NS 配置错误先查 NS 是否正确指向
SERVFAIL解析失败权威服务器不响应、DNSSEC 校验失败、委派断裂用 +dnssec 和 +trace 定位

两个都查不出记录,但指向的问题不同。快速区分:

dig example.com A +dnssec        # 带 DNSSEC 数据查询
dig @a.iana-servers.net example.com A +short   # 直接问权威

权威有答案而递归 SERVFAIL,十有八九是 DNSSEC 校验失败——签名过期、DS 记录不匹配都会触发。注册商后台重新签名或修正 DS 记录后,递归侧恢复。

四步各答一问:排查链条全貌

步骤命令回答的问题
1. 本机配置resolvectl status这台机器在问哪个 DNS
2. 换解析器对比dig @1.1.1.1 域名 +short问题在本机还是域名本身
3. 问权威服务器dig @权威NS 域名 +short改动是否已落库、缓存何时过期
4. 追解析链路dig 域名 +trace委派链断在哪一级

四步的顺序是成本排序:前两步 10 秒内出结论,后两步只在问题指向域名本身时才需要。绝大多数”网站打不开”的工单,走完第二步就能定责——本机配置、解析器链路、域名记录三者必居其一。

常见问题

Q:dig 和 nslookup 有什么区别? nslookup 是交互式简化工具,dig 输出结构更完整(各 section 分明、TTL 可见、+trace 等查询选项丰富)。脚本里两者都能用,排障首选 dig;host 命令是另一个轻量替代,输出最简。

Q:+short 能指定输出格式吗? +short 只输出记录值本身。要看 TTL 用默认完整输出,或 dig +noall +answer 只保留 ANSWER 段。写脚本处理时还可以 -x 反查或 +yaml 拿结构化输出。

Q:为什么我查到的 IP 和同事的不一样? 正常的。解析结果受解析器位置、GEO 调度、CDN 边缘节点影响。两边先各自 dig @8.8.8.8 域名 +short 指定同一个解析器再比,差异仍存在才说明记录有问题。

Q:公司内网域名能查吗? 能,前提是这台机器的解析器(resolvectl status 里看到的)能解析它。内网域名直接 dig 内网域名 走系统配置的解析器即可,不要用 @8.8.8.8——公共解析器没有你的内网区域数据。

Q:改了 DNS 记录多久生效? 改的是权威侧,保存即生效(用 @权威NS 立刻可验证)。全网可见要等各递归解析器的缓存按 TTL 自然过期,TTL 86400 就是最长一天。迁移记录前先把 TTL 调小到 300,是标准做法。

收束

DNS 排查的完整链条就四步:resolvectl status 确认本机问谁 → dig @公共解析器 +short 排除本机配置 → dig @权威NS 验证改动是否落库 → +trace 兜住剩余的委派链问题。四步走完,“域名不解析”这类问题没有活口。

下次网站打不开,先 dig 再重启。顺序对了,一半的”服务器故障”在 10 秒内就被排除了。