Dig( Domain Information Groper)是一个功能强大的命令行工具,可以用于DNS 记录查询。使用 dig 命令,可以查询各种 DNS 记录的信息,包括:主机名称记录(A、AAAA)、邮件交换记录(MX)和别名记录(CNAME)等等。由于其灵活性和易用性,让它成为了 Linux 系统管理员用于排错 DNS 问题的最常用工具(没有之一)。

由于笔者用习惯了 Windows 下的 nslookup 命令行工具,对 dig 的使用次数也少,刚上手时非常之不习惯。但用上手之后,可以负责地向大家推荐:抛弃 nslookup 直接换用 dig 吧。(Windows 也可以使用 dig,安装方法请自己 Google。)

安装dig

要检查 Linux 系统中是否有 dig 命令,可以在「终端」中执行:

[[email protected] ~]# dig -v
DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6

如果您的系统没有自带 dig 工具,可能会提示 dig: command not found,此时您可以使用以下方式进行安装。

Ubuntu和Debian安装dig

sudo apt install dnsutils

CentOS和Fedora安装dig

sudo yum install bind-utils

了解Dig输出

当不带参数使用 dig 查询单个主机(域名)时,它的输出非常详细,例如查询我的博客www.thexqf.top域名:

[[email protected] ~]# dig www.thexqf.top
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> www.thexqf.top
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51806
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.thexqf.top. IN A
;; ANSWER SECTION:
www.thexqf.top. 600 IN A 185.186.147.235
;; Query time: 70 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: 五 7月 31 09:57:05 CST 2020
;; MSG SIZE rcvd: 48

下面让我们逐步介绍并解释 dig 命令的输出:

输出的第一部分会打印出已安装的 dig 版本以及调用的查询,第二行显示全局选项(默认情况下仅为 cmd)。

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> www.thexqf.top
;; global options: +cmd

注:如果您不希望这些行包含在输出中,可以使用 +nocmd 选项。 (此选项必须是 dig 命令后的第一个参数。)

第二部分输出包括从有关权威机构(DNS 服务器)收到响应的详细技术信息。本节第一行是由 dig 执行操作的「操作码」和「操作状态」的「标头」,上述示例中的「操作状态」是 NOERROR,这意味着所请求的 DNS 服务器可以无障碍地服务于查询。

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51806
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

注: 您也可以用 +comments参数隐藏本节输出,使用此参数时还会禁用一些其它节输出的标题。

在使用较新版本 dig 时,会显示本部分输出,您可以在此节输出中查看有关 DNS 扩展机制(EDNS)的更多信息。

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494

要隐藏此部分输出可以使用 +noedns 参数。

此部分输出会显示 dig 将要查询的内容,默认情况下 dig 会请求 A 记录。

;; QUESTION SECTION:
;www.thexqf.top. IN A

用户可以使用 +noquestion 参数禁用此部分输出。

默认情况下 dig 会请求 A 记录。 在这种情况下,我们可以看到www.thexqf.top 指向 IP 地址 185.186.147.235。

;; ANSWER SECTION:
www.thexqf.top. 600 IN A 185.186.147.235

您可以使用 +noanswer 参数从输出中删除此部分。

这是 dig 输出的最后一部分内容,其中包括有关查询的统计信息。

;; Query time: 70 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: 五 7月 31 09:57:05 CST 2020
;; MSG SIZE rcvd: 48

您可以使用 +nostats 参数禁用此部分输出。

仅输出查询的响应(答案)

在绝大多数情况下,我们都只使用 dig 查询相应的 DNS 记录,而不需要太多复杂的、不相关的响应和输出,此时就可以使用以下两种方式。

获取简短响应结果

如果只想获取 DNS 查询的简短响应,可以使用 +short 参数,例如:

[[email protected] ~]# dig www.thexqf.top +short
185.186.147.235

输出将仅包括查询 www.thexqf.top 地址时响应的 CNAME 记录和 A 记录。

2.获取详细响应结果

要获取 DNS 查询的详细响应,可以先使用 +noall 参数关闭所有结果,再使用+answer 参数打开部分结果。

[[email protected] ~]# dig www.thexqf.top +noall +answer

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> www.thexqf.top +noall +answer
;; global options: +cmd
www.thexqf.top.         570     IN      A       185.186.147.235

使用特定DNS服务器

默认情况下,如果未指定名称服务器,dig 将主动使用 /etc/resolv.conf 文件中列出的 DNS 服务器来进行查询。如果要使用特定的 DNS 服务器进行记录查询,可以使用 @ 后跟 DNS 服务器 IP 地址的方式来强制使用某 DNS Server。

例如,要使用 Google DNS(8.8.8.8)或(1.1.1.1)查询 www.thxqf.top 域名,可以使用:

[[email protected] ~]# dig www.thexqf.top @1.1.1.1

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> www.thexqf.top @1.1.1.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28659
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.thexqf.top.                        IN      A

;; ANSWER SECTION:
www.thexqf.top.         600     IN      A       185.186.147.235

;; Query time: 477 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: 五 7月 31 15:39:31 CST 2020

查询特定记录类型

与 Windows 下的 nslookup 命令行类似,dig 工具也允许用户查询指定的 DNS 记录类型。下面系统极客就为大家介绍,如果查询常见的 DNS 记录类型,例如:A(IP 地址)、CNAME(别名记录)、TXT(文本记录)、MX(邮件交换记录)和 NS(名称服务器)。

1.查询A记录

要获取域名的所有 IP 地址列表,请使用 a 参数:

dig +nocmd google.com a +noall +answer
[[email protected] ~]# dig +nocmd google.com a +noall +answer
google.com.             116     IN      A       216.58.200.238

如果未指定 DNS 记录类型,dig 也会默认将请求「A 记录」。

2.查询CNAME记录

要查找「别名记录」,请使用 cname 选项:

[[email protected] ~]# dig +nocmd www.sgroup.com cname +noall +answer 
www.nplusgroup.com.     600     IN      CNAME   s-website.oss-cn-shanghai.aliyuncs.com.

3.查询TXT记录

可以使用 txt 参数检索特定域的所有「TXT 记录」:

dig +nocmd _dnsauth.nplusgroup.com txt +noall +answer
[[email protected] ~]# dig +nocmd _dnsauth.nsgroup.com txt +noall +answer
_dnsauth.nsgroup.com. 600    IN      TXT     "202007300000002mbd3ovevm614h4amps5899dl39bpo9o1qt4y0bumqif9le506"

4. 查询MX记录

要获取特定域的所有邮件服务器列表,请使用 mx 参数:

[[email protected] ~]# dig ngroup.com mx +noall +answer                   

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> nplusgroup.com mx +noall +answer
;; global options: +cmd
nplusgroup.com.         3600    IN      MX      5 mxb1.qq.com.
nplusgroup.com.         3600    IN      MX      10 mxb2.qq.com.

5.查询NS记录

要查找特定域的权威名称服务器,请使用 ns 参数:

[[email protected] ~]# dig thexqf.top ns +noall +answer
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> thexqf.top ns +noall +answer
;; global options: +cmd
thexqf.top.             3600    IN      NS      f1g1ns2.dnspod.net.
thexqf.top.             3600    IN      NS      f1g1ns1.dnspod.net.

6.查询所有记录

使用 any 参数可以获取特定域的所有 DNS 记录列表:

[[email protected] ~]# dig +nocmd google.com any +noall +answer
google.com.             109     IN      TXT     "v=spf1 include:_spf.google.com ~all"
google.com.             109     IN      TXT     "facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95"
google.com.             109     IN      TXT     "docusign=1b0a6754-49b1-4db5-8540-d2c12664b289"
google.com.             109     IN      TXT     "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"
google.com.             109     IN      TXT     "globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
google.com.             31      IN      SOA     ns1.google.com. dns-admin.google.com. 324469238 900 900 1800 60
google.com.             232     IN      A       216.58.200.238
google.com.             2459    IN      NS      ns3.google.com.
google.com.             2459    IN      NS      ns2.google.com.
google.com.             2459    IN      NS      ns1.google.com.
google.com.             2459    IN      NS      ns4.google.com.

PTR反向DNS查询

要查询与特定 IP 地址关联的主机名,请使用 -x 参数。例如,要在 208.118.235.148 上执行反向查询,您将使用:

dig -x 185.186.147.235 +noall +answer

dig批量DNS查询

如果要对大量域名进行 DNS 查询,可以将其全部写入到一个文本文件中(一行一个),然后使用 -f 参数,再跟止文件名即可,例如:
dig -f domains.txt +short

.digrc环境变量文件

我们还可通过不同用户的 $/.digrc 文件来控制 dig 命令的行为,如果 .digrc 文件存在于用户的主目录中,则 dig 可以读取其中的参数,而无需用户在执行命令时手动添加。例如,直接在 ~/.digrc 文件中写入 +nocmd +noall +answer 参数。

Q.E.D.