朝から昼寝

整理しておきたいIT関連の小ネタ

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で指定可能です。

詳細

Windowsnslookupコマンド実装の不思議な点

Microsoftの説明には、nslookupコマンドのタイムアウト値はデフォルト5秒、リトライ時にはそれが2倍になる旨記載があります。
ところが、実際にnslookupコマンドを実行した際には、タイムアウト値はデフォルト2秒であり、またリトライ時にそれが2倍にはならず等倍のままリトライされるように見えます。

Windowsnslookupコマンドのヘルプ

非対話型モード(コマンドラインモード)では、ヘルプを表示できなさそうなので、対話型モードでヘルプ表示させる必要性があります。

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            - プログラムを終了します