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 解析
網路版的 Dig
讓業務之類的非技術人員,電腦沒有裝dig又臨時需要用到的人使用
https://toolbox.googleapps.com/apps/dig/
留言
推