天天看點

《dig挖出DNS的秘密》-linux指令五分鐘系列之三十四

【初次見面】

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

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

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

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

【最簡單的dig用法】

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

?

1

2

3

4

5

6

<code>$</code><code>dig</code>

<code>; &lt;&lt;&gt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 &lt;&lt;&gt;&gt;</code><code>//Dig</code><code>指令的版本資訊</code>

<code>;; global options: +cmd</code>

<code>;; Got answer:</code>

<code>;; -&gt;&gt;HEADER&lt;</code>

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

【dig加個點】

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

<code>$</code><code>dig</code> <code>.</code>

<code>; &lt;&lt;&gt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 &lt;&lt;&gt;&gt; .</code>

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

7

<code>$</code><code>dig</code> <code>@8.8.8.8 www.baidu.com A</code><code>//</code><code>指令格式為</code><code>dig</code> <code>@dnsserver name querytype</code>

<code>; &lt;&lt;&gt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 &lt;&lt;&gt;&gt; @8.8.8.8 www.baidu.com A</code>

<code>; (1 server found)</code>

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

<code>dig</code> <code>@dnsserver name querytype</code>

如果你設定的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支援從一個檔案裡讀取内容進行批量查詢,這個非常體貼和友善。檔案的内容要求一行為一個查詢請求。來個實際例子吧:

8

9

10

11

<code>$</code><code>cat</code> <code>querylist</code><code>//</code><code>檔案内容,共有兩個域名需要查詢</code>

<code>www.baidu.com</code>

<code>www.sohu.com</code>

<code>$</code><code>dig</code> <code>-f querylist -c IN -t A</code><code>//</code><code>設定-f參數開始批量查詢</code>

<code>; &lt;&lt;&gt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 &lt;&lt;&gt;&gt; www.baidu.com</code>

<code>;; -&gt;&gt;HEADER&lt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 &lt;&lt;&gt;&gt; www.sohu.com</code>

3 -4和-6兩個選項,用于設定僅适用哪一種作為查詢包傳輸協定,分别對應着IPv4和IPv6。

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

<code>$</code><code>dig</code> <code>roclinux.cn -t MX</code>

<code>; &lt;&lt;&gt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 &lt;&lt;&gt;&gt; roclinux.cn -t MX</code>

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

<code>$</code><code>dig</code> <code>-q www.roclinux.cn</code>

<code>; &lt;&lt;&gt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 &lt;&lt;&gt;&gt; -q www.roclinux.cn</code>

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

<code>$</code><code>dig</code> <code>-x 193.0.14.129</code>

<code>; &lt;&lt;&gt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 &lt;&lt;&gt;&gt; -x 193.0.14.129</code>

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

和剛才的選項不同,dig還有一批所謂的“查詢選項”,這批選項的使用與否,會影響到dig的查詢方式或輸出的結果資訊,是以對于這批選項,dig要求顯式的在其前面統一的加上一個“+”(加号),這樣dig識别起來會更友善,同時指令的可讀性也會更強。

dig總共有42個查詢選項,涉及到DNS資訊的方方面面,如此多的查詢選項,本文不會一一贅述,隻會挑出最最常用的幾個重點講解。

【TCP代替UDP】

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

<code>$</code><code>dig</code> <code>+tcp www.baidu.com</code>

<code>; &lt;&lt;&gt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 &lt;&lt;&gt;&gt; +tcp www.baidu.com</code>

【預設追加域】

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

<code>dig</code> <code>+domain=baidu.com p_w_picpath</code>

<code>; &lt;&lt;&gt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 &lt;&lt;&gt;&gt; +domain=baidu.com p_w_picpath</code>

【跟蹤dig全過程】

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

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

<code>$</code><code>dig</code> <code>+trace roclinux.cn</code>

<code>; &lt;&lt;&gt;&gt; DiG 9.2.4 &lt;&lt;&gt;&gt; +trace roclinux.cn</code>

<code>;; global options:  printcmd</code>

<code>.                       335937  IN      NS      l.root-servers.net.</code>

<code>.                       335937  IN      NS      b.root-servers.net.</code>

<code>.                       335937  IN      NS      d.root-servers.net.</code>

<code>.                       335937  IN      NS      k.root-servers.net.</code>

<code>.                       335937  IN      NS      h.root-servers.net.</code>

<code>.                       335937  IN      NS      j.root-servers.net.</code>

<code>.                       335937  IN      NS      a.root-servers.net.</code>

<code>.                       335937  IN      NS      e.root-servers.net.</code>

<code>.                       335937  IN      NS      c.root-servers.net.</code>

<code>.                       335937  IN      NS      m.root-servers.net.</code>

<code>.                       335937  IN      NS      g.root-servers.net.</code>

<code>.                       335937  IN      NS      i.root-servers.net.</code>

<code>.                       335937  IN      NS      f.root-servers.net.</code>

<code>;; Received 400 bytes from 10.23.0.231</code><code>#53(10.23.0.231) in 0 ms //從本地DNS查找到根域DNS清單</code>

<code>cn.                     172800  IN      NS      c.dns.cn.</code>

<code>cn.                     172800  IN      NS      a.dns.cn.</code>

<code>cn.                     172800  IN      NS      b.dns.cn.</code>

<code>cn.                     172800  IN      NS      e.dns.cn.</code>

<code>cn.                     172800  IN      NS      ns.cernet.net.</code>

<code>cn.                     172800  IN      NS      d.dns.cn.</code>

<code>;; Received 292 bytes from 192.228.79.201</code><code>#53(b.root-servers.net) in 460 ms //選擇了b.root-servers.net這台根域DNS來查找cn.域DNS清單</code>

<code>roclinux.cn.            21600   IN      NS      ns11.edong.com.</code>

<code>roclinux.cn.            21600   IN      NS      ns12.edong.com.</code>

<code>;; Received 76 bytes from 203.119.27.1</code><code>#53(c.dns.cn) in 0 ms //選擇了c.dns.cn這台cn.域DNS伺服器來查找roclinux.cn的DNS清單</code>

<code>roclinux.cn.            3600    IN      A       116.255.245.206</code>

<code>roclinux.cn.            3600    IN      NS      ns12.edong.com.</code>

<code>roclinux.cn.            3600    IN      NS      ns11.edong.com.</code>

<code>;; Received 124 bytes from 61.147.124.145</code><code>#53(ns11.edong.com) in 104 ms //最終查找到A記錄</code>

【精簡dig輸出】

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

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

<code>$</code><code>dig</code> <code>+short www.baidu.com</code>

<code>www.a.shifen.com.</code>

<code>119.75.218.77</code>

<code>119.75.217.56</code>

3 使用+nocomment的話,可以節省輸出dig的詳情注釋資訊。

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

<code>$</code><code>dig</code> <code>+nocmd +nocomment +nostat www.baidu.com</code>

<code>;www.baidu.com.                 IN      A</code>

<code>www.baidu.com.          260     IN      CNAME   www.a.shifen.com.</code>

<code>www.a.shifen.com.       244     IN      A       119.75.217.56</code>

<code>www.a.shifen.com.       244     IN      A       119.75.218.77</code>

【我們還需要學習什麼】

堅持看我的部落格的同學,已經掌握了nslookup和dig兩個DNS工具,我想,下一步你可以

自己搭建一套内部的DNS伺服器了,自己設定master/slave伺服器,自己添加Zone,

自己添加正解、反解,自己設定緩存逾時等等,相信通過這一番折騰,

你對DNS會有不一樣的了解和認識。

謝謝!