今回は、LAN内で利用されているIPアドレスを調べる方法についてをまとめてみた。
環境によっては使用されているOSが複数ある場合がある(というか、その方が多い)ので、LinuxとWindowsで分けて記載する。
1.Linuxの場合
1-1.ping + arpで調べる
基本的なコマンドしかインストールされていない環境では、やはりpingとarpコマンドを組み合わせた方法が良く利用されるだろう。
以下のようにforコマンドと組み合わせて実行することで、IPアドレスとそれに対応するMACアドレスを取得することが出来る。
for a in `seq 1 254`; do ping -c 1 -w 0.5 対象セグメント(第3オクテットまで).$a > /dev/null && arp -a 対象セグメント(第3オクテットまで).$a | grep ether; done
test@ubuntu-server:~$ for a in `seq 1 254`; do ping -c 1 -w 0.5 192.168.0.$a > /dev/null && arp -a 192.168.0.$a | grep ether; done
? (192.168.0.1) at 1c:bX:7f:X4:2d:3c [ether] on eth0
? (192.168.0.XX) at 00:X5:b7:03:X3:X7 [ether] on eth0
・
・
・
2017/05/31 追記
もしくは、プロセス数は増えてしまうのだが、以下のようにxargsに渡してパラレルで実行させることで、5秒程度でpingの通るホストを確認することが可能だ。
同時実行数が254プロセスと仮定しても、pingで飛ばすパケットのデフォルトの容量が64バイト程度なので、ネットワークへの負荷についてもそれほど気にしなくても良いだろう(それより、瞬間的なプロセス数の方を気にしたほうがいいかも…)。このやり方であれば、TTLの値から大体のOSの種類についても推測ができる。
echo 192.168.0.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl
blacknon@BS-PUB-UBUNTU-01:~$ time (echo 192.168.0.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl)
9 bytes from 192.168.0.1: icmp_seq=1 ttl=64
9 bytes from 192.168.0.12: icmp_seq=1 ttl=64
9 bytes from 192.168.0.14: icmp_seq=1 ttl=64
9 bytes from 192.168.0.20: icmp_seq=1 ttl=64
9 bytes from 192.168.0.42: icmp_seq=1 ttl=255
9 bytes from 192.168.0.43: icmp_seq=1 ttl=64
9 bytes from 192.168.0.53: icmp_seq=1 ttl=64
9 bytes from 192.168.0.102: icmp_seq=1 ttl=64
9 bytes from 192.168.0.104: icmp_seq=1 ttl=64
9 bytes from 192.168.0.106: icmp_seq=1 ttl=64
9 bytes from 192.168.0.107: icmp_seq=1 ttl=64
9 bytes from 192.168.0.117: icmp_seq=1 ttl=64
9 bytes from 192.168.0.118: icmp_seq=1 ttl=64
9 bytes from 192.168.0.120: icmp_seq=1 ttl=64
9 bytes from 192.168.0.119: icmp_seq=1 ttl=64
9 bytes from 192.168.0.121: icmp_seq=1 ttl=64
9 bytes from 192.168.0.133: icmp_seq=1 ttl=64
9 bytes from 192.168.0.132: icmp_seq=1 ttl=64
9 bytes from 192.168.0.134: icmp_seq=1 ttl=64
9 bytes from 192.168.0.169: icmp_seq=1 ttl=64
9 bytes from 192.168.0.170: icmp_seq=1 ttl=128
9 bytes from 192.168.0.171: icmp_seq=1 ttl=128
9 bytes from 192.168.0.176: icmp_seq=1 ttl=64
9 bytes from 192.168.0.187: icmp_seq=1 ttl=64
9 bytes from 192.168.0.194: icmp_seq=1 ttl=64
9 bytes from 192.168.0.195: icmp_seq=1 ttl=64
9 bytes from 192.168.0.196: icmp_seq=1 ttl=64
9 bytes from 192.168.0.197: icmp_seq=1 ttl=64
9 bytes from 192.168.0.198: icmp_seq=1 ttl=64
9 bytes from 192.168.0.199: icmp_seq=1 ttl=64
9 bytes from 192.168.0.201: icmp_seq=1 ttl=64
9 bytes from 192.168.0.204: icmp_seq=1 ttl=64
9 bytes from 192.168.0.203: icmp_seq=1 ttl=64
9 bytes from 192.168.0.205: icmp_seq=1 ttl=64
9 bytes from 192.168.0.230: icmp_seq=1 ttl=64
real 0m1.250s
user 0m0.004s
sys 0m0.064s
1-2.『nmap』コマンドを利用する
もしその環境にnmapコマンドが入っているマシンがあるならば、以下のようにsPオプションを付与してnmapコマンドを実行することで、ローカルのIPアドレス一覧が取得出来る。
※sPオプションはICMPと80番ポートへの疎通確認を行うオプションなのだが、権限が弱いユーザ(一般ユーザ)でコマンドを実行すると80番ポートへのスキャンのみ行われるので注意。
nmap -sP ネットワークアドレス(192.168.0.0/24や192.168.0.*)
test@test-vm-ubuntu:~$ sudo nmap -sP 192.168.0.0/24
Starting Nmap 6.40 ( http://nmap.org ) at 2015-05-17 12:05 JST
Nmap scan report for 192.168.0.1
Host is up (0.00083s latency).
MAC Address: 1C:BX:7X:XX:2D:XC (NEC AccessTechnica)
Nmap scan report for 192.168.0.XXX
Host is up (-0.085s latency).
MAC Address: 0X:1X:XX:DD:X8:XX (Dell ESG Pcba Test)
・
・
・
1-3.『arp-scan』コマンドを利用する
以前こちらで紹介した事があるツール『arp-scan』コマンドを利用することで、ローカルネットワーク内で利用されているIPアドレスの一覧を取得することが出来る。
このコマンドの場合、ただ単純にpingを打ち続けるようなものではなく、tcpdumpを利用して一覧を取得している。
arp-scan -I インターフェイス名 -l
test@test-vm-ubuntu:~$ sudo arp-scan -I eth0 -l
Interface: eth0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.8.1 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.0.1 1c:bX:7f:X4:2d:3c (Unknown)
192.168.0.XXX 0X:1X:XX:DD:X8:XX Dell Inc
192.168.0.XYZ 0X:Xa:6X:XX:0a:XX Data Robotics, Incorporated
・
・
・
1-4.『netdiscover』コマンドを利用する
こちらの記事でも紹介したツール。
コマンドを実行することでネットワーク内を監視し続け、新しいMACアドレスやIPアドレスを検知するとコンソール上に出力されている一覧に追記していく。
netdiscover -r ネットワークアドレス/サブネット
2.Windowsの場合
2-1.ping + arpで調べる
Windowsでローカルネットワーク内を調べる場合でも、pingとarpを組み合わせる方法は有効だ。
以下のようにコマンドを実行することで、指定したネットワーク内のIPアドレスにpingを実行し続け、arpテーブルに記録していく。
for /l %i in (0,1,255) do ping -w 1 -n 1 192.168.0.%i && arp -a 192.168.0.%i
後は、「arp -a」コマンドを実行して現在利用されているIPアドレスを確認するだけだ。
2-2.『SoftPerfect Network Scanner』を利用する
Windowsでping + arpを用いた方法以外でローカルネットワーク内のIPアドレスを調べる場合、GUIで操作出来るソフトが多く出ている。
もしフリーソフトをダウンロード出来る環境なのであれば、その中でも比較的扱い易い『SoftPerfect Network Scanner』を利用して調べると良いだろう。