TCPを使用してdigやnslookupを実行する
DNSの動作確認の際、UDPでなくTCPでクエリ送信したいケースがあります。
本記事は、TCPを使用してdigやnslookupを実行する手順をまとめておくものです。
関連記事として、DNS over TCPについてはDNS over TCP未対応の環境が数%あるらしいにまとめてあります。
本記事の目的
- TCPを使用してdigやnslookupを実行する。
目次
基本
dig
は+tcp
実行例:
$ dig @dnsserver testnap1.jp +tcp
- 逆に、TCPを使用しないことを明示する場合には
+notcp
を付与します(UDPのみ使用)。 - デフォルトでは、ゾーン転送関連のクエリでない限り、UDPが使用されます。
- ゾーン転送関連のクエリ(AXFR、IXFR)の場合はデフォルトTCPが使用されます。
- DNSサーバから応答が得られずタイムアウトした時には、
connection timed out; no servers could be reached
といったメッセージが表示されます。 - タイムアウト秒数は
+time=x
、リトライ回数は+tries=x
で指定可能です。
nslookup
は-vc
実行例:
> nslookup -vc testnap1.jp dnsserver
- Microsoft解説ページに説明があります。
“vc サーバーに要求を送信するときに常に仮想回線を使用することを指定します。”- TCPによる通信を”仮想回線”(Virtual Circuit)と呼ぶこともあるようです。
- デフォルトは
-novc
であり、UDPが使用されます。 - Windows上の
nslookup
でも、Linux上のnslookup
でも、このvcオプションに関しては同様です。 - DNSサーバから応答が得られずタイムアウトした時には、
DNS request timed out.
の後、*** xxxxx への要求がタイムアウトしました
といったメッセージが表示されます。 - タイムアウト秒数は
-timeout=x
、リトライ回数は-retry=x
で指定可能です。
詳細
Windowsのnslookup
コマンド実装の不思議な点
Microsoftの説明には、nslookup
コマンドのタイムアウト値はデフォルト5秒、リトライ時にはそれが2倍になる旨記載があります。
ところが、実際にnslookup
コマンドを実行した際には、タイムアウト値はデフォルト2秒であり、またリトライ時にそれが2倍にはならず等倍のままリトライされるように見えます。
Windowsのnslookup
コマンドのヘルプ
非対話型モード(コマンドラインモード)では、ヘルプを表示できなさそうなので、対話型モードでヘルプ表示させる必要性があります。
help
、もしくは?
です。
> nslookup 既定のサーバー: xxxxxxx Address: xxx.xxx.xxx.xxx > help コマンド: (識別子は大文字で示され、[] はオプションを意味します) NAME - 既定のサーバーを使用するホスト/ドメイン名に関する情報を 印刷します NAME1 NAME2 - 上記と同様ですが、NAME2 をサーバーとして使用します help または ? - 一般的なコマンドに関する情報を印刷します set OPTION - オプションを設定します all - オプション、現在のサーバー、およびホストを印刷します [no]debug - デバッグ情報を印刷します [no]d2 - 完全なデバッグ情報を印刷します [no]defname - 各クエリにドメイン名を付加します [no]recurse - クエリへの再帰回答を要求します [no]search - ドメイン検索一覧を使用します [no]vc - 常に仮想回線を使用します domain=NAME - 既定のドメイン名を NAME に設定します srchlist=N1[/N2/.../N6] - ドメインを N1 に設定し、検索一覧を N1、N2 などに 設定します root=NAME - ルート サーバーを NAME に設定します retry=X - 再試行の回数を X に設定します timeout=X - 初期タイムアウト間隔を X 秒に設定します type=X - クエリの種類を設定します (A、AAAA、A+AAAA、ANY、 CNAME、MX、NS、PTR、SOA、SRV など) querytype=X - type と同じです class=X - クエリのクラスを設定します (IN (Internet)、ANY など) [no]msxfr - MS 高速ゾーン転送を使用します ixfrver=X - IXFR 転送要求で使用される現在のバージョンです server NAME - 現在の既定のサーバーを使用して、既定のサーバーを NAME に 設定します lserver NAME - 初期サーバーを使用して、既定のサーバーを NAME に設定します root - 現在の既定のサーバーを root に設定します ls [opt] DOMAIN [> FILE] - DOMAIN 内のアドレスを一覧表示します (オプションとして FILE に出力します) -a - 正規名とエイリアスを一覧表示します -d - すべてのレコードを一覧表示します -t TYPE - 指定の RFC レコードの種類のレコードを一覧表示します (A、CNAME、MX、NS、PTR など) view FILE - 'ls' 出力ファイルを並べ替えて、pg で表示します exit - プログラムを終了します