在整理SCSP资料时,突然对dig命令很感兴趣,在详细学习dig的过程中同时也将DNS重新回顾学习了一遍。

1.介绍

dig(域信息搜索器)命令是一个在类Unix命令行模式下用于询问 DNS 域名服务器的灵活的工具。它执行DNS搜索,显示从受请求的域名服务器返回的答复。多数DNS管理员利用dig作为DNS问题的故障诊断工具,因为它灵活性好、易用、输出清晰。通常情况下dig使用命令行参数。

Dig的源码是ISC BIND(www.isc.org,这里面可以直接下载)大包的一部分,但是大多编译和安装Bind的文档都不把它包括在内,但是在linux系统下,它通常是某个包的一部分,在Gentoo下是bind-tools,在Redhat/Fedora下是 bind-utils,或者在Debian下是 dnsutils。 

2.安装方法

因为dig通常是linux下的命令,在windows中无法直接使用,所以需要在windows中安装dig工具。

下载链接:aHR0cHM6Ly9wYW4uYmFpZHUuY29tL3MvMTAzU3g5YTNxQUcwSlZrVHVoN2thaFE= (base64编码过了^_^)

安装好用直接修改环境变量即可,我的电脑右键->高级系统设置->环境变量->系统变量->路径(path),点击后增加对应的目录路径即可

3.dig命令的使用

3.1 dig的语法

dig [@global-server] [domain] [q-type] [q-class] {q-opt}
            {global-d-opt} host [@local-server] {local-d-opt}
            [ host [@local-server] {local-d-opt} [...]]

dig 是完全命令行的工具,使用者需要记得各个选项的用法。如果忘记可以使用 -h 选项查看所有的参数。以下就各个选项进行说明:

@global-server  指定DNS服务器

domain    输入解析的域名

q-type  指定要查询的记录类型,type 类型有 a、any、mx、ns、soa、hinfo、axfr、txt 等,默认值为 a。

q-class  指定类的类型,默认为IN,class参数值是任何有效类都可以,如HS(用于Hesiod记录)或CH(用于CHAOSNET记录)。

q-opt  指定查询参数,如下,对常用的参数作一些说明

        q-opt    is one of:
                 -x dot-notation     (shortcut for reverse lookups)
                 -i                  (use IP6.INT for IPv6 reverse lookups)
                 -f filename         (batch mode)
                 -b address[#port]   (bind to source address/port)
                 -p port             (specify port number)
                 -q name             (specify query name)
                 -t type             (specify query type)
                 -c class            (specify query class)
                 -k keyfile          (specify tsig key file)
                 -y [hmac:]name:key  (specify named base64 tsig key)
                 -4                  (use IPv4 query transport only)
                 -6                  (use IPv6 query transport only)
                 -m                  (enable memory usage debugging)

-x  后面接IP地址,反射查询,将IP解析成域名。

-p  指定DNS端口号,用于非53端口DNS服务器。

-q、-t、-c和最开始的三个参数是相同的效果,就不再说明了。

d-opt   指定查询选项,如下,对常用参数作一些说明

d-opt    is of the form +keyword[=value], where keyword is:
                 +[no]vc             (TCP mode)
                 +[no]tcp            (TCP mode, alternate syntax)
                 +time=###           (Set query timeout) [5]
                 +tries=###          (Set number of UDP attempts) [3]
                 +retry=###          (Set number of UDP retries) [2]
                 +domain=###         (Set default domainname)
                 +bufsize=###        (Set EDNS0 Max UDP packet size)
                 +ndots=###          (Set NDOTS value)
                 +edns=###           (Set EDNS version)
                 +[no]search         (Set whether to use searchlist)
                 +[no]showsearch     (Search with intermediate results)
                 +[no]defname        (Ditto)
                 +[no]recurse        (Recursive mode)
                 +[no]ignore         (Don't revert to TCP for TC responses.)
                 +[no]fail           (Don't try next server on SERVFAIL)
                 +[no]besteffort     (Try to parse even illegal messages)
                 +[no]aaonly         (Set AA flag in query (+[no]aaflag))
                 +[no]adflag         (Set AD flag in query)
                 +[no]cdflag         (Set CD flag in query)
                 +[no]cl             (Control display of class in records)
                 +[no]cmd            (Control display of command line)
                 +[no]comments       (Control display of comment lines)
                 +[no]question       (Control display of question)
                 +[no]answer         (Control display of answer)
                 +[no]authority      (Control display of authority)
                 +[no]additional     (Control display of additional)
                 +[no]stats          (Control display of statistics)
                 +[no]short          (Disable everything except short
                                      form of answer)
                 +[no]ttlid          (Control display of ttls in records)
                 +[no]all            (Set or clear all display flags)
                 +[no]qr             (Print question before sending)
                 +[no]nssearch       (Search all authoritative nameservers)
                 +[no]identify       (ID responders in short answers)
                 +[no]trace          (Trace delegation down from root)
                 +[no]dnssec         (Request DNSSEC records)
                 +[no]nsid           (Request Name Server ID)
                 +[no]multiline      (Print records in an expanded format)

+[no]tcp  查询域名服务器时使用 [不使用] TCP。缺省行为是使用 UDP。 

+[no]nssearch  这个选项被设置时,dig试图寻找包含待搜名称的网段的权威域名服务器,并显示网段中每台域名服务器的SOA 记录。

+[no]trace  切换为待查询名称从根名称服务器开始的代理路径跟踪。缺省情况不使用跟踪。一旦启用跟踪,dig 使用迭代查询解析待查询名称。它将按照从根服务器的参照,显示来自每台使用解析查询的服务器的应答。

+[no]cmd  设定在输出中显示指出 dig 版本及其所用的查询选项的初始注释。缺省情况下显示注释。

+[no]short  提供简要答复。缺省值是以冗长格式显示答复信息。

+[no]identify  当启用 +short 选项时,显示 [或不显示] 提供应答的 IP 地址和端口号。如果请求简短格式应答,缺省情况不显示提供应答的服务器的源地址和端口号。

+[no]comments  切换输出中的注释行显示。缺省值是显示注释。

+[no]stats  该查询选项设定显示统计信息:查询进行时,应答的大小等等。缺省显示查询统计信息。

+[no]qr  显示 [不显示] 发送的查询请求。缺省不显示。

+[no]question  当返回应答时,显示 [不显示] 查询请求的问题部分。缺省作为注释显示问题部分。

+[no]answer  显示 [不显示] 应答的回答部分。缺省显示。

+[no]authority  显示 [不显示] 应答的权限部分。缺省显示。

+[no]additional  显示 [不显示] 应答的附加部分。缺省显示。

+[no]all  设置或清除所有显示标志。

3.2 dig的常用用法

3.2.1 默认输出

C:\Users\TutuB>dig

; <<>> DiG 9.5.1 <<>>
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1000
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 15

;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       343085  IN      NS      e.root-servers.net.
.                       343085  IN      NS      c.root-servers.net.
.                       343085  IN      NS      i.root-servers.net.
.                       343085  IN      NS      d.root-servers.net.
.                       343085  IN      NS      j.root-servers.net.
.                       343085  IN      NS      l.root-servers.net.
.                       343085  IN      NS      a.root-servers.net.
.                       343085  IN      NS      h.root-servers.net.
.                       343085  IN      NS      m.root-servers.net.
.                       343085  IN      NS      b.root-servers.net.
.                       343085  IN      NS      g.root-servers.net.
.                       343085  IN      NS      k.root-servers.net.
.                       343085  IN      NS      f.root-servers.net.

;; ADDITIONAL SECTION:
a.root-servers.net.     550347  IN      A       198.41.0.4
b.root-servers.net.     400210  IN      A       199.9.14.201
c.root-servers.net.     565034  IN      A       192.33.4.12
d.root-servers.net.     193700  IN      A       199.7.91.13
e.root-servers.net.     315163  IN      A       192.203.230.10
f.root-servers.net.     557319  IN      A       192.5.5.241
g.root-servers.net.     339448  IN      A       192.112.36.4
h.root-servers.net.     505797  IN      A       198.97.190.53
i.root-servers.net.     426606  IN      A       192.36.148.17
j.root-servers.net.     239526  IN      A       192.58.128.30
k.root-servers.net.     546139  IN      A       193.0.14.129
l.root-servers.net.     31549   IN      A       199.7.83.42
m.root-servers.net.     567782  IN      A       202.12.27.33
a.root-servers.net.     289944  IN      AAAA    2001:503:ba3e::2:30
b.root-servers.net.     377509  IN      AAAA    2001:500:200::b

;; Query time: 40 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: Thu Feb 14 02:51:39 2019
;; MSG SIZE  rcvd: 492

以上输出大体可以分为5个部分(一段就是一部分),实际上可能还包括更多的内容,总共会有以下6个部分:

第一部分 显示 dig 命令的版本和输入的参数以及服务器返回的一些技术详情,其实就是DNS报文头部中的一些字段值,不太熟悉的朋友可以去看看我之前DNS协议的文章,这里就不多讲了。

第二部分 QUESTION SECTION 显示需要查询的域名信息。上图中由于我在dig后没有加入任何参数,所以请求的域名为根,即“.”。

第三部分 ANSWER SECTION 显示查询到的结果。上图中显示了13个根服务器的信息。

第四部分 AUTHORITY SECTION 显示授权服务器的信息。上图中并无此部分。

第五部分 ADDITIONAL SECTION 显示附加区域的内容。上图中显示了13个根服务器的IPv4地址,同时还显示了其中2个根服务器的IPv6地址。

第六部分 显示本次查询的一些统计信息。上图中显示了查询时间,本地服务器,时间,报文大小信息。

另外,上面所有的以 ; 开头的行实际上都是注释。

3.2.2 查询A记录

C:\Users\TutuB>dig baynk5211.vicp.cc

; <<>> DiG 9.5.1 <<>> baynk5211.vicp.cc
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 432
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;baynk5211.vicp.cc.             IN      A

;; ANSWER SECTION:
baynk5211.vicp.cc.      60      IN      A       171.113.172.242

;; Query time: 161 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Thu Feb 14 20:33:42 2019
;; MSG SIZE  rcvd: 51

3.2.3 查询反向记录

C:\Users\TutuB>dig -x 202.103.24.68

; <<>> DiG 9.5.1 <<>> -x 202.103.24.68
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 354
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;68.24.103.202.in-addr.arpa.    IN      PTR

;; ANSWER SECTION:
68.24.103.202.in-addr.arpa. 12210 IN    PTR     ns.wuhan.net.cn.

;; Query time: 159 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Thu Feb 14 20:39:30 2019
;; MSG SIZE  rcvd: 73

3.2.4 使用精简输出来查询NS记录

C:\Users\TutuB>dig  baidu.com ns +short
ns4.baidu.com.
ns2.baidu.com.
ns3.baidu.com.
dns.baidu.com.
ns7.baidu.com.

3.2.5 从指定的服务器上进行查询MX记录,并只显示answer区域

C:\Users\TutuB>dig +noall +answer  @8.8.8.8 gmail.com mx
gmail.com.              3599    IN      MX      10 alt1.gmail-smtp-in.l.google.com.
gmail.com.              3599    IN      MX      20 alt2.gmail-smtp-in.l.google.com.
gmail.com.              3599    IN      MX      30 alt3.gmail-smtp-in.l.google.com.
gmail.com.              3599    IN      MX      5 gmail-smtp-in.l.google.com.
gmail.com.              3599    IN      MX      40 alt4.gmail-smtp-in.l.google.com.

3.2.6 查询SOA记录

C:\Users\TutuB>dig baidu.com soa +short
dns.baidu.com. sa.baidu.com. 2012139810 300 300 2592000 7200

SOA是start of authority的简称,提供了DNS主服务器的相关信息,在soa之后我们可以看到7个参数,依次是: 
1、DNS主服务器名 
2、管理员的E-mail,这里是[email protected],由于@在数据库文件里有特殊作用,所以这里是用.代替的。 
3、更新序号。表示是域名记录的版本,每更改一次域名的任何DNS记录,版本号就会自动加一,这时secondary dns就会知道DNS记录发生更改,以便重新同步。当然也有是用时间来表示的。 
4、更新频率。 表示每300秒,slave服务器就要向master服务器索取更新信息。 
5、失败重试时间,当某些原因导致Slave服务器无法向master服务器索取信息时,会隔300秒就重试一次。 
6、失效时间。如果一直重试失败,当重试时间累积达到2592000秒时,不再向主服务器索取信息。 
7、缓存时间。

3.2.7 多条查询

dig 的 BIND9 支持在命令行上指定多个查询(支持 -f 批处理文件选项的附加功能)。每条查询可以使用自己的标志位、选项和查询选项。在这种情况下,在上面描述的命令行语法中,每条查询自变量代表一个个别查询。每一条由任意标准选项和标志、待查询名称、可选查询类型和类以及任何适用于该查询的查询选项。也可以使用对所有查询均有效的查询选项全局集合。全局查询选项必须位于命令行上第一个名称、类、类型、选项、标志和查询选项的元组之前。任何全局查询选项(除了 +[no]cmd 选项)可以被下面的查询特别选项重设。

C:\Users\TutuB>dig +noall +answer baynk5211.vicp.cc -x 8.8.8.8 +question cisco.com aaaa +all
baynk5211.vicp.cc.      60      IN      A       171.113.172.242
;8.8.8.8.in-addr.arpa.          IN      PTR
8.8.8.8.in-addr.arpa.   2239    IN      PTR     google-public-dns-a.google.com.
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 236
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;cisco.com.                     IN      AAAA

;; ANSWER SECTION:
cisco.com.              2944    IN      AAAA    2001:420:1101:1::185

;; Query time: 152 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Thu Feb 14 22:35:41 2019
;; MSG SIZE  rcvd: 55

上述命令一次进行了三次查询,分别是对baynk5211.vicp.cc的通用查询、对8.8.8.8的反向查询、对cisco.com的IPv6地址记录查询。在前面加上全局查询选项,只显示answer区域内容。但是在8.8.8.8的反向查询中额外增加了question区域内容,同时也将cisco.com的完整信息给显示出来了。

3.2.8 追踪DNS解析过程

C:\Users\TutuB>dig baynk5211.vicp.cc +trace

; <<>> DiG 9.5.1 <<>> baynk5211.vicp.cc +trace
;; global options:  printcmd
.                       506148  IN      NS      a.root-servers.net.
.                       506148  IN      NS      h.root-servers.net.
.                       506148  IN      NS      i.root-servers.net.
.                       506148  IN      NS      j.root-servers.net.
.                       506148  IN      NS      c.root-servers.net.
.                       506148  IN      NS      g.root-servers.net.
.                       506148  IN      NS      e.root-servers.net.
.                       506148  IN      NS      d.root-servers.net.
.                       506148  IN      NS      b.root-servers.net.
.                       506148  IN      NS      m.root-servers.net.
.                       506148  IN      NS      k.root-servers.net.
.                       506148  IN      NS      l.root-servers.net.
.                       506148  IN      NS      f.root-servers.net.
;; Received 228 bytes from 192.168.1.1#53(192.168.1.1) in 56 ms

cc.                     172800  IN      NS      ac1.nstld.com.
cc.                     172800  IN      NS      ac2.nstld.com.
cc.                     172800  IN      NS      ac3.nstld.com.
cc.                     172800  IN      NS      ac4.nstld.com.
;; Received 292 bytes from 199.7.83.42#53(l.root-servers.net) in 442 ms

vicp.cc.                172800  IN      NS      ns2.exhera.com.
vicp.cc.                172800  IN      NS      ns1.exhera.com.
;; Received 81 bytes from 192.42.176.30#53(ac4.nstld.com) in 259 ms

baynk5211.vicp.cc.      60      IN      A       171.113.172.242
;; Received 83 bytes from 121.40.188.104#53(ns2.exhera.com) in 30 ms

这个在之前关于DNS的文章就已经解析过了,这里就不再特别说明了。 

03-03 18:23