命令行工具 dig 是用於解析域名和故障排查的一個利器。linux
從主要功能上來講,dig 和 nslookup 之間差別不大,但 dig 更像一個增強版的 nslookup,能夠查詢到一些由域名服務器管理的信息,這在排查某些問題的時候很是有用。總的來講,dig 是一個既簡單易用又功能強大的命令行工具。(LCTT 譯註:dig 和 nslookup 行爲的主要區別來自於 dig 使用是是操做系統自己的解析庫,而 nslookup 使用的是該程序自帶的解析庫,這有時候會帶來一些行爲差別。此外,從表現形式上看,dig 返回是結果是以 BIND 配置信息的格式返回的,也帶有更多的技術細節。)ubuntu
dig 最基本的功能就是查詢域名信息,所以它的名稱其實是「域名信息查詢工具Domain Information Groper」的縮寫。dig 向用戶返回的內容能夠很是詳盡,也能夠很是簡潔,展示內容的多少徹底由用戶在查詢時使用的選項來決定。瀏覽器
我只須要查詢 IP 地址緩存
若是隻須要查詢某個域名指向的 IP 地址,可使用 +short 選項:服務器
$ dig facebook.com +short 31.13.66.35
在查詢的時候發現有的域名會指向多個 IP 地址?這實際上是網站提升其可用性的一種措施。負載均衡
$ dig networkworld.com +short 151.101.2.165 151.101.66.165 151.101.130.165 151.101.194.165
也正是因爲這些網站經過負載均衡實現高可用,在下一次查詢的時候,或許會發現這幾個 IP 地址的排序有所不一樣。(LCTT 譯註:瀏覽器等應用默認會使用返回的第一個 IP 地址,所以這樣實現了一種簡單的負載均衡。)dom
$ dig networkworld.com +short 151.101.130.165 151.101.194.165 151.101.2.165 151.101.66.165
標準返回ide
dig 的標準返回內容則包括這個工具自己的一些信息,以及請求域名服務器時返回的響應內容:工具
$ dig networkworld.com ; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>*gt; networkworld.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39932 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;networkworld.com. IN A ;; ANSWER SECTION: networkworld.com. 300 IN A 151.101.194.165 networkworld.com. 300 IN A 151.101.130.165 networkworld.com. 300 IN A 151.101.66.165 networkworld.com. 300 IN A 151.101.2.165 ;; Query time: 108 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Thu Feb 13 13:49:53 EST 2020 ;; MSG SIZE rcvd: 109
因爲域名服務器有緩存機制,返回的內容多是以前緩存好的信息。在這種狀況下,dig 最後顯示的查詢時間Query time會是 0 毫秒(0 msec):網站
;; Query time: 0 msec <== ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Thu Feb 13 15:30:09 EST 2020 ;; MSG SIZE rcvd: 109
向誰查詢?
在默認狀況下,dig 會根據 /etc/resolv.conf 這個文件的內容決定向哪一個域名服務器獲取查詢結果。你也可使用 @ 來指定 dig 請求的域名服務器。
在下面的例子中,就指定了 dig 向 Google 的域名服務器 8.8.8.8 查詢域名信息。
$ dig @8.8.8.8 networkworld.com ; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> @8.8.8.8 networkworld.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21163 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;networkworld.com. IN A ;; ANSWER SECTION: networkworld.com. 299 IN A 151.101.130.165 networkworld.com. 299 IN A 151.101.66.165 networkworld.com. 299 IN A 151.101.194.165 networkworld.com. 299 IN A 151.101.2.165 ;; Query time: 48 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Thu Feb 13 14:26:14 EST 2020 ;; MSG SIZE rcvd: 109
想要知道正在使用的 dig 工具的版本,可使用 -v 選項。你會看到相似這樣:
$ dig -v DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu
或者這樣的返回信息:
$ dig -v DiG 9.11.4-P2-RedHat-9.11.4-22.P2.el8
若是你以爲 dig 返回的內容過於詳細,可使用 +noall(不顯示全部內容)和 +answer(僅顯示域名服務器的響應內容)選項,域名服務器的詳細信息就會被忽略,只保留域名解析結果
$ dig networkworld.com +noall +answer ; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> networkworld.com +noall +answer ;; global options: +cmd networkworld.com. 300 IN A 151.101.194.165 networkworld.com. 300 IN A 151.101.130.165 networkworld.com. 300 IN A 151.101.66.165 networkworld.com. 300 IN A 151.101.2.165
批量查詢域名
若是你要查詢多個域名,能夠把這些域名寫入到一個文件內(domains),而後使用下面的 dig 命令遍歷整個文件並給出全部查詢結果。
$ dig +noall +answer -f domains networkworld.com. 300 IN A 151.101.66.165 networkworld.com. 300 IN A 151.101.2.165 networkworld.com. 300 IN A 151.101.130.165 networkworld.com. 300 IN A 151.101.194.165 world.std.com. 77972 IN A 192.74.137.5 uushenandoah.org. 1982 IN A 162.241.24.209 amazon.com. 18 IN A 176.32.103.205 amazon.com. 18 IN A 176.32.98.166 amazon.com. 18 IN A 205.251.242.103
你也能夠在上面的命令中使用 +short 選項,但若是其中有些域名指向多個 IP 地址,就沒法看出哪些 IP 地址對應哪一個域名了。在這種狀況下,更好地作法應該是讓 awk 對返回內容進行處理,只留下第一列和最後一列:
$ dig +noall +answer -f domains | awk '{print $1,$NF}' networkworld.com. 151.101.66.165 networkworld.com. 151.101.130.165 networkworld.com. 151.101.194.165 networkworld.com. 151.101.2.165 world.std.com. 192.74.137.5 amazon.com. 176.32.98.166 amazon.com. 205.251.242.103 amazon.com. 176.32.103.205