介紹如何使用 dig
指令查詢各種 DNS 記錄,進行 DNS 審視與除錯。
安裝 dig
若要在 CentOS Linux 中安裝 dig
指令,可以使用 yum
安裝 bind-utils
套件:
# 安裝 bind-utils 套件(CentOS)
sudo yum install bind-utils
若在 Ubuntu Linux 中則可使用 apt
安裝 dnsutils
套件:
# 安裝 bind-utils 套件(Ubuntu)
sudo apt install dnsutils
基本 DNS 記錄查詢
執行 dig
並指定完整的主機名稱,即可進行 DNS 正向查詢,靠系統預設的 DNS 伺服器取得對應的 IP 位址:
# 查詢 DNS 記錄
dig www.google.com
; <<>> DiG 9.11.3-1ubuntu1.12-Ubuntu <<>> www.google.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38378 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 298 IN A 216.58.200.228 ;; Query time: 9 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Sun Jul 19 19:32:18 CST 2020 ;; MSG SIZE rcvd: 59
dig
預設的輸出非常詳細,這裡的輸出大致上可分為四的部份,第一個區塊顯示了本次 DNS 查詢的技術細節,包含查詢參數與傳回值等。QUESTION SECTION
部份顯示了送出的 DNS 查詢內容,預設的查詢類型為 IPv4 位址(A
記錄)。ANSWER SECTION
部份顯示了本次 DNS 查詢的結果。最後一部分則是一些附加資訊,例如 DNS 伺服器位址等。
簡略輸出
若感覺 dig
的輸出過於冗長,可以加上 +short
參數改用簡略的輸出格式,這種輸出在撰寫指令稿時會比較好處理:
# 簡略輸出 dig www.google.com +short
216.58.200.228
另一種簡略的輸出方式是只輸出答案資訊部份:
# 只輸出答案資訊 dig www.google.com +noall +answer
; <<>> DiG 9.11.3-1ubuntu1.12-Ubuntu <<>> www.google.com +noall +answer ;; global options: +cmd www.google.com. 299 IN A 172.217.160.68
亦可關閉輸出註解,讓資訊更簡潔:
# 關閉輸出註解 dig +nocmd www.google.com +noall +answer
www.google.com. 299 IN A 172.217.160.68
DNS 反向查詢
若要進行 DNS 反向查詢,可以加上 -x
參數並指定要進行反查的 IP 位址:
# DNS 反向查詢 dig -x 172.217.160.68
; <<>> DiG 9.11.3-1ubuntu1.12-Ubuntu <<>> -x 172.217.160.68 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17946 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;68.160.217.172.in-addr.arpa. IN PTR ;; ANSWER SECTION: 68.160.217.172.in-addr.arpa. 114 IN PTR tsa01s09-in-f4.1e100.net. ;; Query time: 0 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Sun Jul 19 20:30:55 CST 2020 ;; MSG SIZE rcvd: 94
指定 DNS 伺服器
若要自行指定要使用的 DNS 伺服器,可以使用 @
加上 DNS 伺服器 IP 位址的方式來指定,例如若要使用 Google 的 8.8.8.8
DNS 伺服器,就可以這樣寫:
# 指定 DNS 伺服器 dig @8.8.8.8 www.google.com
; <<>> DiG 9.11.3-1ubuntu1.12-Ubuntu <<>> @8.8.8.8 www.google.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50489 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 215 IN A 172.217.160.100 ;; Query time: 8 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Mon Jul 20 08:12:31 CST 2020 ;; MSG SIZE rcvd: 59
查詢指定類型 DNS 記錄
dig
預設會查詢主機的 IPv4 位址(A
記錄),若要查詢其他類型的 DNS 記錄,可在完整主機名稱後方加上欲查詢的 DNS 記錄類型,常見的 DNS 記錄類型有 A
、AAAA
、MX
、TXT
、NS
、CNAME
與 SOA
等。
例如查詢 google.com
網域的郵件伺服器(MX
記錄):
# 查詢 MX 類型的 DNS 記錄
dig google.com MX
; <<>> DiG 9.11.3-1ubuntu1.12-Ubuntu <<>> google.com MX ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59995 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;google.com. IN MX ;; ANSWER SECTION: google.com. 409 IN MX 40 alt3.aspmx.l.google.com. google.com. 409 IN MX 50 alt4.aspmx.l.google.com. google.com. 409 IN MX 20 alt1.aspmx.l.google.com. google.com. 409 IN MX 30 alt2.aspmx.l.google.com. google.com. 409 IN MX 10 aspmx.l.google.com. ;; Query time: 0 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Sun Jul 19 20:20:36 CST 2020 ;; MSG SIZE rcvd: 147
若要查詢所有類型的 DNS 記錄,可將類型指定為 ANY
:
# 查詢所有類型 DNS 記錄
dig www.google.com ANY
; <<>> DiG 9.11.3-1ubuntu1.12-Ubuntu <<>> www.google.com ANY ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5077 ;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;www.google.com. IN ANY ;; ANSWER SECTION: www.google.com. 199 IN A 64.233.189.99 www.google.com. 199 IN A 64.233.189.106 www.google.com. 199 IN A 64.233.189.147 www.google.com. 199 IN A 64.233.189.105 www.google.com. 199 IN A 64.233.189.103 www.google.com. 199 IN A 64.233.189.104 www.google.com. 199 IN AAAA 2404:6800:4008:c07::93 www.google.com. 199 IN AAAA 2404:6800:4008:c07::6a www.google.com. 199 IN AAAA 2404:6800:4008:c07::69 ;; Query time: 10 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Sun Jul 19 20:08:55 CST 2020 ;; MSG SIZE rcvd: 223
追蹤查詢路徑
當 DNS 的解析出現問題時,可加上 +trace
參數讓 dig
從根節點追蹤查詢路徑,釐清問題的所在:
# 從根節點追蹤查詢路徑 dig www.google.com +trace
尋找問題時,通常也會配合不同的 DNS 伺服器交叉比對查詢結果:
# 指定 DNS 伺服器,從根節點追蹤查詢路徑 dig @8.8.8.8 www.google.com +trace
dig
設定檔
使用者若有慣用的 dig
參數,可將參數設定寫在 ~/.digrc
這個設定檔中,這樣在執行 dig
的時候就會自動套用這些參數:
# 建立 dig 設定檔 echo "+noall +answer" > ~/.digrc
大量批次 DNS 記錄查詢
若要一次對大量的主機進行 DNS 記錄查詢,可以將所有的主機寫在一個文字檔案中,一行一個主機,再以 -f
參數指定輸入檔進行 DNS 查詢。
例如建立一個文字檔案 input.txt
,內容如下:
google.com ubuntu.com tw.yahoo.com
然後進行大量批次 DNS 記錄查詢:
# 從檔案輸入進行批次查詢 dig -f input.txt
參考資料:Hostinger、madboa.com