dig 命令是 BIND DNS 软件包的一部分,用于查询DNS域名服务器。它比 nslookup 更强大,输出更详细,支持更多查询选项,非常适合DNS故障排除和调试。
dig 通常包含在 dnsutils 或 bind-utils 包中:
sudo apt-get install dnsutils
sudo yum install bind-utils
# CentOS 8+使用dnf
sudo dnf install bind-utils
sudo dnf install bind-utils
sudo pacman -S dnsutils
dig -v
dig [@服务器] [域名] [类型] [选项] [+选项]
| 选项 | 说明 |
|---|---|
@服务器 |
指定DNS服务器(如@8.8.8.8) |
域名 |
要查询的域名 |
类型 |
查询记录类型(A、MX、NS、TXT、ANY等) |
+short |
只显示简要结果 |
+noall |
不显示任何内容 |
+answer |
只显示答案部分 |
+stats |
显示查询统计信息 |
+trace |
跟踪DNS解析路径 |
+nocmd |
不显示dig版本信息 |
+nocomments |
不显示注释信息 |
+multiline |
以多行格式显示结果 |
-4 / -6 |
强制使用IPv4或IPv6 |
-p 端口 |
指定DNS服务器端口(默认53) |
-t 类型 |
指定查询类型 |
-x IP地址 |
反向DNS查询 |
-f 文件 |
从文件批量读取域名 |
-h |
显示帮助信息 |
一个完整的dig查询结果包含以下部分:
; <<>> DiG 9.11.3-1ubuntu1.18-Ubuntu <<>> google.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
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 300 IN A 142.250.185.4
;; Query time: 45 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Jan 05 10:00:00 UTC 2024
;; MSG SIZE rcvd: 55
| 部分 | 说明 |
|---|---|
| Header | 显示查询头信息(opcode、状态、ID、标志位) |
| QUESTION SECTION | 显示查询的问题(域名、类型、类) |
| ANSWER SECTION | 查询结果,包含域名解析记录 |
| AUTHORITY SECTION | 权威DNS服务器信息 |
| ADDITIONAL SECTION | 附加信息 |
| Stats | 查询统计(时间、服务器、时间戳、消息大小) |
# 查询域名的A记录
dig google.com
# 查询A记录(简洁输出)
dig google.com +short
# 查询所有记录类型
dig google.com ANY
# 使用Google DNS服务器
dig @8.8.8.8 google.com
# 使用Cloudflare DNS
dig @1.1.1.1 google.com
# 使用本地DNS服务器
dig @192.168.1.1 google.com
# 查询MX记录(邮件服务器)
dig google.com MX
# 查询NS记录(域名服务器)
dig google.com NS
# 查询TXT记录
dig google.com TXT
# 查询CNAME记录
dig www.google.com CNAME
# 查询SOA记录
dig google.com SOA
# 查询AAAA记录(IPv6)
dig google.com AAAA
# 根据IP查询域名
dig -x 8.8.8.8
# 指定DNS服务器的反向查询
dig @8.8.8.8 -x 142.250.185.4
# 只显示答案部分
dig google.com +noall +answer
# 简洁格式(去除所有额外信息)
dig google.com +short
# 去除注释和版本信息
dig google.com +nocmd +nocomments +noquestion
# 只显示特定部分
dig google.com +noall +answer +stats
# 跟踪DNS解析全过程
dig google.com +trace
# 从根服务器开始跟踪
dig google.com +trace +nodnssec
# 创建域名列表文件
echo -e "google.com\ngithub.com\nstackoverflow.com" > domains.txt
# 批量查询
dig -f domains.txt +short
# 批量查询MX记录
for domain in google.com github.com; do
echo "=== $domain ==="
dig $domain MX +short
done
# 显示详细查询过程
dig google.com +dnssec +multiline
# 查询DNSKEY记录
dig google.com DNSKEY
# 检查DNSSEC验证
dig google.com +dnssec +cd
| 标志位 | 含义 | 说明 |
|---|---|---|
qr |
查询/响应 | qr=1表示响应,qr=0表示查询 |
aa |
权威答案 | 响应来自权威DNS服务器 |
tc |
截断 | 响应被截断(UDP数据包太大) |
rd |
递归期望 | 查询时设置了递归期望 |
ra |
递归可用 | 服务器支持递归查询 |
ad |
已验证 | 响应数据已通过DNSSEC验证 |
cd |
检查禁用 | 查询时禁用了DNSSEC检查 |
# 创建dig查询函数
digall() {
domain=$1
echo "=== A记录 ==="
dig $domain A +short
echo "=== AAAA记录 ==="
dig $domain AAAA +short
echo "=== MX记录 ==="
dig $domain MX +short
echo "=== NS记录 ==="
dig $domain NS +short
echo "=== TXT记录 ==="
dig $domain TXT +short
}
# 使用函数
digall google.com
# 测试不同DNS服务器的响应时间
time dig @8.8.8.8 google.com +stats > /dev/null
time dig @1.1.1.1 google.com +stats > /dev/null
time dig @9.9.9.9 google.com +stats > /dev/null
# 使用多个DNS服务器检查域名解析
servers=("8.8.8.8" "1.1.1.1" "9.9.9.9" "208.67.222.222")
domain="example.com"
for server in "${servers[@]}"; do
echo "服务器: $server"
dig @$server $domain +short
echo "---"
done
# 获取域名的TTL值
dig google.com +noall +answer +ttlid
# 批量检查TTL
dig google.com NS +noall +answer | awk '{print $2}' | while read ns; do
echo "NS: $ns"
dig @$ns google.com +noall +answer +ttlid
done
#!/bin/bash
DOMAINS=("google.com" "github.com" "stackoverflow.com")
DNS_SERVER="8.8.8.8"
LOG_FILE="/var/log/dns_check.log"
for DOMAIN in "${DOMAINS[@]}"; do
if dig @$DNS_SERVER $DOMAIN +short > /dev/null 2>&1; then
echo "$(date): $DOMAIN - OK" >> $LOG_FILE
else
echo "$(date): $DOMAIN - FAILED" >> $LOG_FILE
fi
done
# 检查DNS服务器是否支持递归
dig @target_dns google.com +norecurse
# 如果返回ra标志,说明支持递归查询
# 检查DNS响应大小
dig @target_dns google.com ANY +dnssec | grep "MSG SIZE"
| 特性 | dig | nslookup |
|---|---|---|
| 输出详细程度 | 非常详细,包含所有DNS信息 | 相对简单 |
| 脚本友好性 | 输出格式稳定,易于解析 | 输出格式可能变化 |
| 调试功能 | 强大的调试选项(+trace等) | 有限 |
| DNSSEC支持 | 完整支持 | 有限支持 |
| 批量查询 | 支持(-f选项) | 需要脚本支持 |
| 交互模式 | 无 | 有 |
| 易用性 | 需要学习选项 | 相对简单 |
| 推荐用途 | 专业DNS调试、脚本处理 | 快速简单查询 |
A: SERVFAIL表示DNS服务器无法处理查询。可能原因:
# 检查权威DNS服务器
dig example.com NS
# 查询权威服务器
dig @ns1.example.com example.com
A: 这通常表示DNS解析链中的某个环节有问题。使用+trace查看在哪一步失败:
dig example.com +trace +all
检查每个步骤的响应,找到失败的点。
A: 使用不同的DNS服务器查询同一个域名,比较结果:
# 比较权威服务器和公共DNS的结果
dig @ns1.example.com example.com +short
dig @8.8.8.8 example.com +short
dig @1.1.1.1 example.com +short
如果结果不一致,可能存在缓存污染。
A: 可以尝试以下优化:
# 快速查询
dig @8.8.8.8 google.com +short
# 强制TCP
dig google.com +tcp
+multiline选项查看完整的DNS记录awk、grep处理dig输出+bufsize=4096避免UDP响应截断