Linux備忘録 LAN内のMACアドレス取得
たまに、操作中のLinux端末から、同一LAN内ノードのMACアドレスを確認したい時があります。たまに。
知りたいノードのIPアドレスがわかっていれば、何も考えずに
ping 対象ノードのIPアドレス; arp -a 対象ノードのIPアドレス
または、arpingが入っていれば
arping [ -I 使用するインターフェース名 ] 対象ノードのIPアドレス 例: arping -I eth1 192.168.1.1
で、対象ノードのMACアドレスを確認できます。
同一LAN内のMACアドレスをあらいざらい知りたい
しかし、対象ノードのIPアドレスが分からない場合や、MACアドレスの一覧を取得したい場合*1、上記では対応できません。
nmapが入っていれば手っ取り早いのですが、サーバの場合はそういったツールが入っていないことも多いでしょう。
この場合、地味にforでping(又はarping)を回してMACアドレス情報を収集することになります。*2
例えば、サブネットマスクが24ビットの場合は、以下のようにします。
for adr in `seq 1 254` ; do ping -c 1 -w 0.3 IPアドレス第3オクテットまで.$adr > /dev/null && arp -a IPアドレス第3オクテットまで.$adr; done 例: for adr in `seq 1 254` ; do ping -c 1 -w 0.3 172.16.1.$adr > /dev/null && arp -a 172.16.1.$adr; done
ちなみにarpingが入ってる場合は
for adr in `seq 1 254` ; do arping [ -I 使用するインターフェース名 ] -c 1 -w 0.3 IPアドレス第3オクテットまで.$adr | grep reply; done 例: for a in `seq 1 254` ; do arping -I eth1 -c 1 -w 0.3 172.16.1.$a | grep reply; done
なお、上記、`seq 1 254`の部分ですが、こちらは指定した連番を吐き出すseqコマンドをバッククォートで囲んでおります。
シングルクォートではありませんのでご注意を。
ちなみに、結構時間がかかります。IPアドレスの範囲がわかっているなら、seqコマンドの範囲を狭めた方が良いでしょう。
nmapがあれば
ちなみにnmapがある場合は、以下でいけます。簡単。
(ただしroot権限でないと、MACアドレスが見れないかも。)
nmap -sP ネットワークアドレス 例: nmap -sP 192.168.1.0/24
最後に
え?スイッチでmac address table見るからどうでもいい?うるせえ。*3
*1:どんな場合かピンと来ない方も多いかもしれません。例えば、MACアドレスの一覧を作成したかったり、ネットワーク状況が定かでない時の情報収集なんかが該当します。あと、仮想マシンのMACアドレスを手動設定する場合に、重複を避けるため各ノードのMACアドレスを確認するとか。これは同一LAN内に他の仮想化環境があるような、割とニッチなケースですが。
*2:当初、ブロードキャスト宛にpingを飛ばしてarp -aでいけるんじゃないかと考えたのですが、上手くいきませんでした。一部ノードしか、キャッシュできません。ブロードキャストpingに応答を返さないシステムのせいかと思ったのですが、よくよく考えると、別問題のようです。調べてみると、色々ややこしい話だったので当記事では、これ以上触れません。というか、記事にできるほどの確信がない。
*3:この場合、IPアドレスは表示されないので、目的によっては適合しません。こんなところに注釈を入れるのもなんですが、一応。