dig-serial-banner
dig-serial-banner

DNS 系列文章目錄

DNS 除錯教學系列文章(1) – DNS 入門
DNS 除錯教學系列文章(2) – DNS 架構
DNS 除錯教學系列文章(3) – DNS 紀錄
DNS 除錯教學系列文章(4) – dig 指令
DNS 除錯教學系列文章(5) – 常見 DNS 問題與 dig 除錯方法

為什麼要用 dig,不能用 ping 嗎?

dig 能顯示 DNS 封包中大部份的資料,包括每一個 bit 的值,對於你要快速進行 DNS 除錯的人來說,比較能有一目了然的效果。ping 是網路測試工具,他不會經由正確的 DNS 解析來查詢 DNS,他會借助系統的設定透過 Public DNS 來解析,很有可能會拿到暫存的資料。

dig 教學

基本指令與格式

dig 是一個非常好用的 DNS 除錯工具,他能夠模擬一般電腦查詢、遞迴查詢、非遞迴查詢、DNS 快去伺服器查詢、DNSSEC 查詢、TCP 查詢等等。只要你知道該下哪些參數,你就能查看所有的 DNS 資料喔,基本的指令如下:

dig [options] example.com [type]

由於 options 的部份實在太多,我只列出幾個我常用的,type 的部份就是前面章節所提到的 DNS 紀錄類型。

回應區段

dig 回應的資料有四大區段,分別是標頭 (HEADER)、問題 (QUESTION)、解答 (ANSWER) 與權威伺服器 (Authority) 其他資訊 (ADDITIONAL) 五大區塊。

DNS Sections – RFC 1035

Header 中有比較需要注意的幾個欄位,所以我們列出來看一下:

DNS Header – RFC 1035

Header 中有很多欄位:

  • ID:DNS 查詢的亂數辨識碼,數字。
  • QR:0 查詢,1 回應。
  • Opcode:0 QUERY,1 IQUERY,2 STATUS,3-15 保留,同常都是 0。
  • AA:權威伺服器回答。
  • TC:截斷,表示封包是否因為過長而被截斷。
  • RD:用戶端是否要求遞迴查詢。
  • RA:伺服器回應是支援遞迴查詢。
  • Z:保留。
  • RCODE:0 沒有錯誤,1-5 錯誤代碼。
  • QDCOUNT:Question 區段的資料數量。
  • ANCOUNT:Answer 區段的資料數量。
  • NSCOUNT:Authority 區段的資料數量。
  • ARCOUNT:Additional 區段的資料數量。

如果你有興趣詳細了解,請參考 RFC 1035

參數 (Options)

@server,指定伺服器。你可以指定要對那一台伺服器送出 DNS 查詢,不指定時則使用系統的設定。範例:

$ dig +short @8.8.8.8 rsync.tw a
217.70.184.38
$ dig +short @168.95.1.1 rsync.tw a
217.70.184.38
$ dig +short @1.1.1.1 rsync.tw a
217.70.184.38

+short,簡略輸出。只顯示 ANSWER 區塊的部份,如果 ANSWER 沒有回應,就會顯示空白,上方的範例中也使用了 +short 參數。如果你沒有使用 +short 參數,就會看到五個區塊的詳細資料,範例(輸出的資料有點多,我刪除的部份資訊:

$ dig blog.rsync.tw 

; <<>> DiG 9.10.3-P4-Ubuntu <<>> blog.rsync.tw
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16954
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 6, ADDITIONAL: 15

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;blog.rsync.tw.			IN	A

;; ANSWER SECTION:
blog.rsync.tw.		3049	IN	CNAME	gpaas15.dc2.gandi.net.
gpaas15.dc2.gandi.net.	3	IN	A	217.70.186.115

;; AUTHORITY SECTION:
dc2.gandi.net.		949	IN	NS	dns2.gandi.net.
[略]
dc2.gandi.net.		949	IN	NS	dns1.gandi.net.

;; ADDITIONAL SECTION:
dns0.gandi.net.		44990	IN	A	217.70.177.39
dns0.gandi.net.		44990	IN	AAAA	2001:4b98:d:1::39
[略]
dns6.gandi.net.		44990	IN	AAAA	2400:cb00:2049:1::a29f:186f

;; Query time: 240 msec
;; SERVER: 217.70.181.80#53(217.70.181.80)
;; WHEN: Wed Apr 17 12:43:11 CST 2019
;; MSG SIZE  rcvd: 515

-4只使用 IPv4 位址進行與伺服器的連線。

-6只使用 IPv6 位址進行與伺服器的連線。

+tcp 使用 TCP 的方式與 DNS 伺服器連線。這個設定有時候我會用到,當幫一些客戶進行 DNS 測試的時候,因為 DNS 原生是使用 UDP/53 的協定,而有些人會忘記開啟主機或是 IP 分享器的防火牆,忘了讓 UDP 封包通過,我就會透過 +tcp 的方式將 DNS 查詢改為 TCP 連線,如果一般查詢沒有回應,而 +tcp 會過,就表示防火牆沒有開啟,指令範例:

$ dig +tcp +short blog.rsync.tw a
gpaas15.dc2.gandi.net.
217.70.186.115

+cdflag 這個是在設定 cdflag 旗標,作用是在關閉 DNSSEC 查詢。DNSSEC 是一種 DNS 延生安全協議,它能確保你的 DNS 紀錄無法偽造。但有些時候 DNSSEC 管理不當的話就會造成 DNSSEC 驗證失敗,你會發生不穩定的 DNS 解析,這時候你就可以試者用 +cdflag 旗標來測試將此查詢關閉 DNSSEC,如果一般查詢沒有回應,但 +cdflag 能有正確回應,表示你的 DNSSEC 壞掉摟:

(8.8.8.8 沒有回應)
{13:26}:@~]$ dig @8.8.8.8 haway.xyz a +short

(用 CD Flag 來讓 8.8.8.8 關閉 DNSSEC 驗證)
{13:26}:@~]$ dig +cdflag @8.8.8.8 haway.xyz a +short
146.66.105.148

查詢類型(type)

dig 指令的最後就是你要查詢的 DNS 類型,預設不輸入的話會查詢 A 紀錄。在做 dig 除錯的時候一定要指定類型,因為你必須確認你正在查詢的 DNS 資料是什麼。

範例

# 查詢 Cache Server 的 A 紀錄
$ dig @8.8.8.8 blog.rsync.tw a

# 查詢網域名稱的 MX
$ dig rsync.tw mx

# 查詢域名負責人
$ dig rsync.tw soa

# 追蹤模式
$ dig +trace blog.rsync.tw a

# tcp 查詢模式
$ dig +tcp blog.rsync.tw a

# 查詢 IP 反解
$ dig -x 8.8.8.8 ptr

# 關閉 DNSSEC 查詢
$ dig +cdflag @8.8.8.8 blog.rsync.tw a

最後修改日期: 2019-05-07

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。