ARPプロトコルは、IPアドレスからMACアドレスを求めるためのプロトコルである。ARPプロトコルで収集されたMACアドレス情報はARPテーブルに記録される。ARPテーブルの内容を調べることにより、通信相手が存在するかどうかや、そのMACアドレスを調査できる。
対象OS:Windows 2000/Windows XP/Windows Server 2003/Windows Vista
TCP/IPネットワークでは、IPアドレスによって通信相手を特定、識別しているが、下位のイーサネット・レベルではMACアドレスによって通信相手を特定、識別している。そのためTCP/IPレベルで通信するためには、まず通信相手のコンピュータのイーサネットのMACアドレスを調べ、そのMACアドレスに対してパケットを送信しなければならない。この調査に利用されるのがARPプロトコルである。通信に先立ってARP要求をブロードキャスト送信すると、該当するIPアドレスを持つコンピュータが、ARP応答を返すというふうに動作している。ARP応答から、求めるIPアドレスに対応するMACアドレスが取得できる。ARPプロトコルの詳細については「Windowsネットワーク入門第11回―MACアドレスを解決するARPプロトコル」を参照していただきたい。
以上のようにして取得したMACアドレスとIPアドレスの対応情報は、ARPテーブルと呼ばれる内部管理領域に記録される。そして、デフォルトでは最大2分間保持され、時間が過ぎるとそのエントリは消去される(ARPテーブルにエントリが見つからない場合は、また必要に応じてARPパケットが送信される)。
ARPコマンドはARPテーブルを管理するためのコマンドである。コマンド・プロンプト上で「arp -a」を実行すると、現在のARPテーブルの内容が表示される。ARPのエントリは通常は動的に管理されるが、「arp -s」コマンドで静的なエントリを定義することもできる(通信相手を強制的に指定したい場合に利用する)。
以上のように、TCP/IPの通信が行われる場合は、それに先立って必ずARPプロトコルのやり取りが行われ、それがARPテーブルに記録される。よって、ARPテーブルの内容をチェックすれば、どこのコンピュータと通信しているかを確認できる。これを応用すれば、ネットワークのトラブルシューティングなどにおいて、通信相手を特定できる。
例えばWindows OSではデフォルト・ゲートウェイを複数設定することができるため、状況によって利用されるゲートウェイが変わることがあるが(TIPS「デフォルト・ゲートウェイは1つのみ有効」参照)、この方法で現在どのゲートウェイが使われているかを調べることができる。また、ネームサーバ(DNSサーバ)も同様に複数設定できるが、実際にどれが使用されているかを調査することもできる。
このほか、ファイアウォールによってpingなどへの応答が禁止されている場合でも、ARPテーブルを見れば、実際に通信できているかどうかを確認できる。pingコマンドに応答しなくても、ARPには必ず応答することになっているので(ARPを禁止してしまうと、TCP/IP通信が一切できなくなるため)、ARPテーブルを確認すれば、通信相手が存在しているかどうかを確認できる(参考:TIPS「pingでネットワーク・トラブルの原因を調査する」)。
以上のようなARPの使い方は、ネットワークのパケットをキャプチャして解析すれば容易に分かることであるが、そのようなツールがいつも利用できるわけではないので、ARPを使った方法も覚えておくとよい。それに、TCPプロトコルならばnetstatコマンドで通信中の状態(セッション)を調査できるが、UDPやICMPプロトコルによる通信の場合はセッション情報は残らないので、このようなARPコマンドによる方法も効果的である。ARPコマンドはWindows OSの標準コマンドであり、デフォルトで必ず利用できるのもメリットである。本TIPSではその方法について解説する。
ARPテーブルで通信相手を見つけるためには、まず現在のARPテーブルをクリアしておく必要がある。さもないと、複数のエントリが表示され、どのコンピュータと通信しているかが分からなくなるからだ。また混乱を避けるため、ネットワークを利用するアプリケーションなどは(可能な限り)すべて終了しておこう。さもないと勝手にARPプロトコルが送信され、ARPテーブルにエントリが追加されてしまう。
C:\>arp -d * ……ARPテーブルのクリア
The specified entry was not found
C:\>arp -a ……ARPテーブルの表示
No ARP Entries Found ……ARPテーブルの内容は空
なおWindows Vistaの場合は、「arp -d *」を実行するためには管理者権限が必要である。[スタート]メニューの[コマンド・プロンプト]を右クリックし、[管理者として実行]で、管理者モードとして起動して実行していただきたい。
ARPテーブルをクリアしたら、素早く目的のネットワーク・コマンドなどを実行し(pingやnslookupほか)、続いて「arp -a」コマンドでARPテーブルの内容を表示させる。これにより、直前に実行されたARPの結果、つまりWindows OSが通信しようとした相手のARP情報が表示される。
C:\>ping 192.168.2.120 ……192.168.2.120へのping
Pinging 192.168.2.120 with 32 bytes of data: ……pingの通信先
Request timed out. ……pingからの応答がない
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 192.168.2.120:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
C:\>arp -a ……ARPテーブルの表示
Interface: 192.168.2.155 --- 0x2
Internet Address Physical Address Type
192.168.2.120 00-90-cc-08-63-18 dynamic ……ARPテーブル・エントリ
C:\>
この例では、pingコマンドで特定のコンピュータから応答があるかどうかを調べている。pingの結果はすべて「Request timed out.」なので、通信相手が存在していないように見えるが、arpコマンドの結果から分かるように、「192.168.2.120」というコンピュータは実際に存在している。つまりファイアウォールなどでping(ICMPのEchoプロトコル)はブロックされているが、ARPに対しては応答しているということである。
もし「192.168.2.120」というコンピュータが存在しなければ、次のように、ARPテーブルは空のままである。
C:\>arp -d * ……ARPテーブルのクリア
C:\>ping 192.168.2.123 ……192.168.2.123へのping
Pinging 192.168.2.123 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 192.168.2.123:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
C:\>arp -a ……ARPテーブルの表示
No ARP Entries Found ……ARPテーブルは空のまま。つまり通信相手は存在しない
以上のように、ARPテーブルの内容を確認すれば、通信相手のIPアドレスとMACアドレスを特定することができる。ただしARPテーブルによって判断しているため、例えばpingコマンドで通信相手を確認する場合と違い、いくらか注意すべき点がある。
■同一ネットワーク上のみで有効
ARPプロトコルは(イーサネットなどの)MACアドレスをベースにして動作しているため、ルータを越えた先にあるコンピュータのMACアドレスを表示することはできない。別ネットワーク上のコンピュータへpingした場合、ARPテーブルに記録されるのは、(ローカル・ネットワーク上の)ルータのMACアドレスになる。
■名前解決に注意
例えばFQDN名やNetBIOS名を使ってpingを行うと、まず名前解決が行われてから、ping(ICMPのEcho)が実行される。そのためARPテーブルには、名前解決で利用されたARPエントリ(ネーム・サーバとの通信で利用されたもの)も記録される(pingの実際の通信先は、pingコマンドの先頭に表示されている)。
■ほかの通信によってARPエントリが増加することがある
ARPテーブルをクリアしてから、次に表示するまでに時間がかかると、ほかの通信によるARPエントリが表示される可能性がある。トラブルシューティングに無関係な通信はなるべく止めるか、素早く操作する、何度か繰り返すなどして対処していただきたい。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.