在整理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的文章就已经解析过了,这里就不再特别说明了。