dig命令

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命令的标准输出包含以下几个部分:

  1. 头部信息:包含dig版本、查询参数等
  2. 查询部分:显示查询的内容
  3. 回答部分:包含DNS服务器返回的记录
  4. 权威部分:包含权威名称服务器信息
  5. 附加部分:包含额外的相关信息
  6. 统计部分:显示查询时间、服务器信息等

常见用法 #

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记录