コンピュータ名からIPアドレスを求めることを名前解決という。Windowsネットワークでは、大別するとNetBIOS系とTCP/IP系の2種類の名前解決がある。NetBIOSによる名前解決の結果を調べるには、NetBIOSの名前キャッシュを使う。TCP/IPの場合はpingコマンドが便利だ。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
対象OS:対象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アドレスに名前解決されているかを調べ、それが正しいかどうかを検証するとよい。
そこで、本Tech TIPSでは、あるコンピュータ名やホスト名からそのIPアドレスを見つける方法を紹介する
逆に、与えられたIPアドレスから、そのコンピュータ名を見つける方法は、TIPS「WindowsでIPアドレスからホスト名(コンピュータ名)を見つける方法」を参照してほしい。
Windowsネットワークでは、TCP/IPやNBT(NetBIOS over TCP/IP)といったプロトコルが使われている。これらのプロトコルでは、名前(ホスト名やコンピュータ名、マシン名、FQDNなど)とIPアドレスが重要な意味を持っている。
TCP/IPは基本的にはIPアドレスさえあれば動作するプロトコルである。しかし、IPアドレスは人間にとっては覚えにくく扱いにくいものであるため、通常はホスト名やホスト名にドメイン名を加えたFQDN(例:atmarkit.itmedia.co.jp)が利用される。
一方NetBIOSは、基本的にはNetBIOS名という文字列をベースにして動作するサービスである。
だが現在のネットワークは、(基本的には)TCP/IPベースで構築されているので、最終的にはIPアドレスを使って相手のコンピュータと通信していることになる。そのため、コンピュータ名やFQDN名、NetBIOS名などをIPアドレスに対応付けなければならない。
このような名前とIPアドレスの対応付け(名前からIPアドレスを求めること、もしくはその逆操作)は名前解決と呼ばれる。名前解決は比較的コストの大きい処理であり、例えばIPパケットを1回送信するたびに行うことは現実的ではない。そこで、一度変換(取得)した名前解決の結果はキャッシュに格納しておき、名前解決が必要な場合はまずキャッシュの中を検索する。このようなキャッシュ動作は、ネットワークのさまざまな場所で行われている。
キャッシュはパフォーマンスの改善には役立つ一方で、場合によっては古いキャッシュデータを返してしまうという可能性もある。例えばコンピュータの名前(コンピュータ名やドメイン名)を変えたり、IPアドレスを変えたりした場合、変更前の情報がいずれかのキャッシュに残っていると、間違った相手に対して通信しようとする可能性がある。
ネットワークの構成を変更したり、接続するネットワークを変更したりした場合に、相手に接続できない、もしくは間違った相手に接続している、といったトラブルが生じたら、あるコンピュータ名が実際にどのIPアドレスに名前解決されているかを調べ、それが正しいかどうかを検証する必要がある。
Windowsネットワークにおける名前解決の手段には、大きく分けて2つの種類がある。1つはNetBIOSを利用したサービスにおける名前解決であり、もう1つはTCP/IPにおける名前解決である。
NetBIOS名前解決は、NetBIOSを利用したサービスで使われる名前解決の手段である。具体的には、「net use」や「net view」といったNet系コマンド、(古いバージョンの)ファイル共有サービスやプリンタ共有サービスなどで使われている。一般にWindowsネットワークというと、これらのサービスを指すことが多い。lmhostsファイル(デフォルトでは「%windir%\system32\drivers\etc\lmhosts」)やNetBIOSブロードキャスト、WINS(Windows Internet Name Service)などで実際の名前解決の手段として利用されている。
もう1つのTCP/IPにおける名前解決とは、UNIXやLinuxを中心とする、TCP/IPネットワークの世界で培われてきた名前解決の手段である。具体的には、「ping」「ssh」「sftp」「Webブラウザ」「SNSアプリ」などで利用されている。プロトコルとしては、従来のhostsファイルやDNSなどに加えて、近年ではLLMNR(Link-Local Multicast Name Resolution)やmDNS(multicast DNS)が、実際の名前解決の手段として利用されている。
この2つの名前解決は、現在のWindowsネットワークでは相互に補完しながら動作するように設計されているため、その違い(境界)が分かりづらい。しかし、トラブルシューティングなどの場合には、それらの違いを意識する必要がある。
NetBIOS(NBT)プロトコル環境において、あるコンピュータ名(名前)がどのIPアドレスに名前解決されているかを知ることは、Windowsネットワークにおけるトラブルシューティングの第一歩である。
NetBIOSにおける名前解決の結果を確認するためには、TIPS「WindowsでIPアドレスからホスト名(コンピュータ名)を見つける方法」と同様に「nbtstat -a」コマンドを使う方法が簡単だ。これはNetBIOS(NBT)プロトコルを使って指定されたコンピュータに接続する機能を持ったコマンドである。
これを実行すると、指定された名前に対してNetBIOS APIを使って名前解決が行われるとともに、その名前解決の結果がNetBIOS名前キャッシュに保存される。これを表示させると、コンピュータ名がどのようなIPアドレスに変換されたのか分かる。具体的には、次のような3つのコマンドを連続して実行する。
nbtstat -R
nbtstat -a <NetBIOS名>
nbtstat -c
最初の「nbtstat -R」は、現在のNetBIOSの名前キャッシュをクリアするコマンドであり、次のコマンドの結果を分かりやすくするために必要なものだ。
2つ目の「nbtstat -a <NetBIOS名>」は、指定されたコンピュータに対してNetBIOSプロトコルを使って接続するコマンドである。これ以外にも例えば「net view \\<コンピュータ名>」のようなコマンドでも構わない(ただしNetBIOSプロトコルがファイアウォールなどでブロックされていると、これらの手法は使えない)。
最後の「nbtstat -c」は、名前解決の結果が含まれるNetBIOSの名前キャッシュを表示させるコマンドである。最初に「nbtstat -R」でキャッシュをクリアしているので、キャッシュには最新のNetBIOS名前解決の結果だけが含まれているはずである。
実際にこのコマンドを実行すると、次のようになる(キャッシュのクリアには、管理者権限のあるコマンドプロンプト上での実行が必要)。
ここでは、「WINPC001」というコンピュータ名を指定してNetBIOS名前解決をさせている。最後のキャッシュの表示結果を見ると、この名前に対するIPアドレスは「ホストアドレス」のフィールドより、「172.23.144.101」であることが分かる。これが求めるNetBIOS名前解決の結果である。
また「継続時間[秒]」(キャッシュの寿命)の値が「599(秒)」(=約10分)となっている。これは、一度解決された結果はデフォルトでは約10分間有効であるためだ。しばらく時間をおいて再度「nbtstat -c」を実行すると、1秒ずつカウントダウンしていることが分かるだろう。この値が「0」になるとキャッシュから削除され、以後は必要に応じてまたNetBIOS名前解決が実行される。
表示された結果のうち、「EXAMPLE」と「EXAMPLE-DC」については継続時間の値が「-1」となっている。これらはlmhostsという静的なファイル中で事前定義されたエントリであり(lmhostsファイル中で「#PRE」「#DOM」を使って指定している)、無限の寿命を持っていることを表している。lmhostsファイルを使用していない場合、このようなエントリは表示されないので、結果を調査する場合は注意すること(逆に言うと、これらのファイルに設定しておくと、強制的に接続先を変更できるということでもある)。
NetBIOSにおける名前解決の手段には、NetBIOSブロードキャストを使った直接問い合わせの他、WINSサーバへの問い合わせや、lmhostsファイルの参照など、さまざまな方法が存在する(次の図参照)。だが、上記のようにNetBIOSの名前キャッシュの内容を調査すれば、その結果を簡単に知ることができる。詳しくはWindowsネットワーク連載の第19回「NetBIOS over TCP/IPプロトコル(その2)」を参照していただきたい。
TCP/IPにおける名前解決を調査する一番簡単な方法は、pingコマンドを使うことだろう(TIPS「Windowsの『ping』コマンドでネットワークトラブルの原因を調査する」)。pingの引数でコンピュータ名やFQDN名を指定すると、最初にホスト名とそれに対応するIPアドレスが表示される。これを見ることで、指定された名前がどのIPアドレスとして名前解決されているかを確認できる。
この例では、「WINPC001」というコンピュータ名のIPアドレスは「172.23.144.101」であることが分かる。このIPアドレスが本来通信したいIPアドレスと異なっていた場合は、TCP/IPの名前解決の仕組みに基づいて調査する必要がある。
TCP/IPにおける名前解決では、実際にはDNSやhostsファイル(デフォルトでは「%windir%\system32\drivers\etc\hosts」)、WINS、LLMNR、mDNSなどを組み合わせて名前解決を行っている。さらに、それらの結果は適宜キャッシュされるので、場合によってはそれらのデータベース間で不整合が生じることもある(ホスト名やIPアドレスの設定などを変更したり、接続するネットワークを変更したりした場合などに不整合が発生することが多い)。そのため、トラブルシューティング時にはサービスごとの名前解決やキャッシュの内容を詳しく調査しなければならないことがある。
具体的な調査方法を簡単に述べると次のようになる。
hostsやlmhostsファイルの内容を表示させたり、「メモ帳」アプリで開いたりして確認する。
コマンドプロンプトなら、以下のコマンドを実行すればよい。
type %windir%\system32\drivers\etc\hosts
type %windir%\system32\drivers\etc\lmhosts
ただしデフォルトではlmhostsファイルは存在しないため、手動で作成していない場合、2行目のコマンドラインでは「指定されたファイルが見つかりません。」というエラーが発生する。
コマンドプロンプト上で「ipconfig /displaydns」を実行すると、DNSクライアント側にある名前解決結果のキャッシュ内容が表示される。DNSサーバから得られた結果はキャッシュに保存され、キャッシュの内容が優先される(有効期限はDNSサーバ側で個別のDNSレコードごとに設定されている)。
DNSサーバ側でDNSレコードを変更しても、クライアント側のDNSのキャッシュに古いレコード(過去にキャッシュに記録されたレコード)が存在すれば、そちらが優先されることがある。このような場合は、「ipconfig /flushdns」を使ってDNSのクライアント側のキャッシュを破棄させることにより、DNSサーバへのアクセスを強制的に行わせることができる。
DNSサービス利用時の名前解決の挙動については、連載「超入門DNS」も参照していただきたい。
DNSサーバは、DNSクライアントからの要求に応答するために、他のDNSサーバに対する問い合わせ結果を自分自身でもキャッシュしている(このようなDNSサーバを「キャッシュDNSサーバ」という)。この内容を確認するには、nslookupコマンドを使うか、DNSの管理ツールを使ってDNSサーバの持つキャッシュの内容を直接表示させる(Tech TIPS「WindowsでDNSサーバのキャッシュの内容を調査する」参照のこと)。
TCP/IPでも、NBTの名前解決の結果得られたIPアドレスを利用することがある。そのため、NBTの名前解決結果のキャッシュ(ローカルPCのNetBIOS名前キャッシュや、lmhostsファイル、WINSサーバの設定やそのキャッシュ)も調査しなければならない(Tech TIPS「WINSサーバ管理ツールの基本的な使い方」参照のこと)。
家庭やSOHOなど小規模なネットワークで、ローカルサブネット(ローカルセグメント)上の機器の名前解決にDNSサーバが利用できない場合、LLMNRで名前解決が行われることがある。
そのような場合には、PowerShellで「Resolve-DnsName <名前> -LlmnrOnly」というコマンドレットを実行すると、LLMNRでの名前解決の結果を確認できる。それを他の名前解決の結果と照合し、正しいかどうか判断するとよいだろう。
Resolve-DnsNameコマンドレットでは、LLMNRの他にも、特定の方法だけで名前解決を試したり、逆に特定の方法を禁止しつつ試行したりできる。その例を以下に紹介する。
■ローカルキャッシュだけを利用する
Resolve-DnsName <名前> -CacheOnly
■DNSだけを利用する
Resolve-DnsName <名前> -DnsOnly
■LLMNRとNetBIOSだけを利用する
Resolve-DnsName <名前> -LlmnrNetbiosOnly
■hostsファイルを参照しない
Resolve-DnsName <名前> -NoHostsFile
■この記事と関連性の高い別の記事
■更新履歴
【2022/03/30】Windows 11などに対応しました。またLLMNRについて追記しました。
【2018/04/19】最新状況を反映して更新しました。
【2004/01/17】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.