天天看點

dig指令的用法

Dig是linux中的域名解析工具,功能比nslookup強很多,使用也很友善,不用象nslookup總是set不停。

Dig是domain information groper的縮寫,知道了來源想必大家也就容易記住這條指令了。

其使用方法如下:

看懂預設輸出:

最簡單最常見的查詢是查詢一台主機,但是預設情況下,Dig的輸出資訊很詳細。你可能不需要所有的輸出,

但是它确實值得知道。下面是一個帶有注釋的查詢:

上面是我調用dig 的指令行。

;; global options:  printcmd

Dig的部分輸出告訴我們一些有關于它的版本資訊(version 9.2.3)和全局的設定選項,如果+nocmd在指令行下

是第一個參數的話,那麼這部分輸出可以通過加+nocmd的方式查詢出來。

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43071

;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3

在這裡,Dig告訴我們一些從DNS傳回的技術資訊,這段資訊可以用選項 +[no]comments來控制顯示,但是小心

,禁止掉comments也可能關閉一些其它的選項。

;; QUESTION SECTION:

;www.isc.org.  IN  A

在這個查詢段中,Dig顯示出我們查詢的輸出,預設的查詢是查詢A記錄,你可以顯示或者禁止掉這些用+[no]

question選項

;; ANSWER SECTION:

這些輸出,但是你可以用+[no]answer保留這些選項。

;; AUTHORITY SECTION:

isc.org.  2351  IN  NS  ns-int.isc.org.

isc.org.  2351  IN  NS  ns1.gnac.com.

isc.org.  2351  IN  NS  ns-ext.isc.org.

這段權威說明告訴我們哪個DNS伺服器給我們提供權威的答案。在這個例子中,isc.org有3個Name Server,你

可以用+[no]authority選項保留這段輸出。

;; ADDITIONAL SECTION:

ns1.gnac.com.  171551  IN  A  209.182.216.75

ns-int.isc.org.  2351  IN  A  204.152.184.65

ns-int.isc.org.  2351  IN  AAAA  2001:4f8:0:2::15

這些額外選項很有代表性地包含了列出的權威DNS的IP位址,這段輸出可以用+[no]additional選項保留。

;; Query time: 2046 msec

;; SERVER: 127.0.0.1#53(127.0.0.1)

;; WHEN: Fri Aug 27 08:22:26 2004

;; MSG SIZE  rcvd: 173

最後一段預設輸出包含了查詢的統計資料,可以用+[no]stats保留。

我們可以查詢什麼?

Dig可以讓你有效地查詢DNS,最常用的查詢是A記錄,TXT(文本注釋),MX記錄,NS記錄,或者任意綜合查詢

查找yahoo.com的A記錄:

dig yahoo.com A +noall +answer

查找yahoo.com MX記錄的清單:

dig yahoo.com MX +noall +answer

查找yahoo.com的權威DNS:

dig yahoo.com NS +noall +answer

查詢上面所有的記錄:

dig yahoo.com ANY +noall +answer

在現在這種IPv4和IPV6混用的情況下,你也可以使用AAAA的選項查詢主機的IPv6 AAAA記錄:

如果你要查詢的域允許轉發,你也可以查詢到相關的資訊,比如DNS記錄在internet上的生存周期,但是,現

在隻有很少的DNS允許無限制轉發。

我們怎樣查詢?

獲得精簡答案?

當我們需要一個快速回答時,+short選項是你最好的朋友:

204.152.184.88

獲得一個不是十分精簡的答案?

精簡答案和隻有一個答案是不一樣的,獲得沒有附加資訊的詳細答案的方法是使用+noall選項,這樣就隻保留

你想要的輸出。

下面是隻有一個答案的精簡查詢,最後包含所有的配置資訊,包括TTL資料,格式化的BIND配置資訊。

$ dig fsf.org mx +short

20 mx20.gnu.org.

30 mx30.gnu.org.

10 mx10.gnu.org.

$ dig +nocmd fsf.org mx +noall +answer

fsf.org.  3583  IN  MX  30 mx30.gnu.org.

fsf.org.  3583  IN  MX  10 mx10.gnu.org.

fsf.org.  3583  IN  MX  20 mx20.gnu.org.

獲得一個詳細答案?

通過它的man page,你可以通過+multiline選項獲得冗長的多行模式人性化注釋的DSN的SOA記錄,一般來說,

用+multiline選項獲得的資訊可以顯示很多,就像BIND配置檔案一樣。

$ dig +nocmd ogi.edu any +multiline +noall +answer

ogi.edu.  14267 IN A 129.95.59.31

ogi.edu.  14267 IN MX 5 cse.ogi.edu.

ogi.edu.  14267 IN MX 15 hermes.admin.ogi.edu.

ogi.edu.  14267 IN SOA zeal.admin.ogi.edu. hostmaster.admin.ogi.edu. (

200408230  ; serial

14400  ; refresh (4 hours)

900  ; retry (15 minutes)

3600000  ; expire (5 weeks 6 days 16 hours)

14400  ; minimum (4 hours)

)

ogi.edu.  14267 IN NS zeal.admin.ogi.edu.

ogi.edu.  14267 IN NS cse.ogi.edu.

ogi.edu.  14267 IN NS fork.admin.ogi.edu.

查找PTR記錄?

可以用 -x的選項查找IP位址的主機名。

$ dig -x 204.152.184.167 +short

mx-1.isc.org.

在這個循環中,腳本很靈活地在給出的子網中映射出名字。

#!/bin/bash

NET=18.7.22

for n in $(seq 1 254); do

ADDR=${NET}.${n}

echo -e "${ADDR}\t$(dig -x ${ADDR} +short)"

done

查詢一個不同的命名伺服器?

查詢指令如下:

使用/etc/resolv.conf裡面的記錄查詢

主機将從/etc/resolv.conf檔案裡面自動查詢DNS記錄

$ host www

但是,預設情況下,dig會産生出一些意想不到的輸出。如果你想查詢本地主機名而不是全域名時候,使用

+search 選項

dig www +search

處理大部分的查詢?

如果你想查詢大量的主機名,你可以把它們存放在一個文本檔案中(一條記錄一行),使用帶-f參數的dig來依

次查詢。

# 查詢大量的主機名

dig -f /path/to/host-list.txt

# 相同的,更明确的輸出

dig -f /path/to/host-list.txt +noall +answer

但是我要告訴你的是,dig 9.2.3以及以後的版本都不支援使用-f的選項反向查詢了。

驗證DNS映射

不正确的DNS配置會給你帶來很多苦惱,你可以通過如下兩種方式驗證你的DNS配置:

1.每個主機名應該被解析到一個IP位址,而且那個IP位址也應該反指向那個主機名。

2.如果你子網上一個位址被反指向一個主機名,那麼那個主機名也必須指向這個IP。

對于這兩條規則來說,還有一些例外情況,比如CNAME應該首先解析到另外一個主機名,而且隻能指向一個IP

,有時多個主機名指向了相同的IP位址,但是那個IP隻能有一個PTR記錄。

綜上,這些有助于你檢查你的DNS映射是否像你想象的那樣工作。

你也可以編寫一個測試腳本寫入你已知的主機名,如下所示,内容很簡單;它執行時當捕捉到一個CNAME時它

就會中斷,如果多個主機名指向同一個IP位址它會報錯。我們假設這個檔案包含你的主機名叫做named-hosts

#

# test DNS forward- and reverse-mapping

# edit this variable to reflect local class C subnet(s)

NETS="192.168.1 192.168.2"

# Test name to address to name validity

echo

echo -e "\tname -> address -> name"

echo '----------------------------------'

while read H; do

ADDR=$(dig $H +short)

if test -n "$ADDR"; then

HOST=$(dig -x $ADDR +short)

if test "$H" = "$HOST"; then

echo -e "ok\t$H -> $ADDR -> $HOST"

elif test -n "$HOST"; then

echo -e "fail\t$H -> $ADDR -> $HOST"

else

echo -e "fail\t$H -> $ADDR -> [unassigned]"

fi

echo -e "fail\t$H -> [unassigned]"

done < named-hosts

# Test address to name to address validity

echo -e "\taddress -> name -> address"

echo '-------------------------------------'

for NET in $NETS; do

A=${NET}.${n}

HOST=$(dig -x $A +short)

if test -n "$HOST"; then

ADDR=$(dig $HOST +short)

if test "$A" = "$ADDR"; then

echo -e "ok\t$A -> $HOST -> $ADDR"

elif test -n "$ADDR"; then

echo -e "fail\t$A -> $HOST -> $ADDR"

echo -e "fail\t$A -> $HOST -> [unassigned]"

有趣的dig

建立屬于你自己的named.root檔案

任何連接配接到internet 的DNS伺服器肯定會有InterNIC的named.root檔案的拷貝,檔案列出所有internet的根

DNS,如果你不怕麻煩的話,你可以經常從InterNIC的ftp伺服器上把它下載下傳下來,或者,你可以使用dig指令

建立屬于你自己的時髦的named.root

dig +nocmd . NS +noall +answer +additional

你的TTL值在這邊可能會很小,但是它是你找到最新的named.root檔案!

跟蹤dig的查詢路徑

你可能是個traceroute的狂熱愛好者,經常喜歡檢視如何從點A連接配接點B。那你可以使用dig +trace選項做類似

的事。

dig gentoo.de +trace

你可以在dig輸出的頭部分看到根DNS,然後找到負責解析所有*.de的DNS,最後找到gentoo.de的域名IP。

擷取SOA記錄

作為一個DNS管理者,我有時會(對DNS配置)做一些改變,并且想知道我的DNS解析是否推送的還是舊資料,

這個+nssearch選項可以給你的公衆伺服器提供清楚的統計資訊。

# the unvarnished truth

dig cse.ogi.edu +nssearch

# the same, displaying only serial number and hostname

dig cse.ogi.edu +nssearch | cut -d' ' -f4,11

解釋TTL數值

我喜愛google有很多原因,其中一個原因就是它在我的WEB日志中提供了精确的連結,它會使我很容易地指出

哪種類型的查詢引導人們來通路這個站點的頁面。

出乎意料的是,我已經看到很多請求要求查詢TTL數值,我從來沒想到TTL會成為最受歡迎的東東,但是你每天

都在學習新東西,是以,應大家的要求,這裡稍微介紹一下TTL。

如果你從本地DNS查詢網際網路位址,伺服器指出從哪裡獲得權威的答案并獲得位址,一旦伺服器獲知答案,它

将這個答案儲存在本地緩存中以免你在稍後的時間内再次查詢同樣的位址,這樣它就會很快地從緩存中擷取你

要的答案,比你再次從internet查詢要快很多。

當域管理者配置DNS記錄時,他們可以決定這個記錄可以在緩存中儲存多長時間,這就是TTL數值(通常用多少

秒來表示)。

通常地,遠端伺服器一般對記錄的緩存隻儲存TTL數值長的時間。時間過期後,伺服器會重新整理它的本地緩存并

重新查詢一個權威答案。

當你用dig來查詢DNS伺服器某條記錄時,伺服器會告訴dig這條記錄可以在緩存中保持的時間長短。

舉個例子,像上面寫的那樣,gmail.com域的MX記錄的TTL值是300s,gmail.com域的管理者要求遠端伺服器緩

存它的MX記錄不能高于5分鐘,是以當你第一次查詢那個記錄(gmail.com的MX記錄)時,dig會告訴你一個300

的TTL。

$ dig +nocmd gmail.com MX +noall +answer

gmail.com.  300  IN  MX  20 gsmtp57.google.com.

gmail.com.  300  IN  MX  10 gsmtp171.google.com.

如果你一段時間後再去查,你會發現TTL值減少為280(中間隔了20s)。

gmail.com.  280  IN  MX  10 gsmtp171.google.com.

gmail.com.  280  IN  MX  20 gsmtp57.google.com.

如果你的時間計算得足夠好,你會擷取這條記錄的最後生存時間。

gmail.com.  1  IN  MX  10 gsmtp171.google.com.

gmail.com.  1  IN  MX  20 gsmtp57.google.com.

在那之後,你查詢的DNS伺服器會“忘記”這個問題的答案,在你下次查詢這條記錄時,整個循環又将開始(

本例子中是300s)。

在 unix 和 linux 下,建議大家使用 dig 指令來代替 nslookup。 dig 指令的功能比 nslookup 強大很多,不像 nslookkup 還得 set 來 set 去的,怪麻煩的。下面是 dig 的一些比較常用的指令:

# dig 最基本的用法

dig @server qianlong.com

# 用 dig 檢視 zone 資料傳輸

dig @server qianlong.com AXFR

# 用 dig 檢視 zone 資料的增量傳輸

dig @server qianlong.com IXFR=N

# 用 dig 檢視反向解析

dig -x 124.42.102.203 @server

# 查找一個域的授權 dns 伺服器

dig  qianlong.com +nssearch

# 從根伺服器開始追蹤一個域名的解析過程

dig  qianlong.com +trace

# 檢視你使用的是哪個 F root dns server

dig +norec @F.ROOT-SERVERS.NET HOSTNAME.BIND CHAOS TXT

# 檢視 bind 的版本号

dig @bind_dns_server CHAOS TXT version.bind

********************************

<a href="ftp://ftp.isc.org/isc/bind/contrib/ntbind-9.3.0/BIND9.3.0.zip" target="_blank">ftp://ftp.isc.org/isc/bind/contrib/ntbind-9.3.0/BIND9.3.0.zip</a>

*********************************

用途

DNS 查詢實用程式。

文法

dig [@server] [-b address] [-c class] [-f filename] [-k filename] [ -n ][-p port#] [-t type] [-x addr] [-y name:key] [name] [type] [class] [queryopt...]

dig [-h]

dig [global-queryopt...] [query...]

描述

dig(域資訊搜尋器)指令是一個用于詢問 DNS 域名伺服器的靈活的工具。它執行 DNS 搜尋,顯示從受請求的域名伺服器傳回的答複。多數 DNS 管理者利用 dig 作為 DNS 問題的故障診斷,因為它靈活性好、易用、輸出清晰。雖然通常情況下 dig 使用指令行參數,但它也可以按批處理模式從檔案讀取搜尋請求。不同于早期版本,dig 的 BIND9 實作允許從指令行發出多個查詢。除非被告知請求特定域名伺服器,dig 将嘗試 /etc/resolv.conf 中列舉的所有伺服器。當未指定任何指令行參數或選項時,dig 将對“.”(根)執行 NS 查詢。

标志

-b address 設定所要詢問位址的源 IP 位址。這必須是主機網絡接口上的某一合法的位址。

-c class 預設查詢類(IN for internet)由選項 -c 重設。class 可以是任何合法類,比如查詢 Hesiod 記錄的 HS 類或查詢 CHAOSNET 記錄的 CH 類。

-f filename 使 dig 在批處理模式下運作,通過從檔案 filename 讀取一系列搜尋請求加以處理。檔案包含許多查詢;每行一個。檔案中的每一項都應該以和使用指令行接口對 dig 的查詢相同的方法來組織。

-h 當使用選項 -h 時,顯示一個簡短的指令行參數和選項摘要。

-k filename 要簽署由 dig 發送的 DNS 查詢以及對它們使用事務簽名(TSIG)的響應,用選項 -k 指定 TSIG 密鑰檔案。

-n 預設情況下,使用 IP6.ARPA 域和 RFC2874 定義的二進制标号搜尋 IPv6 位址。為了使用更早的、使用 IP6.INT 域和 nibble 标簽的 RFC1886 方法,指定選項 -n(nibble)。

-p port# 如果需要查詢一個非标準的端口号,則使用選項 -p。port# 是 dig 将發送其查詢的端口号,而不是标準的 DNS 端口号 53。該選項可用于測試已在非标準端口号上配置成偵聽查詢的域名伺服器。

-t type 設定查詢類型為 type。可以是 BIND9 支援的任意有效查詢類型。預設查詢類型是 A,除非提供 -x 選項來訓示一個逆向查詢。通過指定 AXFR 的 type 可以請求一個區域傳輸。當需要增量區域傳輸(IXFR)時,type 設定為 ixfr=N。增量區域傳輸将包含自從區域的 SOA 記錄中的序列号改為 N 之後對區域所做的更改。

-x addr 逆向查詢(将位址映射到名稱)可以通過 -x 選項加以簡化。addr 是一個以小數點為界的 IPv4 位址或冒号為界的 IPv6 位址。當使用這個選項時,無需提供 name、class 和 type 參數。dig 自動運作類似 11.12.13.10.in-addr.arpa 的域名查詢,并分别設定查詢類型和類為 PTR 和 IN。

-y name:key 您可以通過指令行上的 -y 選項指定 TSIG 密鑰;name 是 TSIG 密碼的名稱,key 是實際的密碼。密碼是 64 位加密字元串,通常由 dnssec-keygen(8)生成。當在多使用者系統上使用選項 -y 時應該謹慎,因為密碼在 ps(1)的輸出或 shell 的曆史檔案中可能是可見的。當同時使用 dig 和 TSCG 認證時,被查詢的名稱伺服器需要知道密碼和解碼規則。在 BIND 中,通過提供正确的密碼和 named.conf 中的伺服器聲明實作。

參數

global-queryopt... 全局查詢選項(請參閱多個查詢)。

查詢 查詢選項(請參閱查詢選項)。

查詢選項

dig 提供查詢選項号,它影響搜尋方式和結果顯示。一些在查詢請求報頭設定或複位标志位,一部分決定顯示哪些回複資訊,其它的确定逾時和重試戰略。每個查詢選項被帶字首(+)的關鍵字辨別。一些關鍵字設定或複位一個選項。通常字首是求反關鍵字含義的字元串 no。其他關鍵字配置設定各選項的值,比如逾時時間間隔。它們的格式形如 +keyword=value。查詢選項是:

+[no]tcp

查詢域名伺服器時使用 [不使用] TCP。預設行為是使用 UDP,除非是 AXFR 或 IXFR 請求,才使用 TCP 連接配接。

+[no]vc

查詢名稱伺服器時使用 [不使用] TCP。+[no]tcp 的備用文法提供了向下相容。 vc 代表虛電路。

+[no]ignore

忽略 UDP 響應的中斷,而不是用 TCP 重試。預設情況運作 TCP 重試。

+domain=somename

設定包含單個域 somename 的搜尋清單,好像被 /etc/resolv.conf 中的域僞指令指定,并且啟用搜尋清單處理,好像給定了 +search 選項。

+[no]search

使用 [不使用] 搜尋清單或 resolv.conf 中的域僞指令(如果有的話)定義的搜尋清單。預設情況不使用搜尋清單。

+[no]defname

不建議看作 +[no]search 的同義詞。

+[no]aaonly

該選項不做任何事。它用來提供對設定成未實作解析器标志的 dig 的舊版本的相容性。

+[no]adflag

在查詢中設定 [不設定] AD(真實資料)位。目前 AD 位隻在響應中有标準含義,而查詢中沒有,但是出于完整性考慮在查詢中這種性能可以設定。

+[no]cdflag

在查詢中設定 [不設定] CD(檢查禁用)位。它請求伺服器不運作響應資訊的 DNSSEC 合法性。

+[no]recursive

切換查詢中的 RD(要求遞歸)位設定。在預設情況下設定該位,也就是說 dig 正常情形下發送遞歸查詢。當使用查詢選項 +nssearch 或 +trace 時,遞歸自動禁用。

+[no]nssearch

這個選項被設定時,dig 試圖尋找包含待搜名稱的網段的權威域名伺服器,并顯示網段中每台域名伺服器的 SOA 記錄。

+[no]trace

切換為待查詢名稱從根名稱伺服器開始的代理路徑跟蹤。預設情況不使用跟蹤。一旦啟用跟蹤,dig 使用疊代查詢解析待查詢名稱。它将按照從根伺服器的參照,顯示來自每台使用解析查詢的伺服器的應答。

+[no]cmd

設定在輸出中顯示指出 dig 版本及其所用的查詢選項的初始注釋。預設情況下顯示注釋。

+[no]short

提供簡要答複。預設值是以冗長格式顯示答複資訊。

+[no]identify

當啟用 +short 選項時,顯示 [或不顯示] 提供應答的 IP 位址和端口号。如果請求簡短格式應答,預設情況不顯示提供應答的伺服器的源位址和端口号。

+[no]comments

切換輸出中的注釋行顯示。預設值是顯示注釋。

+[no]stats

該查詢選項設定顯示統計資訊:查詢進行時,應答的大小等等。預設顯示查詢統計資訊。

+[no]qr

顯示 [不顯示] 發送的查詢請求。預設不顯示。

+[no]question

當傳回應答時,顯示 [不顯示] 查詢請求的問題部分。預設作為注釋顯示問題部分。

+[no]answer

顯示 [不顯示] 應答的回答部分。預設顯示。

+[no]authority

顯示 [不顯示] 應答的權限部分。預設顯示。

+[no]additional

顯示 [不顯示] 應答的附加部分。預設顯示。

+[no]all

設定或清除所有顯示标志。

+time=T

為查詢設定逾時時間為 T 秒。預設是5秒。如果将 T 設定為小于1的數,則以1秒作為查詢逾時時間。

+tries=A

設定向伺服器發送 UDP 查詢請求的重試次數為 A,代替預設的 3 次。如果把 A 小于或等于 0,則采用 1 為重試次數。

+ndots=D

出于完全考慮,設定必須出現在名稱 D 的點數。預設值是使用在 /etc/resolv.conf 中的 ndots 語句定義的,或者是 1,如果沒有 ndots 語句的話。帶更少點數的名稱被解釋為相對名稱,并通過搜尋清單中的域或檔案 /etc/resolv.conf 中的域僞指令進行搜尋。

+bufsize=B

設定使用 EDNS0 的 UDP 消息緩沖區大小為 B 位元組。緩沖區的最大值和最小值分别為 65535 和 0。超出這個範圍的值自動舍入到最近的有效值。

+[no]multiline

以詳細的多行格式顯示類似 SOA 的記錄,并附帶可讀注釋。預設值是每單個行上顯示一條記錄,以便于計算機解析 dig 的輸出。

多條查詢

dig 的 BIND9 支援在指令行上指定多個查詢(支援 -f 批處理檔案選項的附加功能)。每條查詢可以使用自己的标志位、選項和查詢選項。

在這種情況下,在上面描述的指令行文法中,每條查詢自變量代表一個個别查詢。每一條由任意标準選項和标志、待查詢名稱、可選查詢類型和類以及任何适用于該查詢的查詢選項。

也可以使用對所有查詢均有效的查詢選項全局集合。全局查詢選項必須位于指令行上第一個名稱、類、類型、選項、标志和查詢選項的元組之前。任何全局查詢選項(除了 +[no]cmd 選項)可以被下面的查詢特别選項重設。例如:

示例

一個典型的 dig 調用類似:

dig @server name type其中:

server

待查詢名稱伺服器的名稱或 IP 位址。可以是用點分隔的 IPv4 位址或用冒号分隔的 IPv6 位址。當由主機提供伺服器參數時,dig 在查詢域名伺服器前先解析那個名稱。如果沒有伺服器參數可以提供,dig 參考 /etc/resolv.conf,然後查詢列舉在那裡的域名伺服器。顯示來自域名伺服器的應答。

name

将要查詢的資源記錄的名稱。

type

顯示所需的查詢類型 - ANY、A、MX、SIG,以及任何有效查詢類型等。如果不提供任何類型參數,dig 将對紀錄 A 執行查詢。

本文轉自月魔zhi蕾51CTO部落格,原文連結:http://blog.51cto.com/308107405/1368984 ,如需轉載請自行聯系原作者

繼續閱讀