如何使用 dig
你好!最近我和幾個朋友聊天,他們提到希望知道如何使用 dig
來進行 DNS 查詢,所以這是一篇關於它的速讀博文。
當我第一次使用 dig
時,我發現它有點嚇人 —— 有這麼多的選項!我打算把大部分的選項省略。在這篇文章中,我打算不談 dig
的大部分選項,只談我實際使用的選項。
我最近還了解到,你可以設置一個 .digrc
配置文件,讓它的輸出更容易閱讀,這讓它的使用變得更加輕鬆。
幾年前我還畫了一個關於 dig
的 zine 頁,但我想寫這篇文章來包括更多的信息。
兩種類型的 dig 參數:查詢和格式化
有兩種主要的參數可以傳遞給 dig
:
- 告訴
dig
要進行什麼 DNS 查詢的參數。 - 告訴
dig
如何 格式化響應的參數。
首先,讓我們看一下查詢選項。
主要的查詢選項
你通常想控制 DNS 查詢的 3 件事是:
- 名稱(如
jvns.ca
)。默認情況下,查詢的是空名稱(.
)。 - DNS 查詢類型(如
A
或CNAME
)。默認是A
。 - 發送查詢的 伺服器(如
8.8.8.8
)。默認是/etc/resolv.conf
中的內容。
其格式是:
dig @server name type
這裡有幾個例子:
dig @8.8.8.8 jvns.ca
向谷歌的公共 DNS 伺服器(8.8.8.8
)查詢jvns.ca
。dig ns jvns.ca
對jvns.ca
進行類型為NS
的查詢。
-x
:進行反向 DNS 查詢
我偶爾使用的另一個查詢選項是 -x
,用於進行反向 DNS 查詢。下面是輸出結果的樣子。
$ dig -x 172.217.13.174
174.13.217.172.in-addr.arpa. 72888 IN PTR yul03s04-in-f14.1e100.net。
-x
不是魔術。dig -x 172.217.13.174
只是對 174.13.217.172.in-addr.arpa.
做了一個 PTR
查詢。下面是如何在不使用 `-x』 的情況下進行完全相同的反向 DNS 查詢。
$ dig ptr 174.13.217.172.in-addr.arpa.
174.13.217.172.in-addr.arpa. 72888 IN PTR yul03s04-in-f14.1e100.net。
我總是使用 -x
,因為它可以減少輸入。
格式化響應的選項
現在,讓我們討論一下你可以用來格式化響應的參數。
我發現 dig
默認格式化 DNS 響應的方式對初學者來說是很難接受的。下面是輸出結果的樣子:
; <<>> DiG 9.16.20 <<>> -r jvns.ca
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28629
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: d87fc3022c0604d60100000061ab74857110b908b274494d (good)
;; QUESTION SECTION:
;jvns.ca. IN A
;; ANSWER SECTION:
jvns.ca. 276 IN A 172.64.80.1
;; Query time: 9 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sat Dec 04 09:00:37 EST 2021
;; MSG SIZE rcvd: 80
如果你不習慣看這個,你可能需要花點時間來篩選,找到你要找的 IP 地址。而且大多數時候,你只對這個響應中的一行感興趣(jvns.ca. 180 IN A 172.64.80.1
)。
下面是我最喜歡的兩種方法,可以使 dig
的輸出更容易管理:
方式 1 : +noall +answer
這告訴 dig
只列印 DNS 響應中的「答案」部分的內容。下面是一個查詢 google.com
的 NS
記錄的例子:
$ dig +noall +answer ns google.com
google.com. 158564 IN NS ns4.google.com.
google.com. 158564 IN NS ns1.google.com.
google.com. 158564 IN NS ns2.google.com.
google.com. 158564 IN NS ns3.google.com.
這裡的格式是:
NAME TTL TYPE CONTENT
google.com 158564 IN NS ns3.google.com.
順便說一下:如果你曾經想知道 IN
是什麼意思,它是指「查詢類」,代表「 互聯網 」。它基本上只是上世紀 80、90 年代的遺物,當時還有其他網路與互聯網競爭,如「 混沌網路 」。
方式 2:+short
這就像 dig +noall +answer
,但更短:它只顯示每條記錄的內容。比如說:
$ dig +short ns google.com
ns2.google.com.
ns1.google.com.
ns4.google.com.
ns3.google.com.
你可以在 digrc
中設置格式化選項
如果你不喜歡 dig
的默認格式(我就不喜歡!),你可以在你的主目錄下創建一個 .digrc
文件,告訴它默認使用不同的格式。
我非常喜歡 +noall +answer
格式,所以我把 +noall +answer
放在我的 ~/.digrc
中。下面是我使用該配置文件運行 dig jvns.ca
時的情況。
$ dig jvns.ca
jvns.ca. 255在172.64.80.1中
這樣讀起來就容易多了!
如果我想回到所有輸出的長格式(我有時會這樣做,通常是因為我想看響應的權威部分的記錄),我可以通過運行再次得到一個長答案。
$ dig +all jvns.ca
dig +trace
我使用的最後一個 dig
選項是 +trace
。dig +trace
模仿 DNS 解析器在查找域名時的做法 —— 它從根域名伺服器開始,然後查詢下一級域名伺服器(如 .com
),以此類推,直到到達該域名的權威域名伺服器。因此,它將進行大約 30 次 DNS 查詢。(我用 tcpdump
檢查了一下,對於每個根域名伺服器的 A
/ AAAA
記錄它似乎要進行 2 次查詢,所以這已經是 26 次查詢了。我不太清楚它為什麼這樣做,因為它應該已經有了這些 IP 的硬編碼,但它確實如此。)
我發現這對了解 DNS 的工作原理很有用,但我不認為我用它解決過問題。
為什麼要用 dig
儘管有一些更簡單的工具來進行 DNS 查詢(如 dog
和 host
),我發現自己還是堅持使用 dig
。
我喜歡 dig
的地方實際上也是我 不喜歡 dig
的地方 —— 它顯示了大量的細節!
我知道,如果我運行 dig +all
,它將顯示 DNS 響應的所有部分。例如,讓我們查詢 jvns.ca
的一個根名稱伺服器。響應有 3 個部分,我可能會關心:回答部分、權威部分和附加部分。
$ dig @h.root-servers.net. jvns.ca +all
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18229
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 9
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;jvns.ca. IN A
;; AUTHORITY SECTION:
ca. 172800 IN NS c.ca-servers.ca.
ca. 172800 IN NS j.ca-servers.ca.
ca. 172800 IN NS x.ca-servers.ca.
ca. 172800 IN NS any.ca-servers.ca.
;; ADDITIONAL SECTION:
c.ca-servers.ca. 172800 IN A 185.159.196.2
j.ca-servers.ca. 172800 IN A 198.182.167.1
x.ca-servers.ca. 172800 IN A 199.253.250.68
any.ca-servers.ca. 172800 IN A 199.4.144.2
c.ca-servers.ca. 172800 IN AAAA 2620:10a:8053::2
j.ca-servers.ca. 172800 IN AAAA 2001:500:83::1
x.ca-servers.ca. 172800 IN AAAA 2620:10a:80ba::68
any.ca-servers.ca. 172800 IN AAAA 2001:500:a7::2
;; Query time: 103 msec
;; SERVER: 198.97.190.53#53(198.97.190.53)
;; WHEN: Sat Dec 04 11:23:32 EST 2021
;; MSG SIZE rcvd: 289
dog
也顯示了 「附加」 部分的記錄,但它沒有明確指出哪個是哪個(我猜 +
意味著它在附加部分?) ,但它似乎沒有顯示「權威」部分的記錄。
$ dog @h.root-servers.net. jvns.ca
NS ca. 2d0h00m00s A "c.ca-servers.ca."
NS ca. 2d0h00m00s A "j.ca-servers.ca."
NS ca. 2d0h00m00s A "x.ca-servers.ca."
NS ca. 2d0h00m00s A "any.ca-servers.ca."
A c.ca-servers.ca. 2d0h00m00s + 185.159.196.2
A j.ca-servers.ca. 2d0h00m00s + 198.182.167.1
A x.ca-servers.ca. 2d0h00m00s + 199.253.250.68
A any.ca-servers.ca. 2d0h00m00s + 199.4.144.2
AAAA c.ca-servers.ca. 2d0h00m00s + 2620:10a:8053::2
AAAA j.ca-servers.ca. 2d0h00m00s + 2001:500:83::1
AAAA x.ca-servers.ca. 2d0h00m00s + 2620:10a:80ba::68
AAAA any.ca-servers.ca. 2d0h00m00s + 2001:500:a7::2
而 host
似乎只顯示「答案」部分的記錄(在這種情況下沒有得到記錄):
$ host jvns.ca h.root-servers.net
Using domain server:
Name: h.root-servers.net
Address: 198.97.190.53#53
Aliases:
總之,我認為這些更簡單的 DNS 工具很好(我甚至自己做了一個 簡單的網路 DNS 工具),如果你覺得它們更容易,你絕對應該使用它們,但這就是為什麼我堅持使用 dig
的原因。drill
的輸出格式似乎與 dig
的非常相似,也許 drill
更好!但我還沒有真正試過它。
就這些了
我最近才知道 .digrc
,我非常喜歡使用它,所以我希望它能幫助你們中的一些人花更少的時間來整理 dig
的輸出!
有人在 Twitter 上指出,如果有辦法讓 dig
顯示響應的簡短版本,其中也包括響應的狀態(如 NOERROR
、NXDOMAIN
、SERVFAIL
等),那就更好了!我同意這個觀點!不過我在手冊中沒有找到這樣的選項。
via: https://jvns.ca/blog/2021/12/04/how-to-use-dig/
作者:Julia Evans 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive