《dig挖出DNS的祕密》

【初次見面】

我相信使用nslookup的同學一定比使用dig的同學多,所以還是有必要花些時間給大家介紹一下dig的。

dig,和nslookup作用有些類似,都是DNS查詢工具。

dig,其實是一個縮寫,即Domain Information Groper。

一些專業的DNS管理員在追查DNS問題時,都樂於使用dig命令,是看中了dig設置靈活、輸出清晰、功能強大的特點。

【最簡單的dig用法】

最簡單的dig用法,當然就是直接輸入dig按回車。

?
1
2
3
4
5
6
$ dig
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> //Dig命令的版本信息
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

從上面的輸出,你一定觀察到了,當直接使用dig命令,不加任何參數和選項時,dig會向默認的上連DNS服務器查詢“.”(根域)的NS記錄。

【dig加個點】

剛纔直接輸入dig,這次我們在後面加上一個“.”,看看結果和剛纔有何區別:

?
1
2
3
4
5
6
$ dig .
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> .
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

【我想用google-DNS來查baidu.com的A記錄】

?
1
2
3
4
5
6
7
$ dig @8.8.8.8 www.baidu.com A //命令格式爲dig @dnsserver name querytype
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> @8.8.8.8 www.baidu.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

從這個例子,大家學習到了dig的基本的命令格式是:

?
1
dig @dnsserver name querytype

如果你設置的dnsserver是一個域名,那麼dig會首先通過默認的上連DNS服務器去查詢對應的IP地址,然後再以設置的dnsserver爲上連DNS服務器。
如果你沒有設置@dnsserver,那麼dig就會依次使用/etc/resolv.conf裏的地址作爲上連DNS服務器。
而對於querytype,如果你看過我上一篇有關nslookup命令的講解,那麼你應該對querytype有所瞭解,你可以設置A/AAAA/PTR/MX/ANY等值,默認是查詢A記錄。

【一些常用的選項】

1 -c選項,可以設置協議類型(class),包括IN(默認)、CH和HS。

2 -f選項,dig支持從一個文件裏讀取內容進行批量查詢,這個非常體貼和方便。文件的內容要求一行爲一個查詢請求。來個實際例子吧:

?
1
2
3
4
5
6
7
8
9
10
11
$ cat querylist //文件內容,共有兩個域名需要查詢
www.baidu.com
www.sohu.com
$ dig -f querylist -c IN -t A//設置-f參數開始批量查詢
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> www.sohu.com
;; Got answer:
;; ->>HEADER<

3 -4和-6兩個選項,用於設置僅適用哪一種作爲查詢包傳輸協議,分別對應着IPv4和IPv6。

4 -t選項,用來設置查詢類型,默認情況下是A,也可以設置MX等類型,來一個例子:

?
1
2
3
4
5
6
$ dig roclinux.cn -t MX
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> roclinux.cn -t MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

5 -q選項,其實它本身是一個多餘的選項,但是它在複雜的dig命令中又是那麼的有用。-q選項可以顯式設置你要查詢的域名,這樣可以避免和其他衆多的參數、選項相混淆,提高了命令的可讀性,來個例子:

?
1
2
3
4
5
6
$ dig -q www.roclinux.cn
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> -q www.roclinux.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

6 -x選項,是逆向查詢選項。可以查詢IP地址到域名的映射關係。舉一個例子:

?
1
2
3
4
5
6
$ dig -x 193.0.14.129
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> -x 193.0.14.129
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

【dig特有的查詢選項(query option)】

和剛纔的選項不同,dig還有一批所謂的“查詢選項”,這批選項的使用與否,會影響到dig的查詢方式或輸出的結果信息,因此對於這批選項,dig要求顯式的在其前面統一的加上一個“+”(加號),這樣dig識別起來會更方便,同時命令的可讀性也會更強。
dig總共有42個查詢選項,涉及到DNS信息的方方面面,如此多的查詢選項,本文不會一一贅述,只會挑出最最常用的幾個重點講解。

【TCP代替UDP】

衆所周知,DNS查詢過程中的交互是採用UDP的。如果你希望採用TCP方式,需要這樣:

?
1
2
3
4
5
6
$ dig +tcp www.baidu.com
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> +tcp www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

【默認追加域】

大家直接看例子,應該就能理解“默認域”的概念了,也就能理解+domain=somedomain的作用了:

?
1
2
3
4
5
6
dig +domain=baidu.com image
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> +domain=baidu.com image
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

【跟蹤dig全過程】

dig非常著名的一個查詢選項就是+trace,當使用這個查詢選項後,dig會從根域查詢一直跟蹤直到查詢到最終結果,並將整個過程信息輸出出來。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ dig +trace roclinux.cn
 
; <<>> DiG 9.2.4 <<>> +trace roclinux.cn
;; global options:  printcmd
.                       335937  IN      NS      l.root-servers.net.
.                       335937  IN      NS      b.root-servers.net.
.                       335937  IN      NS      d.root-servers.net.
.                       335937  IN      NS      k.root-servers.net.
.                       335937  IN      NS      h.root-servers.net.
.                       335937  IN      NS      j.root-servers.net.
.                       335937  IN      NS      a.root-servers.net.
.                       335937  IN      NS      e.root-servers.net.
.                       335937  IN      NS      c.root-servers.net.
.                       335937  IN      NS      m.root-servers.net.
.                       335937  IN      NS      g.root-servers.net.
.                       335937  IN      NS      i.root-servers.net.
.                       335937  IN      NS      f.root-servers.net.
;; Received 400 bytes from 10.23.0.231#53(10.23.0.231) in 0 ms //從本地DNS查找到根域DNS列表
 
cn.                     172800  IN      NS      c.dns.cn.
cn.                     172800  IN      NS      a.dns.cn.
cn.                     172800  IN      NS      b.dns.cn.
cn.                     172800  IN      NS      e.dns.cn.
cn.                     172800  IN      NS      ns.cernet.net.
cn.                     172800  IN      NS      d.dns.cn.
;; Received 292 bytes from 192.228.79.201#53(b.root-servers.net) in 460 ms //選擇了b.root-servers.net這臺根域DNS來查找cn.域DNS列表
 
roclinux.cn.            21600   IN      NS      ns11.edong.com.
roclinux.cn.            21600   IN      NS      ns12.edong.com.
;; Received 76 bytes from 203.119.27.1#53(c.dns.cn) in 0 ms //選擇了c.dns.cn這臺cn.域DNS服務器來查找roclinux.cn的DNS列表
 
roclinux.cn.            3600    IN      A       116.255.245.206
roclinux.cn.            3600    IN      NS      ns12.edong.com.
roclinux.cn.            3600    IN      NS      ns11.edong.com.
;; Received 124 bytes from 61.147.124.145#53(ns11.edong.com) in 104 ms //最終查找到A記錄

【精簡dig輸出】

1 使用+nocmd的話,可以節省輸出dig版本信息。

2 使用+short的話,僅會輸出最精簡的CNAME信息和A記錄,其他都不會輸出。就像這樣:

?
1
2
3
4
$ dig +short www.baidu.com
www.a.shifen.com.
119.75.218.77
119.75.217.56

3 使用+nocomment的話,可以節省輸出dig的詳情註釋信息。

4 使用+nostat的話,最後的統計信息也不會輸出。當+nocmd、+nocomment和+nostat都是用上,是這樣:

?
1
2
3
4
5
$ dig +nocmd +nocomment +nostat www.baidu.com
;www.baidu.com.                 IN      A
www.baidu.com.          260     IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       244     IN      A       119.75.217.56
www.a.shifen.com.       244     IN      A       119.75.218.77

【我們還需要學習什麼】

堅持看我的博客的同學,已經掌握了nslookup和dig兩個DNS工具,我想,下一步你可以
自己搭建一套內部的DNS服務器了,自己設置master/slave服務器,自己添加Zone,
自己添加正解、反解,自己設置緩存超時等等,相信通過這一番折騰,
你對DNS會有不一樣的理解和認識。

謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章