dig 命令 #
dig
(Domain Information Groper)是一个功能强大的DNS查询工具,用于查询DNS服务器以获取域名系统信息。它提供了灵活的查询选项和详细的输出,是DNS故障排除和分析的首选工具。
语法 #
dig [@服务器] [选项] [名称] [类型] [类] [+查询选项]
常用选项 #
选项 | 描述 |
---|---|
@服务器 |
指定要查询的DNS服务器(IP地址或主机名) |
-4 |
强制使用IPv4 |
-6 |
强制使用IPv6 |
-b 地址 |
设置源IP地址 |
-f 文件 |
从文件批量查询 |
-k 密钥文件 |
使用TSIG签名查询 |
-p 端口 |
指定DNS服务器端口(默认53) |
-q 名称 |
指定要查询的域名 |
-t 类型 |
指定查询类型(A, AAAA, MX, NS等) |
-x 地址 |
执行反向查询 |
+[no]tcp |
使用[不使用]TCP而不是UDP |
+[no]short |
简短输出 |
+[no]identify |
显示[不显示]IP地址和端口号 |
+[no]trace |
跟踪从根名称服务器到权威服务器的委托路径 |
+[no]recurse |
允许[禁止]递归查询 |
+[no]dnssec |
请求DNSSEC记录 |
+[no]multiline |
以多行格式打印记录 |
+[no]answer |
显示[不显示]回答部分 |
+[no]authority |
显示[不显示]权威部分 |
+[no]additional |
显示[不显示]附加部分 |
+[no]all |
设置或清除所有显示标志 |
+time=T |
设置查询超时为T秒 |
+tries=N |
设置UDP尝试次数为N |
常见DNS记录类型 #
记录类型 | 描述 |
---|---|
A |
IPv4地址记录 |
AAAA |
IPv6地址记录 |
CNAME |
规范名称记录(别名) |
MX |
邮件交换记录 |
NS |
名称服务器记录 |
PTR |
指针记录(反向DNS) |
SOA |
权威起始记录 |
TXT |
文本记录 |
SRV |
服务定位记录 |
CAA |
证书颁发机构授权记录 |
DNSKEY |
DNS密钥记录 |
DS |
委托签名者记录 |
RRSIG |
资源记录签名 |
NSEC |
下一个安全记录 |
ANY |
所有记录(可能被某些服务器限制) |
输出说明 #
dig
命令的标准输出包含以下几个部分:
- 头部信息:包含dig版本、查询参数等
- 查询部分:显示查询的内容
- 回答部分:包含DNS服务器返回的记录
- 权威部分:包含权威名称服务器信息
- 附加部分:包含额外的相关信息
- 统计部分:显示查询时间、服务器信息等
常见用法 #
1. 基本查询 #
dig example.com
这将查询example.com的A记录。
2. 查询特定记录类型 #
dig example.com MX
这将查询example.com的MX(邮件交换器)记录。
3. 使用特定DNS服务器 #
dig @8.8.8.8 example.com
这将使用Google的DNS服务器(8.8.8.8)查询example.com。
4. 反向DNS查询 #
dig -x 8.8.8.8
这将执行8.8.8.8的反向DNS查询,查找与该IP地址关联的域名。
5. 简短输出 #
dig +short example.com
这将只显示查询结果,没有其他详细信息。
6. 跟踪DNS解析过程 #
dig +trace example.com
这将显示从根名称服务器到权威服务器的完整解析路径。
7. 查询所有记录类型 #
dig example.com ANY
这将尝试查询example.com的所有记录类型(注意:许多DNS服务器现在限制ANY查询)。
8. 显示DNSSEC信息 #
dig +dnssec example.com
这将包含DNSSEC记录(如果可用)。
9. 使用TCP而不是UDP #
dig +tcp example.com
这将使用TCP协议而不是默认的UDP协议进行查询。
10. 设置查询超时 #
dig +time=5 example.com
这将设置查询超时为5秒。
实用示例 #
1. 检查域名的权威名称服务器 #
dig example.com NS
2. 查询域名的邮件服务器 #
dig example.com MX +short
3. 检查域名的TXT记录(常用于SPF、DKIM等) #
dig example.com TXT
4. 检查域名的SOA记录 #
dig example.com SOA
5. 比较不同DNS服务器的响应 #
dig @8.8.8.8 example.com
dig @1.1.1.1 example.com
6. 检查DNS传播情况 #
for server in 8.8.8.8 1.1.1.1 9.9.9.9; do
echo "=== $server ==="
dig @$server example.com +short
done
7. 检查IPv6地址 #
dig example.com AAAA
8. 检查域名的CNAME记录 #
dig www.example.com CNAME
9. 检查反向DNS是否正确配置 #
ip=$(dig example.com +short)
dig -x $ip +short
10. 检查DNSSEC验证 #
dig +dnssec +multi example.com
高级用法 #
1. 批量查询 #
创建一个包含域名的文件:
example.com
google.com
github.com
然后使用-f
选项:
dig -f domains.txt +short
2. 使用特定端口的DNS服务器 #
dig @dns.example.com -p 5353 example.com
3. 查询特定类型的所有记录 #
dig example.com ANY +noall +answer
4. 检查DNS响应时间 #
dig example.com +stats | grep "Query time"
5. 检查EDNS客户端子网 #
dig +subnet=192.168.0.0/24 @8.8.8.8 www.google.com
6. 检查特定区域的权威服务器 #
dig +nssearch example.com
7. 检查DKIM记录 #
dig selector._domainkey.example.com TXT
8. 检查SPF记录 #
dig example.com TXT | grep "v=spf1"
9. 检查DMARC记录 #
dig _dmarc.example.com TXT
10. 检查CAA记录 #
dig example.com CAA
与其他DNS工具的比较 #
工具 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
dig | 功能强大、详细输出、灵活查询选项 | 输出可能过于详细、学习曲线 | DNS故障排除、详细分析 |
nslookup | 交互式界面、简单易用 | 功能较少、输出不如dig详细 | 快速DNS查询 |
host | 简单、易读输出 | 功能有限 | 基本DNS查询 |
whois | 提供域名注册信息 | 不是专门的DNS查询工具 | 域名所有权和注册信息查询 |
drill | 类似dig,支持DNSSEC | 不是所有系统默认安装 | DNSSEC验证和分析 |
常见问题排查 #
1. NXDOMAIN响应 #
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 12345
这表示域名不存在。可能的原因:
- 域名拼写错误
- 域名未注册
- DNS记录尚未传播
2. SERVFAIL响应 #
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 12345
可能的原因:
- DNS服务器配置错误
- DNSSEC验证失败
- 递归服务器无法联系权威服务器
3. 超时 #
; <<>> DiG 9.16.1-Ubuntu <<>> example.com
;; global options: +cmd
;; connection timed out; no servers could be reached
可能的原因:
- DNS服务器不可达
- 网络连接问题
- 防火墙阻止
4. 不一致的结果 #
如果不同DNS服务器返回不同结果,可能是由于:
- DNS传播延迟
- DNS缓存
- 地理位置DNS负载均衡
提示 #
- 使用
+short
选项可以获得简洁的输出,便于脚本处理 - 使用
+noall +answer
可以只显示回答部分 - 使用
+trace
可以了解完整的DNS解析路径,有助于排查复杂问题 - 比较不同DNS服务器的响应可以帮助识别DNS传播或缓存问题
- 在脚本中使用dig时,使用
+short
和+timeout
选项可以提高可靠性 - 使用
@
选项可以测试特定DNS服务器的响应,有助于排查DNS服务器问题 - 对于大型DNS部署,创建批处理脚本可以自动化检查多个域名或记录
- 使用
+stats
可以查看查询时间,有助于评估DNS性能 - 在排查邮件问题时,检查MX、SPF、DKIM和DMARC记录
- 在排查网站问题时,检查A、AAAA、CNAME和NS记录