2022年3月15日 星期二

DNS 問題除錯 dig 指令使用教學與範例

DNS 問題除錯 dig 指令使用教學與範例

介紹如何使用 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 記錄類型有 AAAAAMXTXTNSCNAME 與 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

沒有留言:

TeraTerm是一款開放原始碼的遠程客戶端操作軟體

因為工作需求,有時我們需要從遠端登入某設備或是主機,又或者因為故障排除,需要透過serial port連入某設備進行檢查和操控。 偶然看到某SI的工程師,使用這個工具,想說也來使用看看。心中相信這應該是好工具,人家才會用它。 我自己通常都是簡單使用的話用 putty,想要用好一...