DNSが正しく設定されないと、インターネットの接続が行えないなどのトラブルが発生する。こうしたトラブルの原因を調べるには、nslookupコマンドを利用するとよい。Windows OSのnslookupで名前からIPアドレス、またはIPアドレスから名前を導き出す、といった基本的な使い方を説明する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
対象OS:Windows 8.1/Windows 10/Windows 11、Windows Server 2012/Windows Server 2012 R2/Windows Server 2016/Windows Server 2019/Windows Server 2022
「ネットワーク名が見つかりません」「\\<サーバ名>にアクセスできません」「<サーバ名>のサーバーIPアドレスが見つかりませんでした」……。Windows OSからリモートのコンピューターを参照しようとしたら、このようなエラーメッセージに遭遇したことはないだろうか。
こうしたエラーの原因の1つが、「DNS(Domain Name System)」に関するトラブルである。本Tech TIPSでは、Windows OSでのDNSトラブル解決で定番のツール「nslookup」の使い方を紹介する。原則として、企業などの組織内LAN(イントラネット)での利用を前提とし、基本的な概念や使い方に焦点を当てている。より高度な使い方については、別のTech TIPSで紹介したい。
以下では、Windows 10でnslookupを実行したときの例およびスクリーンショットを記している。ただし他のWindows OSでも基本的な動作は共通である。
「nslookup」はDNSサービスのトラブルシューティングの場合に必ずといってよいほど使われる、非常に基本的なコマンドである。DNSサーバの設定の状態を調べたり、DNSのクライアントにおけるDNS関連の設定を調査したりする場合に利用される(一般的には後者の方が多いだろう)。
nslookupは、最初にUNIX上でDNSが開発されたときから利用されている非常に歴史の古いコマンドである。同様のコマンドとして、UNIXやLinuxなどでは「dig」「host」といった、より高機能なコマンドの利用が推奨されている。しかしWindows OSではデフォルトでnslookup.exeしか用意されておらず、現在でもよく使われている。
nslookupの使い方を説明する前に、DNSサービスの機能をごく簡単に説明しておこう。
DNSは、例えば「atmarkit.itmedia.co.jp」といったFQDN名(ホスト名+ドメイン名を完全に指定した形式)と、それに対応付けられている「54.92.15.132」などというIPアドレスを相互に変換するサービスである。
DNSサーバには、以下のようなレコードが多数登録されている(レコードの種類は他にもある)。
DNSサーバは、DNSのクライアントからの要求に応じて、これらのレコードを検索し、レコード情報を返すことになっている。
例えばDNSのクライアントが「atmarkit.itmedia.co.jp」というホストを表す文字列をDNSサーバに渡すと、DNSサーバはこの文字列に割り当てられているIPアドレス「54.92.15.132」を返してくる。逆に、「54.92.15.132」というIPアドレスを渡すと、「ec2-54-92-15-132.ap-northeast-1.compute.amazonaws.com」という名前を返す(逆引きで得られた名前が元のホスト名と一致しないことはよくある)。
ユーザーがコンピューターを利用する場合、このようなDNSサーバとDNSクライアントによる名前解決処理は自動的に行われる。しかし、DNSサーバ側の設定ミスやDNSクライアント側でのDNSサーバ指定の間違い、DNSサーバとクライアント間での通信エラーなどにより、名前解決が正しく行えない場合がある。このようなトラブルが発生した場合に役に立つのがnslookupコマンドである。
nslookupコマンドは、DNSのサーバに対して直接DNS要求を送り、その結果を表示する。DNSサーバとのやりとりが直接表示されるので、DNSサーバと正しく通信ができているか、DNSクライアントからの要求に対するサーバの応答は正しいか、サーバに設定されているレコード情報は正しいか、といったことが調査できる。
Windows OSでは、DNSサーバに要求を出すクライアント側のプログラムとして「DNS Client」サービスが動作している。これは直接DNSサーバに問い合わせるだけでなく、サービス内部にキャッシュされた情報から検索したり、複数のDNSサーバに順に問い合わせたりするなど、いくらか高度な処理を行っている。そのため、DNSサーバに登録された最新のレコード情報と食い違っているなどの可能性もある。
だがnslookupを使えば、DNSサーバに対して直接DNS要求を送信してその結果を得ることができる。また特定のDNSサーバを指定することもできるので、DNSレコード情報を直接提供しているDNSサーバ(「権威のある(Authoritative)DNSサーバ」。プライマリDNSサーバともいう)だけでなく、セカンダリDNSサーバやキャッシュDNSサーバ、フォワードのみのDNSサーバなど、いろいろなサーバを指定して、それぞれからのDNS応答が正しいかどうかを検査できる。
一番基本的なnslookupの使い方は、引数にホスト名やFQDN名を指定してnslookupを起動することである。
nslookup pc01
ここでは単にホスト名「pc01」のみを指定している。こうすると、現在のクライアント環境におけるデフォルトドメイン名(この場合は「example.jp」)が末尾に補われて、DNS問い合わせが行われる。
結果の先頭2行(画面中の*1)は、このnslookupコマンドが問い合わせの対象としているDNSサーバの名前とIPアドレスである。デフォルトでは、TCP/IPのプロパティにおける、DNSサーバ情報から取得される(複数定義されている場合は最初のDNSサーバ。詳細はTech TIPS「優先DNSサーバと代替DNSサーバの動作について」を参照)。また省略時に補われるデフォルトのドメイン名も、同じくTCP/IPのDNSサフィックス検索一覧(DNS Suffix Search List)の情報から取得される。これらの情報は「ipconfig /all」コマンドで表示できる。
もしDNSサーバそのものが存在しなかったり、応答が得られなかったりしたら、「*** UnKnown への要求がタイムアウトしました」といったエラーメッセージが表示される。
DNSサーバへの問い合わせ結果は、最後の2行に表示されている(画面中の*2)。つまり、「pc01.example.jp」のIPアドレスは「192.168.1.115」であるという結果が得られている。もし存在しない名前ならば「*** server1.example.jp が pc99 を見つけられません: Non-existent domain」などと表示される。
次は単純なホスト名ではなく、FQDN名で検索をしてみよう。この指定方法を使うと、デフォルトとは異なるドメインやサブドメインなどの場合でも検索できる。DNSサーバに対する検索はこのFQDN名による検索が基本である(DNSクライアントは必要に応じてドメイン名を補って検索するようになっている)。
nslookup pc01.example.jp
これは「pc01.example.jp」という名前を検索して、その結果が「192.168.0.115」であったということを表している。
これと似た検索として、さらに次のようなものもある。
nslookup pc01.example.jp.
この問い合わせ(画面中の*5)の最後に「ピリオド(.)」が付いていることに注意してほしい。結果は、画面中の*4も*6も同じであるが、実は途中の経過が少し異なる。
DNSに対する問い合わせでは、最後にピリオドが付いていると、それはFQDNであるとみなされ、自動的なドメイン名の補完は行われない。逆に、ピリオドがない場合は、自動的に現在のドメイン名が補完され、検索が行われる。そしてそれが失敗すると、次にデフォルトドメイン名を1つ分短くして(先頭の方から順に短くする)、次々とテストされ、最終的に結果が得られるまで実行される。
nslookupで指定する名前 | 実際に問い合わせが試行されるFQDN |
---|---|
pc01 | (1) pc01.example.jp. |
pc01.example.jp | (1) pc01.example.jp.example.jp. (2) pc01.example.jp. |
pc01.example.jp. | (1) pc01.example.jp. |
nslookupに対する引数と検索されるFQDNの例 最後にピリオドが指定されていない場合は、(デフォルトのnslookupの検索設定では)デフォルトのドメイン名を補って検索し、失敗すると、デフォルトドメイン名を短くしながら、順番に名前解決を試行する。背景が黄色い部分が、自動的に補われる部分だ。なお、詳細は省略するが「pc01.example.jp.jp」は試行しない。 |
以上の動作を実際に確認するためには、nslookupに「-debug」(もしくは「-d」)オプションを付けて実行するとよい(「nslookup -debug pc01.example.jp」などとする)。この場合、DNSの要求1回ごとに「Got answer:」から始まる詳細な問い合わせ結果の項目が表示される。上表の一番上と一番下の例では、DNSサーバに対して1回しか要求を出しておらず、その結果(「type = A」と表記されるIPv4アドレス)も1回分のみ返される。一方、真ん中の例では、2回DNS要求が発行され、2回分の結果が返されるはずだ。
このような自動的な補完機能は、(サブ)ドメイン指定などを簡単にするために用意されている。例えばデフォルトドメインが「sub1.sub2.example.jp」の場合でも、単に「server1」とすれば、「server1.example.jp」を指すようにするためである。
以上は名前からIPアドレスを求める場合であったが、逆にIPアドレスから元の名前(FQDN名)を求めることもできる。これを「逆引き」という。といっても、実際にはDNSサーバに逆引きのレコード(PTRレコード)が登録されており、それを検索しているにすぎない。そのため、PTRレコードが存在しない場合は、逆引きは失敗する。
逆引きを行うためには、単に引数としてIPアドレスを指定すればよい。
nslookup 192.168.0.115
この例では、「192.168.0.115」の逆引きの結果は「pc01.example.jp」であるという結果が返されている。ただし、これはPTRレコードのデータ部分だけであり、実際のPTRレコード全体を表示するには、次のように「-type=ptr」オプションを付けて実行する(もっとも、結果に大きな違いはないが)。
nslookup -type=ptr 192.168.0.115
「115.0.168.192.in-addr.arpa」というのは、実際に定義されている逆引きレコードのFQDN名である(逆引きレコードは「0.168.192.in-addr.arpa」ドメインに定義されている)。
以上の例では、全てデフォルトのDNSサーバ(上の例ではserver1.example.jp)を利用して検索を行っていた。デフォルト以外のDNSサーバを利用するには、nslookupの引数の最後(第2引数)に、DNSサーバのFQDN名(もしくはIPアドレス)を付加すればよい。
nslookup pc01.example.jp server2
複数のDNSサーバが利用できる場合は、この機能を使って、それぞれのDNSサーバが正しく動作しているか、登録されている内容に矛盾がないかどうかなど調査できる。上記の場合は、最初の「nslookupの基本――Aレコードの検索」の例と結果が同じなので、どちらのDNSサーバの内容も正しいということが分かる。
もし異なる結果が得られたり、どちらかのDNSサーバがダウンしたりしているようならば、DNSサーバ側の調査が必要になるだろう。
前述のようにnslookupコマンドには「-type=ptr」「-debug」といったオプションを指定できる。こうしたオプションの一覧を表示するには、まず引数を付けずにnslookupコマンドを実行する。これでnslookupは対話モードに入るので、表示された「>」というプロンプトに「?」を入力して[Enter]キーを押す。
すると、nslookupのヘルプが表示される。ここで「set OPTION - オプションを指定します」という行の下に表示されるのが、オプションの一覧だ。コマンドラインでは、先頭にハイフン「-」を付けて指定する。
nslookupの対話モードを終了させるには、「exit」と入力して実行すればよい。
■この記事と関連性の高い別の記事
■更新履歴
【2021/10/27】Windows 10以降のWindows OSに対応しました。オプション一覧の表示方法を追記しました。
【2014/09/12】Windows 7以降のWindows OSに対応しました。
【2003/07/19】初版公開(対象はWindows 2000/Windows XP/Windows Server 2003)。
Copyright© Digital Advantage Corp. All Rights Reserved.