安装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 记录。

    1. 查询特定名称服务器
      在上面的示例中,我们没有查询任何特定的名称服务器,因此我们的查询将被发送到我们的 /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 上对该目的地进行出站访问,否则查询将失败。

    1. 搜索记录类型
      到目前为止,我们已经看到默认情况下 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。

    1. 追踪 DNS 路径
      我们可以使用 +trace 选项对 DNS 查找路径执行跟踪,如下所示,在查询 google.com 时,我们可以看到实际发生的情况。首先是“.”的根名称服务器被查找,然后是 .com 域的名称服务器,最后返回 google.com 的名称服务器,然后是它的 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
    1. 调整答案大小
      默认情况下 dig 以完整的长输出运行,显示大量详细信息。虽然很有用,但有时我们可能只是希望返回结果。这可以通过 +short 选项来实现,如下所示,当我们查询 google.com 时,我们只看到 IP 地址结果,而没有任何进一步的信息。
[jack@onitroad ~]# dig google.com +short
216.58.220.110
    1. 从文件中查找
      在 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
    1. 指定端口号
      默认情况下,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。

    1. 使用 IPv4 或者 IPv6
      默认情况下,我们的 dig 查询在 IPv4 网络上运行,我们可以指定是否要使用带有 -4 选项的 IPv4 传输,或者我们可以指定使用带有 -6 选项的 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 输出的特定组件有一个基本的了解,还有更多可用的选项,我建议查看手册页以获取有关可以显示或者隐藏哪些特定部分的更多信息。

    1. 使用 ~/.digrc 文件调整默认值
      我们可以在我们的主目录中创建一个 .digrc 文件,以包含我们希望 dig 默认运行的任何自定义选项。通过这种方式,我们可以在 ~/.digrc 文件中指定各种选项,这些选项将始终与 dig 命令一起自动运行。
      在下面的示例中,我们将 +short 选项添加到我们主目录中的 .digrc 中,然后在 google.com 上执行 dig,我们可以看到输出确认它是使用 +short 运行的,即使我们没有在命令行。
[jack@onitroad ~]# cat .digrc
+short
[jack@onitroad ~]# dig google.com
216.58.220.110
在 Linux 中查询 DNS 的 Dig 命令示例

Dig(域信息搜索器)是一种用于查询 DNS 服务器以获取各种 DNS 记录的工具,对于解决 DNS 问题非常有用。

日期:2020-07-07 20:56:59 来源:oir作者:oir