如何使用dig命令挖掘域名解析信息

命令行工具 dig 是用於解析域名和故障排查的一個利器。

從主要功能上來說,dig 和 nslookup 之間差異不大,但 dig 更像一個加強版的 nslookup,可以查詢到一些由域名服務器管理的信息,這在排查某些問題的時候非常有用。總的來說,dig 是一個既簡單易用又功能強大的命令行工具。(LCTT 譯註:dig 和 nslookup 行為的主要區別來自於 dig 使用是是操作系統本身的解析庫,而 nslookup 使用的是該程序自帶的解析庫,這有時候會帶來一些行為差異。此外,從表現形式上看,dig 返回是結果是以 BIND 配置信息的格式返回的,也帶有更多的技術細節。)

dig 最基本的功能就是查詢域名信息,因此它的名稱實際上是“域名信息查詢工具Domain Information Groper”的縮寫。dig 向用戶返回的內容可以非常詳盡,也可以非常簡潔,展現內容的多少完全由用戶在查詢時使用的選項來決定。

我只需要查詢 IP 地址

如果只需要查詢某個域名指向的 IP 地址,可以使用 +short 選項:

<code>

$

dig

facebook.com

+short

31.13

.66

.35

/<code>

在查詢的時候發現有的域名會指向多個 IP 地址?這其實是網站提高其可用性的一種措施。

<code>

$

dig

networkworld.com

+short

151.101

.2

.165

151.101

.66

.165

151.101

.130

.165

151.101

.194

.165

/<code>

也正是由於這些網站通過負載均衡實現高可用,在下一次查詢的時候,或許會發現這幾個 IP 地址的排序有所不同。(LCTT 譯註:瀏覽器等應用默認會使用返回的第一個 IP 地址,因此這樣實現了一種簡單的負載均衡。)

<code>

$

dig

networkworld.com

+short

151.101

.130

.165

151.101

.194

.165

151.101

.2

.165

151.101

.66

.165

/<code>

標準返回

dig 的標準返回內容則包括這個工具本身的一些信息,以及請求域名服務器時返回的響應內容:

<code>

$

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

;;

WHEN:

Thu

Feb

13

13

:49:53

EST

2020

;;

MSG SIZE rcvd:

109

/<code>

由於域名服務器有緩存機制,返回的內容可能是之前緩存好的信息。在這種情況下,dig 最後顯示的查詢時間Query time會是 0 毫秒(0 msec):

<code>

;;

Query time:

0

msec

<==

;;

SERVER:

127.0

.0

.53

;;

WHEN:

Thu

Feb

13

15

:30:09

EST

2020

;;

MSG SIZE rcvd:

109

/<code>

向誰查詢?

在默認情況下,dig 會根據 /etc/resolv.conf 這個文件的內容決定向哪個域名服務器獲取查詢結果。你也可以使用 @ 來指定 dig 請求的域名服務器。

在下面的例子中,就指定了 dig 向 Google 的域名服務器 8.8.8.8 查詢域名信息。

<code>

$

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

;;

WHEN:

Thu

Feb

13

14

:26:14

EST

2020

;;

MSG SIZE rcvd:

109

/<code>

想要知道正在使用的 dig 工具的版本,可以使用 -v 選項。你會看到類似這樣:

<code>

$

dig

-v

DiG

9.11

.5

-P4-5.1ubuntu2.1-Ubuntu

/<code>

或者這樣的返回信息:

<code>

$

dig

-v

DiG

9.11

.4

-P2-RedHat-9.11.4-22.P2.el8

/<code>

如果你覺得 dig 返回的內容過於詳細,可以使用 +noall(不顯示所有內容)和 +answer(僅顯示域名服務器的響應內容)選項,域名服務器的詳細信息就會被忽略,只保留域名解析結果

<code> 

$

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

/<code>

批量查詢域名

如果你要查詢多個域名,可以把這些域名寫入到一個文件內(domains),然後使用下面的 dig 命令遍歷整個文件並給出所有查詢結果。

<code>

$

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

/<code>

你也可以在上面的命令中使用 +short 選項,但如果其中有些域名指向多個 IP 地址,就無法看出哪些 IP 地址對應哪個域名了。在這種情況下,更好地做法應該是讓 awk 對返回內容進行處理,只留下第一列和最後一列:

<code>

$

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

/<code>


分享到:


相關文章: