Linux下dig命令使用
Dig簡介:
? ?Dig是一個在類Unix命令行模式下查詢DNS包括NS記錄,A記錄,MX記錄等相關信息的工具。由于一直缺失
Dig man page文檔,本文就權當一個dig使用向導吧。
? ?Dig的源碼是ISC BIND大包的一部分,但是大多編譯和安裝Bind的文檔都不把它包括在內,但是在linux系
統下,它通常是某個包的一部分,在Gentoo下是bind-tools,在Redhat/Fedora下是 bind-utils,或者在
Debian下是 dnsutils。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
如果你要查找Bind的配置相關的信息,你參考我的文章:Bind for the mall LAN
(http://www.madboa.com/geek/soho-bind/)。
看懂默認輸出:
最簡單最常見的查詢是查詢一臺主機,但是默認情況下,Dig的輸出信息很詳細。你可能不需要所有的輸出,
但是它確實值得知道。
=======================================================================
下面是一個帶有注釋的查詢:
$ dig?www.isc.org
上面是我調用dig 的命令行。
; <<>> DiG 9.2.3 <<>>?www.isc.org
;; 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:
www.isc.org.? ?? ?? ?? ?600? ???IN? ?? ?A? ?? ? 204.152.184.88
最后,我們得到我們查詢的結果。www.isc.org?的地址是204.152.184.8,我不知道為什么你們更喜歡過濾掉
這些輸出,但是你可以用+[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記錄:(此處一定是域而不是主機,如我公司為xinpindao.com)
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記錄:
dig?www.isc.org?AAAA +short
如果你要查詢的域允許轉發,你也可以查詢到相關的信息,比如DNS記錄在internet上的生存周期,但是,現
在只有很少的DNS允許無限制轉發。
我們怎樣查詢?獲得精簡答案?
當我們需要一個快速回答時,+short選項是你最好的朋友:
dig?www.isc.org?+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
查詢一個不同的命名服務器?
查詢命令如下:
dig @ns1.google.com?www.google.com
使用/etc/resolv.conf里面的記錄查詢
主機將從/etc/resolv.conf文件里面自動查詢DNS記錄
$ host www
www.madboa.com?has address 65.102.49.170
但是,默認情況下,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
。
#!/bin/bash
#
# 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
??else
? ? echo -e "fail\t$H -> [unassigned]"
??fi
done < named-hosts
# Test address to name to address validity
echo
echo -e "\taddress -> name -> address"
echo '-------------------------------------'
for NET in $NETS; do
??for n in $(seq 1 254); 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"
? ?? ?else
? ?? ???echo -e "fail\t$A -> $HOST -> [unassigned]"
? ?? ?fi
? ? fi
??done
done
有趣的dig
創建屬于你自己的named.root文件
任何連接到internet 的DNS服務器肯定會有InterNIC的named.root文件的拷貝,文件列出所有internet的根
DNS,如果你不怕麻煩的話,你可以經常從InterNIC的ftp服務器上把它下載下來,或者,你可以使用dig命令
創建屬于你自己的時髦的named.root
# compare with?ftp://ftp.internic.net/domain/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)。
$ dig +nocmd gmail.com MX +noall +answer
gmail.com.? ?? ???280? ???IN? ?? ?MX? ?? ?10 gsmtp171.google.com.
gmail.com.? ?? ???280? ???IN? ?? ?MX? ?? ?20 gsmtp57.google.com.
如果你的時間計算得足夠好,你會獲取這條記錄的最后生存時間。
$ dig +nocmd gmail.com MX +noall +answer
gmail.com.? ?? ???1? ?? ? IN? ?? ?MX? ?? ?10 gsmtp171.google.com.
gmail.com.? ?? ???1? ?? ? IN? ?? ?MX? ?? ?20 gsmtp57.google.com.
在那之后,你查詢的DNS服務器會“忘記”這個問題的答案,在你下次查詢這條記錄時,整個循環又將開始(
本例子中是300s)。
本HOWTO的官方出處是http://www.madboa.com/geek/dig/
轉載于:https://www.cnblogs.com/oskb/p/3881262.html
總結
以上是生活随笔為你收集整理的Linux下dig命令使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSDN 赚积分C币方法
- 下一篇: Unity小组工程实践项目《最强外卖员》