Photo by Andres Siimon on Unsplash

dig — DNS lookup utility

man page 開宗明義的說,dig 是個 DNS 查找工具,也是跟 CDN 打交道時最常用的指令之一。

白話的說明就是:用來查某個網址會連到哪台主機。

基本使用

dig 最基本的使用方式是

dig example.com

加上一點點的參數,則是

dig [@server] [name] [type]

name 代表你想查詢的 domain; type 代表 record 類型,包含了 A, AAAA, CNAME, ANY …等,預設為 A ;@server則是指你想 query 的 DNS 伺服器。

有趣的是,後面參數似乎是可以互換位置的,例如說

dig @168.95.1.1 any www.apple.com
dig @168.95.1.1 www.apple.com any
dig www.apple.com @168.95.1.1 any

以上三種輸入會得到一樣的結果,所以可能會在不同的使用者或是說明頁上看到不同的順序。

以 www.google.com 為例,從我所在的地方dig www.google.com 得到這個結果(省去部份輸出,以下皆同):

; <<>> DiG 9.10.6 <<>> www.google.com
;; QUESTION SECTION:
;www.google.com.   IN A
;; ANSWER SECTION:
www.google.com.  208 IN A 172.217.160.100
;; SERVER: 1.1.1.1#53(1.1.1.1)

其中看到 www.google.com. 208 IN A 172.217.160.100 這是一筆 A record,代表 DNS 解析出來的主機,代表你在瀏覽器輸入 www.google.com ,DNS會告訴你把 request 送到該主機。

而 SERVER: 1.1.1.1#53(1.1.1.1) 則是我使用的 Public DNS ,如果你設定為 google 或中華電信,那就會是 8.8.8.8 之類的。 53 Port 是 DNS 預設的 Port 。(突然就知道 AWS Route 53 這樣命名的原因了!)

加點料

@nameserver

有時候因為各式各樣的原因,你希望把 query 送給不同的 DNS ,請加上這個參數。例如說

dig www.apple.com @1.1.1.1
dig www.apple.com @8.8.8.8

ANY

一種特殊的 record type,ANY 會列出所有找到的record。

…本來應該是這樣的,但是我在整理這篇筆記的時候卻發現,希望拿到 anything 的時候, dig 卻給你 nothing。

看看 dig www.apple.com 的輸出:

; <<>> DiG 9.10.6 <<>> www.apple.com
;; ANSWER SECTION:
www.apple.com.  1794 IN CNAME www.apple.com.edgekey.net.
www.apple.com.edgekey.net. 21594 IN CNAME www.apple.com.edgekey.net.globalredir.akadns.net.
www.apple.com.edgekey.net.globalredir.akadns.net. 3594 IN CNAME e6858.dscx.akamaiedge.net.
e6858.dscx.akamaiedge.net. 14 IN A 23.48.141.18

這代表 www.apple.com 設定了 cname ,一路找到最後拿到 A record 是 23.48.141.18 。

再看看加上 ANY dig www.apple.com ANY 的結果:

; <<>> DiG 9.10.6 <<>> 
www.apple.com any
;; QUESTION SECTION:
;www.apple.com.   IN ANY

蛤?不止沒有結果,連 ANSWER SECTION 都不見了?

後來找到 Cloudflare 的說明,ANY 已經在 RFC8482 中正式棄用,而且對於棄用後的 response 沒有明確的標準,也就是說,會根據 DNS 有所不同

例如說,如果用中華電信的 DNS 會得到不太一樣的結果:

; <<>> DiG 9.10.6 <<>> www.apple.com ANY @168.95.1.1
...
;; ANSWER SECTION:
www.apple.com.  1758 IN CNAME www.apple.com.edgekey.net.

大部份關於 dig 的說明都會提到這個 ANY ,拿來使用也不會拿到很明顯的錯誤訊息,但因為結果有很高的不確定性,使用上必需特別注意。

+trace

列出 Query 一路過關斬將的歷程,我們還是用 www.apple.com 來看看:

dig www.apple.com +trace
; <<>> DiG 9.10.6 <<>> www.apple.com A +trace
...
.   510971 IN NS f.root-servers.net.
.   510971 IN NS g.root-servers.net.
.   510971 IN NS h.root-servers.net.
...
;; Received 525 bytes from 1.1.1.1#53(1.1.1.1) in 10 ms
...
com.   172800 IN NS c.gtld-servers.net.
...
;; Received 1173 bytes from 192.5.5.241#53(f.root-servers.net) in 11 ms
apple.com.  172800 IN NS a.ns.apple.com.
apple.com.  172800 IN NS b.ns.apple.com.
;; Received 778 bytes from 192.35.51.30#53(f.gtld-servers.net) in 45 ms
www.apple.com.  1800 IN CNAME www.apple.com.edgekey.net.
;; Received 81 bytes from 204.26.57.1#53(d.ns.apple.com) in 88 ms

(這次的輸出很長,刪掉滿多的),但仍可以看到一路轉發的過程:

從 root (.) 的 13 台server,查到 .com. gTLD , 再從 gTLD 的 server 查到 apple.com. 最後拿到 www.apple.com.edgekey.net. 詳細的Name Server 架構可以參考鳥哥的文章


加更多料

一點個人開發配著用的小手段 &好用工具

配合 watch 使用 watch -n 10 dig www.apple.com

科技始終來自於惰性。DNS 生效常常需要一定的時間,每十秒自動挖一次就不用三不五時自己看了。

whatsmydns

網路服務,可以快速的從世界各處查 DNS 解析

DNS Checker

網路版的 Dig

讓業務之類的非技術人員,電腦沒有裝dig又臨時需要用到的人使用

https://toolbox.googleapps.com/apps/dig/

references

RFC8482 – Saying goodbye to ANYLadies and gentlemen, I would like you to welcome the new shiny RFC8482, which effectively deprecates DNS ANY query…blog.cloudflare.com

鳥哥的 Linux 私房菜 — DNS Server2002/12/10:首次完成 我們都知道,在『記憶』的角色上,人腦總是不如電腦的,而人們對文字的印象又比數字高。因此,想要使用純粹的 TCP/IP 來上網,實在不好記憶又很麻煩。為了適應人類的使用習慣,因此一個名為 DNS…linux.vbird.org

RFC 8482 – Providing Minimal-Sized Responses to DNS Queries That Have QTYPE=ANYInternet Engineering Task Force (IETF) J. Abley Request for Comments: 8482 Afilias Updates: 1034, 1035 O. Gudmundsson…tools.ietf.org

最後修改日期: 2021-08-31

作者

留言

撰寫回覆或留言

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