linux dig命令使用詳解
Linux下決議域名除了使用nslookup之外,開可以使用dig命令來決議域名,dig命令可以得到更多的域名資訊,dig 命令主要用來從 DNS 域名服務器查詢主機地址資訊,
dig的全稱是 (domain information groper),它是一個用來靈活探測DNS的工具,它會列印出DNS name server的回應,
查詢單個域名的 DNS 資訊
dig 命令最典型的用法就是查詢單個主機的資訊,
linuxidc@linuxidc:~$ dig www.linuxidc.com
; <<>> DiG 9.11.3-1Ubuntu1.5-Ubuntu <<>> www.linuxidc.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17774
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;www.linuxidc.com. IN A
;; ANSWER SECTION:
www.linuxidc.com. 5 IN A 122.228.238.15
www.linuxidc.com. 5 IN A 106.42.25.203
;; Query time: 10 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Mar 03 10:55:35 CST 2019
;; MSG SIZE rcvd: 77

dig 命令默認的輸出資訊比較豐富,大概可以分為 5 個部分,
第一部分顯示 dig 命令的版本和輸入的引數,
第二部分顯示服務回傳的一些技術詳情,比較重要的是 status,如果 status 的值為 NOERROR 則說明本次查詢成功結束,
第三部分中的 "QUESTION SECTION" 顯示我們要查詢的域名,
第四部分的 "ANSWER SECTION" 是查詢到的結果,
第五部分則是本次查詢的一些統計資訊,比如用了多長時間,查詢了哪個 DNS 服務器,在什么時間進行的查詢等等,
默認情況下 dig 命令查詢 A 記錄,上圖中顯示的 A 即說明查詢的記錄型別為 A 記錄,在嘗試查詢其它型別的記錄前讓我們先來了解一下常見的 DNS 記錄型別,
常見 DNS 記錄的型別
| 型別 | 目的 |
| A | 地址記錄,用來指定域名的 IPv4 地址,如果需要將域名指向一個 IP 地址,就需要添加 A 記錄, |
| AAAA | 用來指定主機名(或域名)對應的 IPv6 地址記錄, |
| CNAME | 如果需要將域名指向另一個域名,再由另一個域名提供 ip 地址,就需要添加 CNAME 記錄, |
| MX | 如果需要設定郵箱,讓郵箱能夠收到郵件,需要添加 MX 記錄, |
| NS | 域名服務器記錄,如果需要把子域名交給其他 DNS 服務器決議,就需要添加 NS 記錄, |
| SOA | SOA 這種記錄是所有區域性檔案中的強制性記錄,它必須是一個檔案中的第一個記錄, |
| TXT | 可以寫任何東西,長度限制為 255,絕大多數的 TXT記錄是用來做 SPF 記錄(反垃圾郵件), |
查詢 CNAME 型別的記錄
除了 A 記錄,常見的 DNS 記錄還有 CNAME,我們可以在查詢時指定要查詢的 DNS 記錄型別:
linuxidc@linuxidc:~$ dig m.linuxidc.com CNAME
; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> m.linuxidc.com CNAME
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61349
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;m.linuxidc.com. IN CNAME
;; Query time: 26 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Mar 03 11:20:34 CST 2019
;; MSG SIZE rcvd: 43

這樣結果中就只有 CNAME 的記錄,其實我們可以在查詢中指定任何 DNS 記錄的型別,
從指定的 DNS 服務器上查詢
由于一些原因,希望從指定的 DNS 服務器上進行查詢(從默認的 DNS 服務器上獲得的結果可能不準確),指定 DNS 服務器的方式為使用 @ 符號:
linuxidc@linuxidc:~$ dig @8.8.8.8 m.linuxidc.com
; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> @8.8.8.8 m.linuxidc.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38966
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;m.linuxidc.com. IN A
;; ANSWER SECTION:
m.linuxidc.com. 199 IN A 122.228.238.71
m.linuxidc.com. 199 IN A 113.107.238.155
;; Query time: 120 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Mar 03 11:21:48 CST 2019
;; MSG SIZE rcvd: 75

從上圖可以看到本次查詢的 DNS 服務器為 8.8.8.8,
如果不指定 DNS 服務器,dig 會依次使用 /etc/resolv.conf 里的地址作為 DNS 服務器:

linuxidc@linuxidc:~$ dig m.linuxidc.com
上面查詢的 DNS 服務器就變成了:

反向查詢
在前面的查詢中我們指定了查詢服務器為 8.8.8.8,這是誰家的 DNS 服務器?其實我們可以使用 dig 的 -x 選項來反向決議 IP 地址對應的域名:
linuxidc@linuxidc:~$ dig -x 8.8.8.8 +short
google-public-dns-a.google.com.

好吧,應該是Google的,可以放心使用了,
控制顯示結果
dig 命令默認回傳的結果展示詳細的資訊,如果要獲得精簡的結果可以使用 +short 選項:
linuxidc@linuxidc:~$ dig +short m.linuxidc.com
122.228.238.15
106.119.182.141

這下顯示的結果就清爽多了,
其實我們還可以通過更多選項來控制輸出的內容,比如只想顯示 "ANSWER SECTION" 的內容:
linuxidc@linuxidc:~$ dig m.linuxidc.com +nocomments +noquestion +noauthority +noadditional +nostats
; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> m.linuxidc.com +nocomments +noquestion +noauthority +noadditional +nostats
;; global options: +cmd
m.linuxidc.com. 5 IN A 122.228.238.15
m.linuxidc.com. 5 IN A 106.119.182.141

這個結果很不錯,就是使用的選項太多了(dig 命令有很多這樣的選項,詳情請參考使用手冊),我們可以換一種優雅一些的方式來實作和上面相同的結果:
linuxidc@linuxidc:~$ dig m.linuxidc.com +noall +answer
; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> m.linuxidc.com +noall +answer
;; global options: +cmd
m.linuxidc.com. 5 IN A 113.107.238.212
m.linuxidc.com. 5 IN A 122.228.238.15

跟蹤整個查詢程序
如果你好奇 dig 命令執行查詢時都經歷了哪些程序,你可以嘗試使用 +trace 選項,它會輸出從根域到最終結果的所有資訊:
linuxidc@linuxidc:~$ dig sohu.com @202.102.134.68 -p 53 -t MX +trace
; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> sohu.com @202.102.134.68 -p 53 -t MX +trace
;; global options: +cmd
. 482761 IN NS f.root-servers.net.
. 482761 IN NS a.root-servers.net.
. 482761 IN NS c.root-servers.net.
. 482761 IN NS b.root-servers.net.
. 482761 IN NS j.root-servers.net.
. 482761 IN NS d.root-servers.net.
. 482761 IN NS k.root-servers.net.
. 482761 IN NS e.root-servers.net.
. 482761 IN NS h.root-servers.net.
. 482761 IN NS i.root-servers.net.
. 482761 IN NS m.root-servers.net.
. 482761 IN NS g.root-servers.net.
. 482761 IN NS l.root-servers.net.
;; Received 239 bytes from 202.102.134.68#53(202.102.134.68) in 40 ms
com. 172800 IN NS d.gtld-servers.net.

上圖中顯示的并不是一個完整的結果,感興趣的朋友可以自己嘗試,
顯示13個根域服務器
internet上有13個根域服務器,使用不加引數的dig命令顯示這些服務器資訊
linuxidc@linuxidc:~$ dig
; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41525
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 5 IN NS b.root-servers.net.
. 5 IN NS c.root-servers.net.
. 5 IN NS d.root-servers.net.
. 5 IN NS e.root-servers.net.
. 5 IN NS f.root-servers.net.
. 5 IN NS g.root-servers.net.
. 5 IN NS h.root-servers.net.
. 5 IN NS i.root-servers.net.
. 5 IN NS j.root-servers.net.
. 5 IN NS k.root-servers.net.
. 5 IN NS l.root-servers.net.
. 5 IN NS m.root-servers.net.
. 5 IN NS a.root-servers.net.
;; Query time: 8 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Mar 03 11:37:11 CST 2019
;; MSG SIZE rcvd: 239

總結
dig 是一個很給力 DNS 查詢工具,本文僅介紹了其常見用法,更多的命令選項及使用方法請查看 man page,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/136580.html
標籤:Linux
上一篇:linux學習(小白篇)
下一篇:Redis做為單機快取使用建議
