存在している IP アドレスを検出する

BASIC

arp と ping を用いて、同一ネットワーク内に存在している IP アドレスを検出する方法です。


IP アドレスの存在検出について

同一ネットワーク内に存在している IP アドレスを調べる方法として、arp と ping というコマンドを利用する方法があります。

 

ping というコマンドは、特定の IP アドレスに対して ECHO パケットを投げ、返事を得ることによって、その IP アドレスが存在し、正常に動作していることを確認するために利用されるものです。

これだけでもその IP アドレスが存在しているかどうかの判断に使えることも多いのですが、存在が発見されないように ECHO パケットに敢えて応答しないように設定されているルーター機器もよくありますし、最近ではパーソナルファイアーウォールによって ECHO パケットに応答しない PC も増えているように思います。

そんな ECHO パケットに応答してくれないホストであっても、arp コマンドを併せて使用することで、その存在を知ることが出来る可能性があります。

ARP というのは、ネットワークアダプターに予め割り当てられている MAC アドレスと TCP/IP で使用する IP アドレスとを関連付ける仕組みで、これによって、ある IP アドレス宛ての通信をどのネットワークアダプターへ送信すれば良いかをシステムが判断することが出来るようになっています。

 

TCP/IP ネットワーク通信はその性質上、宛先アドレスがどの MAC アドレスに割り当てられているかを ARP で調べた上で、その MAC アドレスに対して通信パケットを送出します。

そしてその送出パケットが、例えば相手側でファイアーウォールに捨てられようが、送出までにこぎつけていれば、ARP のキャッシュにその IP アドレスと MAC アドレスの対が記録として一定時間残ります。

その ARP のキャッシュを見ることで、その IP アドレスがネットワークに存在していることを確認することができます。

もっとも、ARP も異なるセグメントのネットワークであったり、ブリッジ等の機器で MAC アドレスのフィルタリングがかけられていたりすると、このような方法を取ったとしても存在を検出することはできないので注意は必要です。ただ、ARP で到達できない環境ならば、そもそもそのホストに接続することができないので、何かの際に機器が見つからなくなったといったネットワークの障害検出の手段としては、信頼性はかなり高いと思います。

 

IP アドレスの存在を検出する

実際に Windows PC を使用して、ネットワーク内のホストの存在を検出するには、次のような流れになります。

例えば 192.168.1.1 のホストが存在しているかどうかを知りたい場合は、まず ping コマンドでその存在をチェックします。

ping 192.168.1.1

これで "Reply from 192.168.1.1" といったように応答が帰ってくれば、その時点でホストの存在が確認できたことになります。

"Request timeout" といった具合に、正しい応答が帰ってこなかった場合には、ここで arp コマンドを実行します。

arp -a

このようにすることで、インターネットアドレス (Internet Address)と物理アドレス (Physical Address) の対が画面に表示されます。

この中に、今回の場合は "192.168.1.1" のエントリーが存在すれば、そのホストがネットワーク上に存在していることを確認することができます。

 

ネットワーク上のすべての IP アドレスを検出する

arp と ping コマンドを応用して、ネットワーク上に存在するすべての IP アドレスを検出することも可能です。

そのためには、コマンドラインから次のコマンドを実行することで、ネットワーク上の IP アドレスの存在を順次検出することができます。

for /L %i in (1,1,254) do ping -w 500 -n 1 192.168.1.%i > nul && arp -a 192.168.1.%i

この場合、"192.168.1.1" から 1 ずつ増加させて "192.168.1.254" まで順番に、ping 送信を行って、その結果 ARP キャッシュに記録が残っていればそれを画面に表示するといった処理が自動的に行われます。このコマンドの最後に ">> host.detected.txt" などを追記して、この結果をテキストファイルに保存するなどすれば便利かもしれません。

なお、このコマンドを動かしていたときに動作していたホストしか検出できませんが、トラブルシューティングなどの十分な判断材料にはなるかと思います。

 

マルチキャストアドレスについて

ところで、ARP キャッシュテーブルを確認して、224 から 239 までで始まる知らない IP アドレスがいくつか検出されている場合があるかと思います。

 これは "マルチキャストアドレス" といって、上位 4 ビットが "1110" で、残りのビットがグループ ID となっています。この、アドレス内で設定されているグループに所属しているホスト全てに対して通信パケットを送信する際に、このマルチキャストアドレスが使用されます。

グループアドレスは、IANA によってあらかじめ用途か定められていて、例えば次のようなものが存在しているようです。

224.0.0.1 そのネットワーク内の全てのホスト
224.0.0.2 そのネットワーク内のすべてのルーター
224.0.0.4 すべての DVMRP (実験用プロトコル Distance Vector Multicast Routing Protocol) 対応ルーター
224.0.0.5 すべての OSPF (経路制御プロトコル Open Shortest Path First) 対応ルーター
224.0.0.6 すべての OSPFIGP 指定ルーター
224.0.0.9 すべての RIP2 (経路制御プロトコル Routing Information Protocol) 対応ルーター
224.0.0.10 すべての IGRP (経路制御プロトコル Interior Gateway Routing Protocol) 対応ルーター
224.0.0.13 すべての PIM (Protocol Independent Multicast) 対応ルーター
224.0.1.1 NTP (Network Time Protocol)

224.0.0.0 から 224.0.0.255 までのアドレスはローカルネットワークの制御のために使われ、これらのアドレス宛てのパケットはルーティングされないらしいです。また、239.0.0.0 から 239.255.255.255 は "限定スコープアドレス" として、ローカルネットワークのマルチキャストアドレスとして利用することができるとのことでした。

他、今回の自分の環境で出てきたマルチキャストアドレスは上記を除くと次のような感じでした。

224.0.0.22 SLP (サービスを提供しているサーバーのアドレスを得るためのプロトコル, Service Location Protocol)
224.0.0.251 マルチキャスト DNS (クライアント PC での設定なしに DNS による名前解決を行えるようにする)
224.0.0.252 LLMNR (Link-local Multicast Name Resolution) Windows Vista から搭載された NetBIOS 名の名前解決機能で、5355/UDP を使用します。
239.255.255.255 UPnP でネットワーク上の他の機器を検出する際に使用するようです。1900/UDP を用いて通信します。