dig —— DNS 权威查询与逐级追踪

运维工具手册 02-进程与网络诊断 4.7 KB 原文

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. 常见坑

  1. dig 不读 nsswitch.conf,也不走 /etc/hosts:它直接查 DNS。验证应用解析要用 getent hosts example.com。
  2. +short 会丢 TTL:检查缓存时必须看完整输出。
  3. dig 默认使用 /etc/resolv.conf 的第一个 nameserver,多网卡/容器里常不是你以为的那个。
  4. ANY 查询基本被禁用:返回 NOTIMP 或空,别指望用它查全部记录。
  5. NXDOMAIN vs NODATA:前者域名不存在,后者域名存在但该类型无记录(返回 NOERROR 且 ANSWER 为空)。后者常被误判。
  6. +trace 需要能访问根服务器:内网受限环境会超时,属于正常。
  7. search domain 影响短名解析:ping web01 会尝试 web01.<search>,dig web01 不会,两者结果可能不同。
  8. 容器内 /etc/resolv.conf 被覆盖:Docker 会写入 127.0.0.11,dig 结果与应用可能一致但看不了上游配置。
  9. nslookup 与 dig 输出不同不代表错误:前者也走 DNS,但展示精简。
  10. 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>
dig —— DNS 权威查询与逐级追踪 - 知识库 - 起航社区