あるドメインのすべてのDNSレコードをリストアップする方法はありますか?
digやnslookupといったものは知っていますが、それだけでは限界があります。例えば、サブドメインのAレコードが次のようになっているとします。
test A somedomain.co.uk
とした場合、私が特に要求しない限り、例えば
dig any test.somedomain.co.uk
見ることができません。
全てのDNSレコードを正確に確認する方法(DNSマネージャにアクセスしてレコードを見る以外)はありますか?
ANYを検索すると、そのレベルのすべてのレコードのリストが表示されますが、それ以下は表示されません。
# try this
dig google.com any
これは、ドメイン名が正確に "google.com"であれば、Aレコード、TXTレコード、NSレコード、MXレコードなどを返すことができます。ただし、子レコード(例: www.google.com)は返しません。正確には、これらのレコードが存在する場合は取得しても構いません。ネームサーバーは、これらのレコードを返さないことを選択した場合(たとえば、レスポンスのサイズを小さくするため)は、これらのレコードを返す必要はありません。
AXFRはゾーン転送であり、おそらくあなたが望むものです。しかし、これらは一般的に制限されており、あなたがそのゾーンをコントロールしない限り利用できません。通常、ゾーン転送は権威サーバ(下記の@ns1.google.com)から直接行いますが、公開されていないネームサーバ(ステルスネームサーバ)から行うこともあります。
# This will return "Transfer failed"
dig @ns1.google.com google.com axfr
ゾーンを管理している場合、TSIGキーで保護された転送を取得するように設定することができます。これは、クライアントが転送を認証するためにサーバに送ることができる共有秘密です。
ゾーン転送を行う機能がないため、私はこの小さな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
今では DNS レコードのきれいなリストを得るために dg example.com
を使ったり、他の人気のあるサブドメインの束を含めるために dg example.com x
を使ったりしています。
grep -vE "${wild_ips}"は、
* 10800 IN A 1.38.216.82のようなワイルドカード DNS エントリの結果である可能性があるレコードをフィルタリングします。そうしないと、ワイルドカードのエントリーによって、あたかも
$COMMON_SUBDOMAN`ごとにレコードがあるように見えてしまうからです。
注:これは ANY
クエリに依存していますが、これは CloudFlare などの一部の DNS プロバイダーによってブロックされています 。
これを ゾーントランスファー と呼びます。ゾーントランスファーを要求するには、dig -t axfr
を使用します。
ゾーン**とは、1つのドメインと、その下にある他のサーバーに委任されていないすべてのドメインのことです。
ゾーン転送は常にサポートされているわけではないことに注意してください。ゾーン転送は通常の検索には使用されず、DNSデータをサーバ間で複製するためだけに使用されます。しかし、そのために使用できるプロトコルは他にもありますし(ssh上のrsyncなど)、名前を公開することによるセキュリティ上のリスクがあるかもしれません。また、ゾーン転送のレスポンスは、通常のDNS検索よりも生成と送信にコストがかかります。