dig —— DNS 权威查询与逐级追踪
dig —— DNS 权威查询与逐级追踪
分类:02 进程与网络诊断 适用:Linux / macOS(bind-utils / dnsutils) 一句话:比
nslookup更完整地展示 DNS 应答,+trace能逐级还原解析链路。
1. 它解决什么问题
- 域名解析出来的 IP 对不对?是不是被缓存了旧记录?
- 解析失败是本地 DNS、权威服务器还是链路问题?
- 邮件、验证、CDN 相关的 TXT/MX/CNAME 配置是否正确。
2. 安装
apt install -y dnsutils # Debian/Ubuntu 提供 dig
dnf install -y bind-utils
apk add bind-tools
3. 基础用法
dig example.com # 完整输出(A 记录)
dig example.com +short # 只要结果,脚本用
dig example.com A # 指定类型
dig example.com AAAA
dig example.com MX
dig example.com TXT
dig example.com NS
dig example.com SOA
dig example.com CNAME
dig -x 8.8.8.8 # 反向解析
dig example.com @8.8.8.8 # 指定 DNS 服务器
dig example.com @223.5.5.5 +short
dig example.com +tcp # 强制 TCP(UDP 被截断时)
dig example.com +noall +answer # 只显示答案段
dig example.com +norecurse # 不做递归(测权威服务器)
dig +dnssec example.com # 查 DNSSEC
4. 输出怎么读
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41234
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 300 IN A 93.184.216.34
;; Query time: 12 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Thu Nov 05 10:22:31 CST 2026
| 字段 | 含义 | 关注点 |
|---|---|---|
status |
应答状态 | NOERROR 正常;NXDOMAIN 域名不存在;SERVFAIL 服务器故障;REFUSED 被拒 |
flags |
qr 应答、rd 期望递归、ra 支持递归、aa 权威应答 |
无 aa 说明是缓存应答 |
ANSWER |
解析结果 | |
| 第二列数字 | TTL(秒) | 决定缓存多久,改解析后要等 TTL 过期 |
Query time |
查询耗时 | 几百毫秒以上说明 DNS 慢 |
SERVER |
实际使用的 DNS | 确认没走错服务器 |
5. +trace 逐级追踪
dig +trace example.com
输出会从根服务器(.)开始,逐级问 .com → example.com 的权威服务器。
用途:
- 确认权威服务器上到底配了什么,排除本地缓存干扰;
- 判断是哪一级委派出了问题;
- 验证新配置是否已在权威生效。
dig +trace +nodnssec example.com # 输出更干净
dig +trace example.com A | grep -E '^example|^;; Received'
6. 常用组合
# 只看答案,带 TTL
dig +noall +answer example.com
# 对比多个公共 DNS 的结果
for ns in 223.5.5.5 119.29.29.29 8.8.8.8 1.1.1.1; do
printf '%-16s ' "$ns"; dig +short @$ns example.com | tr '\n' ' '; echo
done
# 检查权威 NS 是否一致
dig +short NS example.com
dig +nssearch example.com # 逐个问权威,比对 SOA 序列号
# 查 SPF / DKIM / DMARC
dig +short TXT example.com | grep spf
dig +short TXT _dmarc.example.com
# 批量查
while read d; do echo "$d -> $(dig +short "$d" | head -1)"; done < domains.txt
7. 实战场景
7.1 域名解析不对
dig example.com +short # 本机 DNS 的结果
dig example.com @8.8.8.8 +short # 公共 DNS
dig +trace example.com # 权威结果
三种结果对比:
| 现象 | 结论 |
|---|---|
| 本机与公共一致、权威不同 | 缓存未过期,等 TTL 或清缓存 |
| 本机与权威不同、公共与权威一致 | 本地 DNS 缓存问题 |
| 权威本身就没有记录 | 配置未生效或配错 zone |
清缓存:
systemd-resolve --flush-caches # systemd-resolved(老写法)
resolvectl flush-caches # 新写法
systemctl restart nscd 2>/dev/null # 用了 nscd 时
7.2 解析很慢
dig example.com | grep 'Query time'
dig +stats example.com
Query time大但+trace每级都快 → 本地 DNS 转发慢。- 每次都慢,检查
/etc/resolv.conf里是否有不可达的 nameserver(会先超时再换下一个)。
cat /etc/resolv.conf
# 多个 nameserver 时,前一个不通会等 timeout(默认 5 秒 × attempts 2)
7.3 排查 SERVFAIL
dig example.com
dig +trace example.com
dig example.com @<权威NS>
常见原因:权威服务器挂了、DNSSEC 签名过期、zone 文件语法错误、CNAME 链断。
7.4 确认 CDN / 多线路解析
for ns in 223.5.5.5 119.29.29.29 114.114.114.114; do
echo "== $ns"; dig +short @$ns www.example.com
done
不同线路返回不同 IP 是正常的(智能解析)。
7.5 检查 TTL 与切换预案
dig +noall +answer www.example.com
# 迁移前把 TTL 从 3600 降到 60,等旧 TTL 过期后再切
8. 常见坑
dig不读nsswitch.conf,也不走/etc/hosts:它直接查 DNS。验证应用解析要用getent hosts example.com。+short会丢 TTL:检查缓存时必须看完整输出。dig默认使用/etc/resolv.conf的第一个 nameserver,多网卡/容器里常不是你以为的那个。ANY查询基本被禁用:返回NOTIMP或空,别指望用它查全部记录。NXDOMAINvsNODATA:前者域名不存在,后者域名存在但该类型无记录(返回NOERROR且 ANSWER 为空)。后者常被误判。+trace需要能访问根服务器:内网受限环境会超时,属于正常。- search domain 影响短名解析:
ping web01会尝试web01.<search>,dig web01不会,两者结果可能不同。 - 容器内
/etc/resolv.conf被覆盖:Docker 会写入127.0.0.11,dig结果与应用可能一致但看不了上游配置。 nslookup与dig输出不同不代表错误:前者也走 DNS,但展示精简。- TTL 为 0 不代表不缓存:部分递归服务器有最小缓存时间。
9. 速查表
dig <domain> # 完整
dig +short <domain> # 只要 IP
dig <domain> MX|TXT|NS|SOA|AAAA
dig -x <ip> # 反查
dig <domain> @8.8.8.8 # 指定 DNS
dig +trace <domain> # 逐级追踪
dig +noall +answer <domain> # 只看答案(含 TTL)
dig +tcp <domain> # 强制 TCP
dig +dnssec <domain> # DNSSEC
dig +nssearch <domain> # 比对各权威 SOA
# 本机解析(走 hosts 与 nsswitch)
getent hosts <domain>