2013-10-11 54 views
97

有沒有什麼辦法可以列出域名的所有DNS記錄?如何列出所有DNS記錄?

我知道這樣的事情dig和nslookup,但他們只能走這麼遠。舉例來說,如果我有一個子域A記錄作爲

test A somedomain.co.uk 

那麼除非我特別要求它,例如。

dig any test.somedomain.co.uk 

我看不到它。

有什麼辦法(比去的DNS管理器查看記錄等),看看到底是什麼所有的DNS記錄?

+0

http://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions#Zone_enumeration_issue.2C_controversy.2C_and_NSEC3 – SLaks

回答

109

當查詢任何你會得到的級別的所有記錄的列表,但沒有下文。

# try this 
dig google.com any 

這將返回A記錄,TXT記錄,NS記錄,MX記錄,等等如果域名是完全 「google.com」。但它不會返回子記錄(例如,www.google.com)。更確切地說,如果它們存在,你可以獲得這些記錄。如果名稱服務器選擇不這樣做(例如,減小響應的大小),則不必返回這些記錄。

的AXFR是一個區域傳輸,並有可能你想要什麼。但是,除非您控制區域,否則這些通常是受限制的並且不可用。您通常會直接從授權服務器(下面的@ ns1.google.com)進行區域傳輸,並且通常會從不可發佈的名稱服務器(隱形名稱服務器)進行區域傳輸。

# This will return "Transfer failed" 
dig @ns1.google.com google.com axfr 

如果你對該區的控制,你可以將它設置爲獲取與一個TSIG密鑰來保護傳輸。這是客戶端可以發送給服務器授權傳輸的共享祕密。

+3

感謝您的(也deltab)。非常明確的解釋,證實了我的懷疑 - 這是可用的,但不是我(除非我開始建立我自己的名稱服務器)。 正如我很多領域照顧它會一直這麼好只是爲了運行一個腳本來獲取所有的DNS條目。 – Ken

+6

當我嘗試這樣做時,亞馬遜的Route53名稱服務器沒有包含TXT,MX和SOA。在我特別查詢了這些記錄後,他們將其納入ANY的任何答案中。所以拿一點鹽來吧。 – Peter

+0

我剛剛得到「連接被拒絕」 – niico

10

你想要什麼叫做區域傳輸。您可以使用dig -t axfr申請區域轉移。

A 區域是一個域名及其下面的所有域,不會委派給其他服務器。

注意,區域傳輸並不總是支持。它們不用於正常查找,僅用於在服務器之間複製DNS數據;但也有其他協議可用於此目的(例如通過ssh的rsync),可能存在公開名稱帶來的安全風險,並且區域傳輸響應比通常的DNS查找生成和發送花費更多。

11

在沒有做區域傳輸的能力,我寫了這個小bash腳本,dg

#!/bin/bash 
COMMON_SUBDOMAINS=(www mail smtp pop imap blog en ftp ssh login) 
if [[ "$2" == "x" ]]; then 
    dig +nocmd "$1" +noall +answer "${3:-any}" 
    wild_ips="$(dig +short "*.$1" "${3:-any}" | tr '\n' '|')" 
    wild_ips="${wild_ips%|}" 
    for sub in "${COMMON_SUBDOMAINS[@]}"; do 
     dig +nocmd "$sub.$1" +noall +answer "${3:-any}" 
    done | grep -vE "${wild_ips}" 
    dig +nocmd "*.$1" +noall +answer "${3:-any}" 
else 
    dig +nocmd "$1" +noall +answer "${2:-any}" 
fi 

現在我用dg example.com獲得的DNS記錄一個不錯的,乾淨的列表,或dg example.com x包括一堆其他流行的子域名。

grep -vE "${wild_ips}"過濾掉的記錄,可能是因爲* 10800 IN A 1.38.216.82通配符DNS條目這樣的結果。否則,通配符條目會使其顯示爲每個$COMMON_SUBDOMAN都有記錄。

注:這依賴於ANY查詢,這是blocked by some DNS providers such as CloudFlare

+2

我知道這個解決方案遠非理想,但它爲我節省了很多時間,所以我希望它對其他人有用。 – Zaz

8
  1. 區域傳輸是要確保你有所有子域名記錄的唯一途徑。如果DNS配置正確,則通常無法執行外部區域傳輸。

  2. scans.io項目有可以下載和搜索子域的DNS記錄的數據庫。這需要下載DNS數據的87GB,或者你可以在https://hackertarget.com/find-dns-host-records/

5

host -a效果很好,類似於dig any嘗試在網上搜索數據。

EG:

$ host -a google.com 
Trying "google.com" 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10403 
;; flags: qr rd ra; QUERY: 1, ANSWER: 18, AUTHORITY: 0, ADDITIONAL: 0 


;; QUESTION SECTION: 
;google.com.   IN ANY 

;; ANSWER SECTION: 
google.com.  1165 IN TXT "v=spf1 include:_spf.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all" 
google.com.  53965 IN SOA ns1.google.com. dns-admin.google.com. 2014112500 7200 1800 1209600 300 
google.com.  231 IN A 173.194.115.73 
google.com.  231 IN A 173.194.115.78 
google.com.  231 IN A 173.194.115.64 
google.com.  231 IN A 173.194.115.65 
google.com.  231 IN A 173.194.115.66 
google.com.  231 IN A 173.194.115.67 
google.com.  231 IN A 173.194.115.68 
google.com.  231 IN A 173.194.115.69 
google.com.  231 IN A 173.194.115.70 
google.com.  231 IN A 173.194.115.71 
google.com.  231 IN A 173.194.115.72 
google.com.  128 IN AAAA 2607:f8b0:4000:809::1001 
google.com.  40766 IN NS ns3.google.com. 
google.com.  40766 IN NS ns4.google.com. 
google.com.  40766 IN NS ns1.google.com. 
google.com.  40766 IN NS ns2.google.com. 
+4

這並不回答問題,即如何在域的DNS區域中查找其他記錄,即,另外還有子域的所有記錄。這並不是說'host -a'不是一個有用的命令,它只是不執行OP所要查找的內容。 – spikyjt

+0

沒有爲我工作 – bjornl

14

我已經改善Josh的答案。我注意到,只顯示已經出現在查詢域名服務器的緩存條目,所以最好從SOA拉的權威域名服務器(而不是依賴於默認的域名服務器)。我也禁用了對通配符IP的過濾,因爲通常我對設置的正確性更感興趣。

新腳本需要-x論據擴展輸出和-s NS參數來選擇一個特定的域名服務器:dig -x example.com

#!/bin/bash 
set -e; set -u 
COMMON_SUBDOMAINS="www mail mx a.mx smtp pop imap blog en ftp ssh login" 
EXTENDED="" 

while :; do case "$1" in 
    --) shift; break ;; 
    -x) EXTENDED=y; shift ;; 
    -s) NS="$2"; shift 2 ;; 
    *) break ;; 
esac; done 
DOM="$1"; shift 
TYPE="${1:-any}" 

test "${NS:-}" || NS=$(dig +short SOA "$DOM" | awk '{print $1}') 
test "$NS" && NS="@$NS" 

if test "$EXTENDED"; then 
    dig +nocmd $NS "$DOM" +noall +answer "$TYPE" 
    wild_ips=$(dig +short "$NS" "*.$DOM" "$TYPE" | tr '\n' '|') 
    wild_ips="${wild_ips%|}" 
    for sub in $COMMON_SUBDOMAINS; do 
    dig +nocmd $NS "$sub.$DOM" +noall +answer "$TYPE" 
    done | cat #grep -vE "${wild_ips}" 
    dig +nocmd $NS "*.$DOM" +noall +answer "$TYPE" 
else 
    dig +nocmd $NS "$DOM" +noall +answer "$TYPE" 
fi 
0

有沒有簡單的方法來得到一個實例域中的所有DNS記錄。 您只能查看某些記錄,例如,如果您想查看某個域的A記錄,則可以使用該命令:挖一個(記錄類型)domain.com。對於您想要在該域中看到的所有其他類型的記錄,這都是一樣的。

如果不熟悉命令行界面,你也可以使用像mxtoolbox.com網站。這是獲取域的記錄非常方便的工具。

我希望這能回答你的問題。