nslookupコマンドの使い方

windowsにはdigコマンドがついていないため、DNSに関する調査をしたい場合は、nslookupコマンドを使用する。
以下の記載内容は、Windows7Professional SP1付属のnslookupを使用している。


■ 長いので目次
1. 非対話型と対話型
2. nslookupの書式、オプション
3. 問い合わせレコード・ドメインの最後にはピリオドをつける
4. 問い合わせるレコードのタイプ(種類)を変える
5. DNSの問い合わせに対する詳細な情報を見る
6. 問い合わせ先のDNSサーバが、そのドメインのコンテンツサーバかを調べる
7. セカンダリDNSサーバが正常に動作しているかを確認する
8. TCP53番での問い合わせに応答するかを調べる
9. TCPフォールバックされているかを調べる
10. ゾーン転送ができるか確認する
11. nslookupでのエラー一覧



1. 非対話型と対話型
nslookupコマンドは、非対話型による方法と対話型による方法がある。
このサイトでは、主に対話型による方法で説明している。


2. nslookupの書式、オプション
 オプションの詳細は、help や ? で検索するが良し。


3. 問い合わせレコード・ドメインの最後にはピリオドをつける
 nslookupの場合、問い合わせレコードやドメインの最後に [.](ピリオド)がついていないものはFQDNと認識せず、勝手に今のドメイン名を補完する仕組みになっている。
 nslookupで詳細情報を見たい場合やWireSharkなどでパケットキャプチャをする場合、不要な情報が含まれることになり、また、ドメインを補完したことによって
 問い合わせ結果が誤っていたりすることもある。
 よって、ピリオドは付けるようにしたほうが絶対に良い。
 ただし、ゾーン転送の確認においては、ピリオドがないほうが(個人的に)うれしい出力結果になることもある。

 なお、[nosearch]と[nodefname]オプションをつけてドメイン補完をさせないこともできるが、正確な結果が出力されいないこともある。

以下、@〜Cでその例を示す。

@ debugやd2で詳細情報を見たとき、不要な問い合わせをしている
 (ピリオドの有無に関わらず、最初に行っている問い合わせ先DNSの逆引きは、通常の動作)

A メイン補完がない状態での問い合わせをしないことがある
 以下の例では、ピリオドがない場合、ドメイン補完をしない問い合わせをしていないため、Answerが返ってこない。
 (全てではなく、どうやらTLDの問い合わせのみっぽい)
 しかも、結果に記載されている問い合わせ内容(「 jp を見つけられません」)と実際の問い合わせ内容(「jp.example.com」)が異なるので、
 余計にわけわかめになる。
 また、ドメイン補完を無効にした場合も同様に回答なしとなった。(そもそもDNSサーバに問い合わせていない)

B コンテンツDNSサーバに問い合わせたときに、エラーになる
 ドメイン補完されるため、コンテンツDNSサーバの管理外のドメインになり、当然のことながら拒否される。
 こちらもAと同様に、結果に記載されている問い合わせ内容(「 jp を見つけられません」)と実際の問い合わせ内容(「jp.example.com」)が異なるので、
 コンテンツDNSサーバが自身が管理している情報を拒否していると誤認してしまう。

 また、ドメイン補完を無効にした場合も同様に回答なしとなった。(そもそもDNSサーバに問い合わせていない)

C ゾーン転送確認のときは、ピリオド無しのほうがよさげ
 ピリオドがない場合、左辺側はFQDN表記では無いので(たぶん多くの人が)うれしい。


4. 問い合わせるレコードのタイプ(種類)を変える
 デフォルトの問い合わせレコードは、AとAAAAとなっているので、SOAやNS、MX、TXT、PTRの問い合わせがしたい場合は、set typeで変更する必要がある。


5. DNSの問い合わせに対する詳細な情報を見る
 set debugもしくはset d2オプションを指定することで、digコマンドのような詳細情報を表示させることができる。


6. 問い合わせ先のDNSサーバが、そのドメインのコンテンツサーバかを調べる
 回答結果に、[権限のない回答]と表示される場合は、問い合わせ先DNSサーバはそのドメインのコンテンツDNSサーバではなく、キャッシュを返しているだけである。
 よって、回答結果に[権限のない回答]が表示されていなければ、問い合わせたドメインのコンテンツDNSサーバからの回答であるといえるが、確実なのは、[set debug]
 もしくは[set d2]オプションをつけて、ヘッダーフラグに[auth]があることを確認することである。


7. セカンダリDNSサーバが正常に動作しているかを確認する
 セカンダリDNSが適切に動作しているかの条件として、
 @ セカンダリDNSサーバが、そのドメインの上位のDNSサーバでも委譲先DNSサーバ名として登録されていること。
 A セカンダリDNSサーバが、そのドメインの問い合わせに応答していること。
 B セカンダリDNSサーバが持つそのドメインのシリアル番号が、プライマリDNSサーバと一致していること。
 C NSレコードにセカンダリDNSサーバが登録されていること。
 あたりを確認する。

 なお、[適切に動作している][ゾーン転送が正常にできている]な点に注意する。
 (ゾーン転送ができていなくても、セカンダリDNSサーバはそのゾーンの期限が切れるまでは回答を返すため)
 ゾーン転送もできていることを確認したい場合は、10.を参照すること。



8. TCP53番での問い合わせに応答するかを調べる
 DNSサーバへの問い合わせは、通常、UDP/53番ポートに対して行われている。
 しかし、DNSサーバではパケットサイズが大きくUDPで返すことができない場合、TCP53番に切り替えて応答を返す仕組みがある。
 また、TCP53番は、プライマリDNSサーバとセカンダリDNSサーバとの間のゾーン転送でも使用するようになっている。
 TCP53番が許可されているかどうかについては、nslookupコマンドを使って調査することができる。
 少なくとも、セカンダリDNSサーバからプライマリDNSサーバに対してTCP53番での問い合わせができなければ、ゾーン転送は失敗している。


9. TCPフォールバックされているかを調べる
 DNSでは、回答のパケットサイズが大きすぎてUDPでは返せない場合、DNSサーバ側はTCPで問い合わせをし直すように回答を返し、クライアント側はTCPで問い合わせし直す仕組みになっている。
 これをTCPフォールバックというが、この機能の仕組みをnslookupコマンドで見ることができる。


10. ゾーン転送ができるか確認する
 lsオプションを使うことで、指定のDNSサーバに対してゾーン転送ができているかどうか確認できる。
 実際の現場では、セカンダリDNSサーバ(windows)からプライマリDNSサーバに対しての確認に使用される。
 もし、セカンダリDNSサーバ以外からゾーン転送ができるようであれば、プライマリDNSサーバの管理者へ"サーバの運用ができていない"とはっきり言ってあげると良い。


11. nslookupでのエラー一覧
 とりあえずnslookupでよく見かけるエラーを再現してまとめてみました。
既定のサーバ Unknown , DNS request timed out , Non-existent domain , Query refused , Unspecified error , Server failed