現在ネットワークで使用中のIPアドレスを調べるには、pingコマンドだけではなくarpコマンドも使うとよい。さらにforコマンドと組み合わせれば、簡単にLAN上のIPアドレスを列挙できる。
対象OS:Windows 2000/Windows XP Professional/Windows Server 2003
ネットワークの管理やトラブルシューティングをする場合、あるIPアドレスが使用されているかどうかを調査したいということがある。例えば新しいマシンを導入するのでIPアドレスを新たに用意したいのだが、実際にそのIPアドレスが空いているかどうか(他のマシンによって使用されていないかどうか)を事前に調査しておきたいというような場合だ。
これとは逆に、本来ならば割り当ての対象とはしていないはずのIPアドレスが、LAN上のいずれかのマシンで使用されている場合もある。そのような(管理外の)マシンを見つけるためにも、IPアドレスが使用中かどうかが分かると便利である。
現在では、IPアドレスの割り当てには、DHCPサービスを使うのが一般的であり、管理外のIPアドレスが割り当てられてしまう可能性は少なくなっている。しかしDHCPサーバーは、自身が割り当てたIPアドレスは管理しているが、ネットワーク上にある全てのIPアドレスを管理しているわけではない(管理ツールではないのでこれが当然だが)。
そのため、誰かが勝手に管理されていないマシンをネットワークに接続したり、何らかのトラブルによって、本来は使用していないはずのIPアドレスが使用されている可能性もある。このような事態を見つけるためには、現在の実際のネットワーク上におけるIPアドレスの使用状況を調査する必要があるだろう。
あるIPアドレスが使用中かどうかを調査するには、pingコマンドを使うのがいちばん簡単で確実である。右の関連記事でも解説しているとおり、pingはTCP/IPにおける最も基本的なネットワーク診断ツールである。
pingで使用されているICMPプロトコルは、全てのTCP/IPプロトコルスタックに備わっている基本プロトコルなので、pingを使えば、全てのIPアドレスが存在するかどうかをチェックできるはずである。つまりLAN上の全IPアドレスに向けてpingを実行し、応答が戻ってきたらそのIPアドレスは使用中ということである。
だが実際にはファイアウォールソフトウェアなどによって、このpingコマンドに対する応答(正確にはICMP echoプロトコル)がブロックされていることがある。現在では、イントラネット(社内)で使用されるマシンでも、クライアント向けのファイアウォールやウイルス対策ソフトウェアなどが導入されることが多いので、このような事態が起こる可能性がある。
pingパケットがブロックされていると、ICMP Echoに対する応答(ICMP Echo Reply)が戻ってこなくなるので、IPアドレスが使用されているかどうかを判断することはできない。
しかしネットワークプロトコルレベルで見ると、ICMP Echoを送受信する前に、必ずARPプロトコルのやりとりが行われているはずである。ARPプロトコルは、TCP/IPによる通信に先立って必ず行われるものであり、ファイアウォールによってブロックされている可能性はほとんどないだろう(ARPについては右上の関連記事を参照)。ARPがブロックされると、相手のMACアドレスが解決できず、通信できないからだ。
ただしMACアドレスレベルでフィルターするようなデバイスやファイアウォールがあると、正しい結果が得られなくなる可能性がある。また、ARPプロトコルは、同一のLANセグメントでないと機能しないので(別のネットワークセグメントの場合はルーターが中継するので、ARPプロトコルでは調査できない)、調査対象となるネットワークセグメント上で直接情報を収集しないといけない。
だが、このような制約を理解して使えば、十分に役に立つであろう。用途に応じてarpとpingを使い分けていただきたい。
ARPプロトコルによってIPアドレスが存在するかどうかをチェックするには、arp.exeというコマンドを使ってARPテーブルの内容を表示させればよい。
ただし、ARPプロトコルだけを単独で送受信することはできないので(ICMP Echoを直接扱うpingと違って、ARPの送受信だけを行うようなコマンドは用意されていない)、最初に調査対象のIPアドレスに向けて、何らかのIPパケットを送信する必要がある。
IPパケットを送信しようとすると、それに先立ってまずARPによるやりとりが行われ、相手のMACアドレス情報がローカルのARPテーブルに登録される。arpコマンドはARPテーブルの内容を表示させることができるので、このテーブルの中に目的のIPアドレスがあるかどうかを調べれば、そのIPアドレスが使用中かどうかが分かるだろう。
つまり調査手順としては、あるIPアドレスに向けてpingを実行し、その後、すぐにarpコマンドで確認すればよい。
なお、ARPテーブルに登録されたエントリの寿命は、通常は数分から10分程度である。これは、ダイナミックなMACアドレスの変更などに対処するためである。そのため、最初にpingをまとめて実行しておいてから、後でじっくりARPテーブルの内容を調査しても、すでにテーブルから削除されている可能性がある。pingを実行したら、すぐにARPテーブルを表示させ、内容を確認する必要がある。
以上で調査の手順はお分かりいただけたであろう。あとはIPアドレスを順番に生成して、pingとarpコマンドを交互に実行すればよい。このような操作を自動的に行うツールもいろいろと作成されている。
本稿では、簡単に実行できる方法として、コマンドプロンプト上でforコマンドを使う方法を紹介しておく。これならどこででも、何の準備もなく実行できる。
Windows 2000やWindows XPなどのOSでは、コマンドプロンプト上でforコマンドを使って、順に数字列を生成できる。これを使って、例えば次のようなコマンドを実行すればよい。
for /l %i in (0,1,255) do ping -w 1 -n 1 192.168.0.%i && arp -a 192.168.0.%i >> arp.log
※このコマンドをバッチファイルにする場合は、3カ所ある「%i」を「%%i」にして ipusecheck.batなどというファイル名で保存すること。
「for /l in (0,1,255)」は、変数%iの内容を0、1、2、…、254、255と変更しながら、以下のコマンドを実行せよという意味である。この変数と「192.168.0.」という文字列を組み合わせることにより、192.168.0.0、192.168.0.1、…、192.168.0.254、192.168.0.255というIPアドレスを生成している。ただし先頭の0と最後の255は、通常は除外した方がよいだろう(これらはネットワークアドレスとブロードキャストアドレスに使用されるので)。
「ping -w 1 -n 1 192.168.0.%i」は、待ち時間1(=1ms)で、1回だけpingを実行せよ、「arp -a 192.168.0.%i」は、そのIPアドレスに関するARPテーブルのエントリを表示せよ、という意味である。
最終的な結果はarp.logというファイルに(追加モードで)書き出している。この中から、エントリが「dynamic」となっている行だけ抜き出すと、次のような結果が得られる。
C:\>findstr dynamic arp.log
192.168.0.111 00-03-47-b3-dd-42 dynamic
192.168.0.112 00-80-45-34-0a-89 dynamic
192.168.0.116 00-03-47-86-4c-5f dynamic
192.168.0.117 00-20-ed-5b-fc-06 dynamic
192.168.0.128 00-e0-18-f6-12-2e dynamic
192.168.0.129 02-34-3a-23-14-21 dynamic
192.168.0.140 00-e0-18-e9-a6-57 dynamic
(以下省略)
先頭にあるのがIPアドレス、そしてその次にあるのがMACアドレスである。ネットワークの環境によっては同じMACアドレスが返される場合もあるだろうが(Proxy ARPなどが機能している場合)、いずれにしろ、そのIPアドレスが使用されているかどうかは判断できる。
なお、1回しか実行しないと、たまたま電源がオフになっているようなマシンを検出できないので、ネットワークの使用状況などを見ながら、何度か実行するとよいだろう。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.