Linux dig指令

Linux-dig指令

dig(域信息收集器,Domain Information Groper)是一款用于DNS查询的命令行工具。它非常灵活和强大,提供了对各种DNS记录类型的查询能力,并能够从不同的DNS服务器获取信息。这使得dig成为网络管理员和开发人员调试和诊断DNS问题的利器。

安装和基本用法

在大多数Linux发行版上,dig通常由dnsutils或bind-utils包提供。如果系统中没有安装dig,可以通过以下命令进行安装:

# Debian/Ubuntu
sudo apt-get update
sudo apt-get install dnsutils

# CentOS/RHEL
sudo yum install bind-utils

安装完成后,可以通过运行dig命令来验证安装:

dig -v

这将显示dig的版本信息,确认安装成功。

基本查询

查询A记录

A记录(Address Record)将域名解析为IPv4地址。要查询某个域名的A记录,可以运行:

dig example.com

默认情况下,dig命令会查询A记录,并输出详细的查询结果。

查询特定类型的记录

要查询特定类型的DNS记录,可以在命令中指定记录类型。例如:

查询MX记录(邮件交换记录):

dig example.com MX

查询CNAME记录(别名记录):

dig example.com CNAME

查询特定DNS服务器

默认情况下,dig命令使用系统配置的DNS服务器。如果需要查询特定的DNS服务器,可以在命令中指定:

dig @8.8.8.8 example.com

这里,8.8.8.8是Google的公共DNS服务器。

输出解释

dig命令的输出包含多个部分:

1. Header:包含查询的基本信息,如查询ID、标志、响应代码等。

2. QUESTION SECTION:显示查询的域名和记录类型。

3. ANSWER SECTION:显示DNS服务器返回的查询结果。

4. AUTHORITY SECTION:显示权威DNS服务器的信息。

5. ADDITIONAL SECTION:显示额外的附加信息。

示例输出:

; <<>> DiG 9.11.3-1ubuntu1.13-Ubuntu <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15725
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            299     IN      A       93.184.216.34

;; AUTHORITY SECTION:
example.com.            172799  IN      NS      b.iana-servers.net.
example.com.            172799  IN      NS      a.iana-servers.net.

;; ADDITIONAL SECTION:
a.iana-servers.net.     172799  IN      A       199.43.135.53

;; Query time: 38 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Feb 17 17:52:38 UTC 2021
;; MSG SIZE  rcvd: 124

各部分详细说明

  • Header:显示查询的总体信息,包括查询的ID、查询的状态(如NOERROR表示没有错误)、标志(如QR表示这是一个查询响应,RD表示递归查询)。
  • QUESTION SECTION:显示查询的具体内容,包括查询的域名和记录类型。
  • ANSWER SECTION:显示查询的结果,包含了DNS服务器返回的记录。
  • AUTHORITY SECTION:显示提供该信息的权威DNS服务器。
  • ADDITIONAL SECTION:显示额外的DNS信息,例如权威服务器的IP地址。

高级用法

反向DNS查询

反向DNS查询用于将IP地址解析为域名。使用-x选项进行反向查询:

dig -x 93.184.216.34

这将返回与该IP地址相关的域名。

查询多个记录类型

可以一次查询多个记录类型。通过将多个类型放在+short选项后,可以简化输出,只显示结果:

dig example.com A +short
dig example.com MX +short

批量查询

可以将多个查询放在一个文件中,然后使用-f选项进行批量查询:

example.com A
example.com MX
example.com CNAME

保存为queries.txt,然后运行:

dig -f queries.txt

自定义查询选项

dig命令提供了许多选项来定制查询和输出。例如,使用+nocmd选项隐藏命令部分,使用+noall选项隐藏所有部分,然后通过+answer只显示答案部分:

dig example.com +nocmd +noall +answer

指定查询端口

默认情况下,dig命令使用端口53进行查询。如果DNS服务器运行在不同的端口,可以使用-p选项指定端口:

dig @8.8.8.8 -p 5353 example.com

EDNS(扩展DNS)

EDNS扩展了传统DNS协议,允许在查询中包含更多信息。使用+edns选项可以启用EDNS:

dig example.com +edns

使用案例

1. DNS故障排除

在排除DNS故障时,可以使用dig命令检查特定域名的解析情况。例如,检查某网站无法访问时,可以首先查询其DNS记录,确认是否正确解析:

dig example.com

如果解析正常,但仍无法访问,可以进一步检查权威DNS服务器:

dig example.com NS

2. 验证邮件服务器配置

在设置邮件服务器时,可以使用dig命令验证MX记录是否正确配置:

dig example.com MX

同时,可以查询TXT记录,验证SPF(发件人策略框架,Sender Policy Framework)配置:

dig example.com TXT

3. 监控DNS变化

可以编写脚本定期查询DNS记录,并与之前的结果进行对比,监控DNS记录的变化。例如,使用cron定期运行脚本,将查询结果保存到文件,然后比较文件内容:

#!/bin/bash
dig example.com A +short > /tmp/example.com.a.record.new
if ! cmp -s /tmp/example.com.a.record.old /tmp/example.com.a.record.new;then
    echo "DNS A record for example.com has changed!"
    mv /tmp/example.com.a.record.new /tmp/example.com.a.record.old
fi

在cron中设置定期运行:

*/5 * * * * /path/to/script.sh

脚本和自动化

dig命令可以与脚本结合使用,实现自动化DNS查询。例如,使用bash脚本批量查询多个域名的A记录:

#!/bin/bash
domains=("example.com" "example.net" "example.org")
for domain in "${domains[@]}";do
    echo "Querying A record for $domain"
    dig $domain A +short
done

这将依次查询example.com、example.net和example.org的A记录,并输出结果。

扩展功能

1. TSIG(Transaction SIGnature)

TSIG用于对DNS消息进行签名和验证。可以使用TSIG来确保DNS查询和响应的完整性和真实性。配置TSIG时,需要预共享密钥:

key example-key {
    algorithm hmac-md5;
    secret "base64encodedsecret==";
};

在查询中使用TSIG:

dig @example.com -y hmac-md5:example-key:base64encodedsecret== example.com

2. DNSSEC(DNS Security Extensions)

DNSSEC提供了一种机制来验证DNS数据的真实性和完整性。要启用DNSSEC查询,可以使用+dnssec选项:

dig example.com +dnssec

这将返回DNSSEC相关的记录,如RRSIG(资源记录签名)和DNSKEY(DNS密钥)。

3. 调整超时和重试次数

可以使用+time和+retry选项来调整查询超时和重试次数。例如,设置超时未5秒,重试3次:

dig example.com +time=5 +retry=3

这里,+time=5表示设置超时时间为5秒,+retry=3表示重试3次。

4. 调整UDP和TCP查询

默认情况下,dig命令使用UDP进行DNS查询。如果需要使用TCP,可以使用+tcp选项:

dig example.com +tcp

同样地,可以使用+notcp选项强制使用UDP:

dig example.com +notcp

5. 查询TTL(生存时间)

可以通过+ttl选项查看DNS记录的TTL值,TTL表示DNS记录在缓存中的存留时间:

dig example.com +ttl

6. 查询所有记录

要查询一个域名的所有记录,可以使用ANY类型:

dig example.com ANY

但是,请注意,某些DNS服务器可能会限制ANY查询,以防止滥用。

综合实例

1. 查询并解析多个记录类型

以下示例展示了如何查询多个记录类型,并解析输出信息:

dig example.com A
dig example.com MX
dig example.com NS
dig example.com TXT

2. 查询特定DNS服务器的记录

指定特定的DNS服务器进行查询:

dig @8.8.8.8 example.com A
dig @1.1.1.1 example.com MX

3. 使用Bash脚本进行批量查询

编写一个Bash脚本,批量查询多个域名的A记录和MX记录:

#!/bin/bash

domains=("example.com" "example.net" "example.org")

for domain in "${domains[@]}";do
    echo "Querying A record for $domain"
    dig $domain A +short
    echo "Querying MX record for $domain"
    dig $domain MX +short
done

保存为query_domains.sh,然后运行:

chmod +x query_domains.sh
./query_domains.sh

4. 定期监控DNS记录变化

通过cron定期监控DNS记录的变化。例如,编写一个脚本,每小时检查一次某个域名的A记录,如果记录发生变化,发送通知:

#!/bin/bash

DOMAIN="example.com"
OLD_RECORD="/tmp/${DOMAIN}_a_record_old"
NEW_RECORD="/tmp/${DOMAIN}_a_record_new"

# 查询A记录并保存到文件
dig $DOMAIN A +short > $NEW_RECORD

# 如果旧记录存在,比较新的旧记录
if [ -f $OLD_RECORD ];then
    if ! cmp -s $OLD_RECORD $NEW_RECORD;then
        echo "DNS A record for $DOMAIN has changed!"
        # 发送通知(可以使用邮件、Slack等)
        # mail -s "DNS A record change" user@example.com < $NEW_RECORD
    fi
fi

# 更新旧记录文件
mv $NEW_RECORD $OLD_RECORD

在cron中设置定期运行:

0 * * * * /path/to/monitor_dns.sh

高级功能

1. 查询特定的记录字段

使用+norecurse选项,可以避免DNS服务器进行递归查询,只返回权威服务器的响应:

dig example.com +norecurse

2. 使用TCP进行查询

某些情况下需要使用TCP进行DNS查询,例如处理较大响应或穿越防火墙:

dig example.com +tcp

3. 批量查询和输出格式化

使用-t选项指定查询类型,使用+short简化输出:

dig example.com -t A +short
dig example.com -t MX +short

批量查询多个域名,并将结果保存到文件中:

#!/bin/bash

domains=("example.com" "example.net" "example.org")
output_file="dns_results.txt"

> $output_file

for domain in "${domains[@]}";do
    echo "Querying A record for $domain" >> $output_file
    dig $domain A +short >> $output_file
    echo "Querying MX record for $domain" >> $output_file
    dig $domain MX +short >> $output_file
done

4. 使用EDNS进行扩展查询

EDNS扩展了传统DNS协议,允许在查询中包含更多信息。使用+edns选项可以启用EDNS:

dig example.com +edns

5. 使用TSIG进行安全查询

TSIG(Trnsaction SIGnature)用于对DNS消息进行签名和验证,确保查询和响应的完整性和真实性。首先需要配置TSIG密钥:

key example-key {
    algorithm hmac-md5;
    secret "base64encodedsecret==";
};

然后在查询中使用TSIG:

dig @example.com -y hmac-md5:example-key:base64encodedsecret== example.com

6. DNSSEC查询

DNSSEC(DNS Security Extensions)提供了一种机制来验证DNS数据的真实性和完整性。启用DNSSEC查询:

dig example.com +dnssec

这将返回DNSSEC相关的记录,如RRSIG(资源记录签名)和DNSKEY(DNS密钥)。

高级案例

1. 结合其他工具进行综合网络诊断

dig可以与其他网络诊断工具(如ping、traceroute、curl等)结合使用,进行综合网络诊断。例如:

#!/bin/bash

domains=("example.com" "example.net" "example.org")

for domain in "${domain[@]}";do
    echo "Querying A record for $domain"
    dig $domain A +short
    echo "Pinging $domain"
    ping -c 4 $domain
    echo "Traceroute to $domain"
    traceroute $domain
done

2. 通过API查询并解析DNS记录

可以使用API(如Cloudflare的API)结合dig进行DNS记录的查询和解析。例如,通过API获取域名列表,然后使用dig查询:

#!/bin/bash

# 获取域名列表(假设API返回JSON格式)
domain=$(curl -s "https://api.cloudflare.com/client/v4/zones" -H "Authorization:Bearer YOUR_API_TOKEN" | jq -r ".result[].name")

for domain in $domains;do
    echo "Querying A record for $domain"
    dig $domain A +short
done

3. 定期备份和恢复DNS记录

使用dig命令定期备份DNS记录,然后在需要时恢复:

#!/bin/bash

# 定期备份DNS记录
backup_dir="/path/to/backup"
domains=("example.com" "example.net" "example.org")

for domain in "${domains[@]}";do
    dig $domain ANY > $backup_dir/$domain.dns
done

# 恢复DNS记录
for domain in "${domains[@]}";do
    nsupdate -k /path/to/key <<EOF
server your.dns.server
zone $domain
update delete $domain
update add $(cat $backup_dir/$domain.dns)
send
EOF
done

4. 使用dig进行DNS性能测试

使用dig命令进行DNS性能测试,例如查询时间、响应大小等:

#!/bin/bash

domain="example.com"
dns_server=("8.8.8.8" "1.1.1.1" "9.9.9.9")

for server in "${dns_server[@]}";do
    echo "Querying $domain on DNS server $server"
    dig @$server $domain +status +time=5
done

总结

dig命令时Linux系统中功能强大的DNS查询工具,具有广泛的应用场景。通过掌握其基本用法和高级功能,可以有效地进行DNS调试和故障排除。无论是在日常运维还是自动化脚本中,dig都是不可或缺的工具。

更多技术分享,关注:halugin

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容