Linux dig命令详解

dig(Domain Information Groper)是Linux中最强大和灵活的DNS查询工具,提供详细的DNS查询结果和调试信息,是网络管理员的首选工具。

一、命令简介

dig 命令是 BIND DNS 软件包的一部分,用于查询DNS域名服务器。它比 nslookup 更强大,输出更详细,支持更多查询选项,非常适合DNS故障排除和调试。

优势: dig 提供比 nslookup 更详细的信息,输出格式更适合脚本处理,是DNS调试的专业工具。

二、安装dig

dig 通常包含在 dnsutils 或 bind-utils 包中:

Ubuntu/Debian

sudo apt-get install dnsutils

CentOS/RHEL

sudo yum install bind-utils

# CentOS 8+使用dnf
sudo dnf install bind-utils

Fedora

sudo dnf install bind-utils

Arch Linux

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查询结果包含以下部分:

典型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 查询统计(时间、服务器、时间戳、消息大小)

六、使用示例

示例1:基本域名查询

# 查询域名的A记录
dig google.com

# 查询A记录(简洁输出)
dig google.com +short

# 查询所有记录类型
dig google.com ANY

示例2:指定DNS服务器

# 使用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

示例3:查询特定记录类型

# 查询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

示例4:反向DNS查询

# 根据IP查询域名
dig -x 8.8.8.8

# 指定DNS服务器的反向查询
dig @8.8.8.8 -x 142.250.185.4

示例5:简化输出格式

# 只显示答案部分
dig google.com +noall +answer

# 简洁格式(去除所有额外信息)
dig google.com +short

# 去除注释和版本信息
dig google.com +nocmd +nocomments +noquestion

# 只显示特定部分
dig google.com +noall +answer +stats

示例6:跟踪DNS解析路径

# 跟踪DNS解析全过程
dig google.com +trace

# 从根服务器开始跟踪
dig google.com +trace +nodnssec

示例7:批量查询

# 创建域名列表文件
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

示例8:调试DNS问题

# 显示详细查询过程
dig google.com +dnssec +multiline

# 查询DNSKEY记录
dig google.com DNSKEY

# 检查DNSSEC验证
dig google.com +dnssec +cd

七、dig的查询标志位

标志位 含义 说明
qr 查询/响应 qr=1表示响应,qr=0表示查询
aa 权威答案 响应来自权威DNS服务器
tc 截断 响应被截断(UDP数据包太大)
rd 递归期望 查询时设置了递归期望
ra 递归可用 服务器支持递归查询
ad 已验证 响应数据已通过DNSSEC验证
cd 检查禁用 查询时禁用了DNSSEC检查

八、实用技巧

1. 一键获取域名所有信息

# 创建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

2. DNS查询时间测试

# 测试不同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

3. 检查DNS传播状态

# 使用多个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

4. 查询域名TTL值

# 获取域名的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

5. 创建DNS监控脚本

#!/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

6. 使用dig进行DNS放大攻击检测

注意: 仅用于防御和检测目的
# 检查DNS服务器是否支持递归
dig @target_dns google.com +norecurse
# 如果返回ra标志,说明支持递归查询

# 检查DNS响应大小
dig @target_dns google.com ANY +dnssec | grep "MSG SIZE"

九、dig与nslookup对比

特性 dig nslookup
输出详细程度 非常详细,包含所有DNS信息 相对简单
脚本友好性 输出格式稳定,易于解析 输出格式可能变化
调试功能 强大的调试选项(+trace等) 有限
DNSSEC支持 完整支持 有限支持
批量查询 支持(-f选项) 需要脚本支持
交互模式
易用性 需要学习选项 相对简单
推荐用途 专业DNS调试、脚本处理 快速简单查询

十、常见问题

Q: dig查询返回SERVFAIL错误

A: SERVFAIL表示DNS服务器无法处理查询。可能原因:

  1. 域名不存在或配置错误
  2. DNS服务器故障
  3. DNSSEC验证失败
  4. 区域文件语法错误
# 检查权威DNS服务器
dig example.com NS
# 查询权威服务器
dig @ns1.example.com example.com
Q: dig +trace显示查询过程,但最终失败

A: 这通常表示DNS解析链中的某个环节有问题。使用+trace查看在哪一步失败:

dig example.com +trace +all

检查每个步骤的响应,找到失败的点。

Q: 如何用dig检查DNS缓存污染?

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

如果结果不一致,可能存在缓存污染。

Q: dig查询很慢怎么办?

A: 可以尝试以下优化:

  1. 指定更快的DNS服务器
  2. 使用+short选项减少输出
  3. 禁用DNSSEC检查(+cd)
  4. 使用+tcp强制TCP查询(某些情况下更快)
# 快速查询
dig @8.8.8.8 google.com +short

# 强制TCP
dig google.com +tcp
注意事项:
  • dig查询默认使用递归,除非指定+norecurse
  • 大量查询可能被DNS服务器限制,注意查询频率
  • 某些DNS记录(如AXFR)需要权限才能查询
  • DNSSEC查询需要额外的计算资源
  • dig版本不同可能导致选项略有差异
专业技巧:
  • 使用+multiline选项查看完整的DNS记录
  • 结合awkgrep处理dig输出
  • 使用+bufsize=4096避免UDP响应截断
  • 定期用dig监控关键域名的解析状态
  • 了解EDNS(Extension Mechanisms for DNS)选项