安装dig
为了使用 dig 命令,我们必须先安装它。
在 CentOS/RHEL/Fedora 中,dig 是 'bind-utils' 包的一部分。
CentOS/RHEL/Fedora
[jack@onitroad ~]# yum install bind-utils -y
对于基于 Debian/Ubuntu 的发行版,它来自“dnsutils”包。
Debian/Ubuntu
jack@onitroad:~# apt-get install dnsutils -y
如何使用 dig - 命令示例
- 1.基本DNS查询
在最简单的形式中,我们可以在 dig 命令后指定一个域名,它将执行 DNS 查找,如下所示。
[jack@onitroad ~]# dig google.com ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> google.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32702 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; MBZ: 0005 , udp: 4000 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 5 IN A 216.58.220.110 ;; Query time: 27 msec ;; SERVER: 192.168.220.2#53(192.168.220.2) ;; WHEN: Tue Sep 06 09:13:28 AEST 2014 ;; MSG SIZE rcvd: 55
在此输出中,我们可以看到 google.com 有一条 A 记录指向 IP 地址 216.58.220.110.
默认情况下,没有指定名称服务器,将使用 /etc/resolv.conf 文件中的 DNS 解析器,dig 还将查找未指定其他选项的 A 记录。
- 查询特定名称服务器
在上面的示例中,我们没有查询任何特定的名称服务器,因此我们的查询将被发送到我们的 /etc/resolv.conf 文件中配置的任何内容,该文件将包含我们的 Linux 系统配置使用的 DNS 解析器。我们可以使用@ 符号指定一个名称服务器来发送查询,后跟要与之通信的名称服务器的主机名或者 IP 地址。
- 查询特定名称服务器
[jack@onitroad ~]# dig @8.8.8.8 google.com ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> @8.8.8.8 google.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62632 ;; flags: qr rd ra; QUERY: 1, ANSWER: 15, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 299 IN A 150.101.161.222 google.com. 299 IN A 150.101.161.251 google.com. 299 IN A 150.101.161.237 google.com. 299 IN A 150.101.161.221 google.com. 299 IN A 150.101.161.219 google.com. 299 IN A 150.101.161.230 google.com. 299 IN A 150.101.161.241 google.com. 299 IN A 150.101.161.226 google.com. 299 IN A 150.101.161.234 google.com. 299 IN A 150.101.161.207 google.com. 299 IN A 150.101.161.245 google.com. 299 IN A 150.101.161.236 google.com. 299 IN A 150.101.161.211 google.com. 299 IN A 150.101.161.249 google.com. 299 IN A 150.101.161.215 ;; Query time: 166 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Tue Sep 06 09:15:17 AEST 2014 ;; MSG SIZE rcvd: 279
请注意,由于我们现在正在指定一些外部名称服务器进行查询,因此我们的网络需要允许在端口 53 上对该目的地进行出站访问,否则查询将失败。
- 搜索记录类型
到目前为止,我们已经看到默认情况下 dig 将返回 A 记录,但是我们可以通过简单地将记录类型添加到查询的末尾来指定我们希望查询的任何其他记录。在本例中,我们查找与 google.com 关联的 MX 记录。
- 搜索记录类型
[jack@onitroad ~]# dig @8.8.8.8 google.com MX ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> @8.8.8.8 google.com MX ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39927 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;google.com. IN MX ;; ANSWER SECTION: google.com. 599 IN MX 30 alt2.aspmx.l.google.com. google.com. 599 IN MX 40 alt3.aspmx.l.google.com. google.com. 599 IN MX 10 aspmx.l.google.com. google.com. 599 IN MX 50 alt4.aspmx.l.google.com. google.com. 599 IN MX 20 alt1.aspmx.l.google.com. ;; Query time: 180 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Tue Sep 06 09:17:54 AEST 2014 ;; MSG SIZE rcvd: 147
在这个例子中,我们可以看到 5 个不同的 MX 记录返回,所有记录都有不同的优先级。通常优先级最低的记录会被首先使用,所以在这种情况下 aspmx.l.google.com。
- 4.反向DNS查找
我们可以使用dig命令进行反向DNS查找,即我们可以查询一个IP地址,通过查询PTR记录找到它指向的域名。这是通过使用 -x 选项后跟要查询的 IP 地址来完成的。在下面的示例中,我们对第一个示例中 google.com 解析的 IP 地址之一执行反向查找。
[jack@onitroad ~]# dig -x 216.58.220.110 ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> -x 216.58.220.110 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19387 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; MBZ: 0005 , udp: 4000 ;; QUESTION SECTION: ;110.220.58.216.in-addr.arpa. IN PTR ;; ANSWER SECTION: 110.220.58.216.in-addr.arpa. 5 IN PTR syd10s01-in-f14.1e100.net. 110.220.58.216.in-addr.arpa. 5 IN PTR syd10s01-in-f110.1e100.net. ;; Query time: 2 msec ;; SERVER: 192.168.220.2#53(192.168.220.2) ;; WHEN: Tue Sep 06 09:20:38 AEST 2014 ;; MSG SIZE rcvd: 126
这个IP地址有两条PTR记录,分别指向syd10s01-in-f14.1e100.net和syd10s01-in-f110.1e100.net。
- 追踪 DNS 路径
我们可以使用 +trace 选项对 DNS 查找路径执行跟踪,如下所示,在查询 google.com 时,我们可以看到实际发生的情况。首先是“.”的根名称服务器被查找,然后是 .com 域的名称服务器,最后返回 google.com 的名称服务器,然后是它的 DNS 记录。
- 追踪 DNS 路径
[jack@onitroad ~]# dig google.com +trace ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> google.com +trace ;; global options: +cmd . 5 IN NS h.root-servers.net. . 5 IN NS g.root-servers.net. . 5 IN NS f.root-servers.net. . 5 IN NS e.root-servers.net. . 5 IN NS d.root-servers.net. . 5 IN NS c.root-servers.net. . 5 IN NS b.root-servers.net. . 5 IN NS a.root-servers.net. ;; Received 493 bytes from 192.168.220.2#53(192.168.220.2) in 671 ms com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766 com. 86400 IN RRSIG DS 8 1 86400 20140915170000 20140905160000 46551 . aRW+mmwKW6sWvAef35LCj5ZeQkFrOP8uWwMjQkPIqMfayBRuK1YuqF0h Pu0v4ZBaXPxj0KjmwLIry+Y8p6gIX7lFATfQmUNJcmFxaPYDdEuLYW4S 4idKDZkkEWA3LLUn9OQ0EdioR1PdVr/4xY/u48066DFDx5Vg6aEs1/0Q oXY= ;; Received 734 bytes from 192.203.230.10#53(e.root-servers.net) in 215 ms google.com. 172800 IN NS ns2.google.com. google.com. 172800 IN NS ns1.google.com. google.com. 172800 IN NS ns3.google.com. google.com. 172800 IN NS ns4.google.com. CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20140911044243 20140904033243 27452 com. F8heeEXQl6/iOiPAJxfH/dIE7k6NkI0KDRH+evPdZJV6dUs4bYIfbvwI dIEmEDB1wn28MntLpjEixu+64VusOHrUaOXzg5I26D+UbUmksImr2a/P 39zxhHLIRJgYEUxrE1HrID+xY+PewGq3/aEVvPKofbO7/FyBJlmftQn6 12o= S84AE3BIT99DKIHQH27TRC0584HV5KOH.com. 86400 IN NSEC3 1 1 0 - S84J17P3PT4RKMEJOHNGD73C5Q5NV5S9 NS DS RRSIG S84AE3BIT99DKIHQH27TRC0584HV5KOH.com. 86400 IN RRSIG NSEC3 8 2 86400 20140909045208 20140902034208 27452 com. vxkCSPNnOpLiQNpsk1ZpsQzGMzNdbSpL6Up0Z0njXJrRUdD5eHC/tgnA cHc5mDX2IuuBqU65hZd40U2pSYCBeb5BfaRd9gaQIMyLBbBzd9nj2E+F 8LnTRqa+oXeYQVO1AlfysumdS/CgxwN0CidhCPxPQpPtfdnl6UaKxCzL 5d4= ;; Received 660 bytes from 192.31.80.30#53(d.gtld-servers.net) in 201 ms google.com. 300 IN A 150.101.161.211 google.com. 300 IN A 150.101.161.207 google.com. 300 IN A 150.101.161.221 google.com. 300 IN A 150.101.161.222 google.com. 300 IN A 150.101.161.237 google.com. 300 IN A 150.101.161.245 google.com. 300 IN A 150.101.161.215 google.com. 300 IN A 150.101.161.234 google.com. 300 IN A 150.101.161.236 google.com. 300 IN A 150.101.161.230 google.com. 300 IN A 150.101.161.241 google.com. 300 IN A 150.101.161.251 google.com. 300 IN A 150.101.161.219 google.com. 300 IN A 150.101.161.249 google.com. 300 IN A 150.101.161.226 ;; Received 268 bytes from 216.239.38.10#53(ns4.google.com) in 185 ms
- 调整答案大小
默认情况下 dig 以完整的长输出运行,显示大量详细信息。虽然很有用,但有时我们可能只是希望返回结果。这可以通过 +short 选项来实现,如下所示,当我们查询 google.com 时,我们只看到 IP 地址结果,而没有任何进一步的信息。
- 调整答案大小
[jack@onitroad ~]# dig google.com +short 216.58.220.110
- 从文件中查找
在 dig 命令后指定单个域并不是执行查找的唯一方法,我们还可以从文件中提供 dig 域列表(每行一个域),这在我们需要编写批量 DNS 查找脚本时非常有用。在下面的示例中,我们使用 -f 选项读取包含三个域的文件 query.txt。为简洁起见,我还在这里使用了 +short,因此我们只能看到返回的 IP 地址,而不是很长的完整输出。
- 从文件中查找
[jack@onitroad ~]# cat query.txt google.com yahoo.com onitroad.com [jack@onitroad ~]# dig -f query.txt +short 216.58.220.110 98.139.183.24 206.190.36.45 98.138.253.109 104.24.11.91 104.24.10.91
- 指定端口号
默认情况下,dig 命令查询端口 53,这是标准 DNS 端口,但如果需要,我们可以选择指定备用端口。如果出于某种原因将外部名称服务器配置为使用非标准端口,这可能很有用。我们使用 -p 选项指定要查询的端口,后跟端口号。在下面的示例中,我们对端口 5300 执行 DNS 查询。
- 指定端口号
[jack@onitroad ~]# dig @8.8.8.8 -p 5300 google.com ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> @8.8.8.8 -p 5300 google.com ; (1 server found) ;; global options: +cmd ;; connection timed out; no servers could be reached
请注意,外部名称服务器必须实际侦听此指定端口上的流量,并且其防火墙也需要允许流量通过,否则查找将失败。在此示例中,连接超时,因为 8.8.8.8 未配置为侦听我为本示例选择的随机端口 5300。
- 使用 IPv4 或者 IPv6
默认情况下,我们的 dig 查询在 IPv4 网络上运行,我们可以指定是否要使用带有 -4 选项的 IPv4 传输,或者我们可以指定使用带有 -6 选项的 IPv6 传输。
- 使用 IPv4 或者 IPv6
[jack@onitroad ~]# dig -6 @2001:4860:4860::8888 google.com A ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-25.P1.el5_11.8 <<>> @2001:4860:4860::8888 google.com A ; (1 server found) ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40588 ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 294 IN A 66.102.1.113 google.com. 294 IN A 66.102.1.101 google.com. 294 IN A 66.102.1.138 google.com. 294 IN A 66.102.1.100 google.com. 294 IN A 66.102.1.139 google.com. 294 IN A 66.102.1.102 ;; Query time: 6 msec ;; SERVER: 2001:4860:4860::8888#53(2001:4860:4860::8888) ;; WHEN: Tue Sep 6 13:21:10 2014 ;; MSG SIZE rcvd: 124
请注意, Linux 系统需要配置 IPv6 网络才能正常工作。
- 10.查询所有DNS记录类型
我们可以使用“ANY”选项来查询所有 DNS 记录类型,这样我们就可以快速查看一个域可用的所有 DNS 记录。在下面的示例中,我们可以看到所有类型的不同记录的结果,包括 A、AAAA、TXT、MX 和 NS。
[jack@onitroad ~]# dig google.com ANY ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> google.com ANY ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16952 ;; flags: qr rd ra; QUERY: 1, ANSWER: 12, AUTHORITY: 0, ADDITIONAL: 11 ;; QUESTION SECTION: ;google.com. IN ANY ;; ANSWER SECTION: google.com. 5 IN A 216.58.220.110 google.com. 5 IN NS ns4.google.com. google.com. 5 IN NS ns3.google.com. google.com. 5 IN NS ns1.google.com. google.com. 5 IN NS ns2.google.com. google.com. 5 IN MX 50 alt4.aspmx.l.google.com. google.com. 5 IN MX 20 alt1.aspmx.l.google.com. google.com. 5 IN MX 30 alt2.aspmx.l.google.com. google.com. 5 IN MX 10 aspmx.l.google.com. google.com. 5 IN MX 40 alt3.aspmx.l.google.com. google.com. 5 IN TXT "v=spf1 include:_spf.google.com ~all" google.com. 5 IN AAAA 2404:6800:4006:801::200e ;; ADDITIONAL SECTION: ns4.google.com. 5 IN A 216.239.38.10 ns3.google.com. 5 IN A 216.239.36.10 ns1.google.com. 5 IN A 216.239.32.10 ns2.google.com. 5 IN A 216.239.34.10 alt4.aspmx.l.google.com. 5 IN A 173.194.219.27 alt4.aspmx.l.google.com. 5 IN AAAA 2607:f8b0:4002:c03::1a alt1.aspmx.l.google.com. 5 IN A 74.125.198.27 alt1.aspmx.l.google.com. 5 IN AAAA 2607:f8b0:400e:c03::1b alt2.aspmx.l.google.com. 5 IN A 64.233.182.27 alt2.aspmx.l.google.com. 5 IN AAAA 2607:f8b0:4003:c05::1a aspmx.l.google.com. 5 IN A 64.233.188.27 ;; Query time: 28 msec ;; SERVER: 192.168.220.2#53(192.168.220.2) ;; WHEN: Tue Sep 06 09:53:06 AEST 2014 ;; MSG SIZE rcvd: 512
应该注意的是,一些名称服务器不支持这一点并且会拒绝请求,例如 Cloudflare 后面的许多域只会简单地返回以下记录。
cloudflare.com. 5 IN HINFO "Please stop asking for ANY" "See draft-ietf-dnsop-refuse-any"
- 11.自定义dig输出
我们可以指定许多不同的选项来自定义 dig 命令将打印的内容。
全部藏起来
使用 +noall 选项,我们可以隐藏几乎所有的输出。
[jack@onitroad ~]# dig google.com +noall ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> google.com +noall ;; global options: +cmd
现在从这个干净的基础上,我们可以选择我们想要显示的内容。我们还可以以类似的方式禁用默认输出中的组件。
打印统计
默认情况下,dig 查询底部会显示一些基本统计信息,包括查询时间、查询的服务器、发生时间和消息大小。这些可以使用 +nostats 选项删除,或者使用 +stats 添加。
[jack@onitroad ~]# dig google.com +noall +stats ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> google.com +noall +stats ;; global options: +cmd ;; Query time: 2 msec ;; SERVER: 192.168.220.2#53(192.168.220.2) ;; WHEN: Tue Sep 06 10:06:20 AEST 2014 ;; MSG SIZE rcvd: 55
打印答案
我们可以使用 +answer 选项输出 DNS 查询的答案,如下所示,我们现在实际上看到了来自 DNS 查询的 IP 地址。
[jack@onitroad ~]# dig google.com +noall +answer ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> google.com +noall +answer ;; global options: +cmd google.com. 5 IN A 216.58.220.110
希望这能让我们对我们如何隐藏和显示 dig 输出的特定组件有一个基本的了解,还有更多可用的选项,我建议查看手册页以获取有关可以显示或者隐藏哪些特定部分的更多信息。
- 使用 ~/.digrc 文件调整默认值
我们可以在我们的主目录中创建一个 .digrc 文件,以包含我们希望 dig 默认运行的任何自定义选项。通过这种方式,我们可以在 ~/.digrc 文件中指定各种选项,这些选项将始终与 dig 命令一起自动运行。
在下面的示例中,我们将 +short 选项添加到我们主目录中的 .digrc 中,然后在 google.com 上执行 dig,我们可以看到输出确认它是使用 +short 运行的,即使我们没有在命令行。
- 使用 ~/.digrc 文件调整默认值
[jack@onitroad ~]# cat .digrc +short [jack@onitroad ~]# dig google.com 216.58.220.110
Dig(域信息搜索器)是一种用于查询 DNS 服务器以获取各种 DNS 记录的工具,对于解决 DNS 问题非常有用。