特定のサーバーを指すすべてのCNAMEエントリを検出するために内部DNSエントリをクエリする方法はありますか?
編集:私たちはWindows環境であるServer 2003です。
環境を指定していませんが、Unixを使用している場合は、Digとgrepの組み合わせが機能するはずです。 ns.example.com
はネームサーバーのホスト名、example.com
はホストが属しているドメイン、HostはすべてのCNAMEレコードを検索するホストです。これは実際にはgrepコマンドのタブ文字であり、文字どおり<TAB>
ではありません(grep文字列を調整する必要がある場合があります)。
また、ネームサーバーはゾーン転送を許可するように構成する必要があります。その詳細は実装に依存します。
Dig @ns.example.com example.com axfr |grep 'CNAME<tab>Host$'
または、Windowsを使用している場合は nslookup を使用できます。
C:\> nslookup
> name ns.example.com
> ls -a example.com FILE
これは、ドメインexample.com
のすべてのレコードをns.example.com
が「知っている」FILEに出力するはずです。その後、対応するCNAMEを探すために、テキストファイルを並べ替えるツールを使用できます。
またはこれとunested(しかし見た目は正しいようです)Perl script :
#!/usr/bin/Perl
use Net::DNS;
($target, $zone) = @ARGV;
$res = new Net::DNS::Resolver;
foreach $rr ($res->axfr($zone)) {
print $rr->name."\n" if (($rr->type eq "CNAME") && ($rr->rdatastr eq $target."."));
}
完全性のためのいくつかのポイント:
DNS構成にアクセスできる場合、このデータを発見するのは簡単です。ただし、誰でもサーバーを指すCNAMEを持つことができます。これらを追跡することはできません。
@wombieが指摘したように、CNAMESの逆引きはできません。 CNAMESに相当するPTRはなく、たとえ存在する可能性があるとしても、一部のレコードしか存在しません。無作為に選択されたドメインを簡単に確認すると、PTRレコードがAレコードをポイントしていないことがよくあります。同様に、ランダムアドレスのPTRレコードの逆ルックアップを実行しても、対応するAレコードが見つからないことがよくあります。
編集:CNAMEはシステムにエイリアスを設定する唯一の方法ではありません。 DNSでは、複数のAレコードが同じアドレスを指すことができます。機能的にはCNAMEを追加するのと同じですが、方法が異なります。ドメイン外でも同じ問題が発生します。さまざまなAレコードを検索するには、問題のシステムのIPアドレスを検索します。
DNSプロトコルでは、このような「逆」ルックアップを行うことはできません。 kceが提供するgrepの提案を使用するなど、プロトコルを終了する必要があります。
powershellを使用します。
microsoft DNSサーバーのプライマリ名を確認します。
Get-WmiObject -Namespace 'root\MicrosoftDNS' -Class MicrosoftDNS_AType -Filter "IPAddress = 'xx.xx.xx.xx(IP)'" -ComputerName mydnsservername
microsoft DNSサーバーからそのホストのすべてのcnameを取得します。
Get-WmiObject -Namespace 'root\MicrosoftDNS' -Class MicrosoftDNS_CNAMEType -Filter "primaryname = 'ドットで終了した最初のクエリのプライマリ名。'" -ComputerName mydnsservername | select ownername、primaryname
dnscmd
を使用してゾーンデータをエクスポートします:dnscmd a.ns.example.com/zoneexport zone.example.com some-filename-for-this-zone
CNAME
リソースレコードを検索します。