読者です 読者をやめる 読者になる 読者になる

Man On a Mission

システム運用屋が、日々のあれこれを記録していくブログです。情報処理技術者試験の話題多し。高度試験の攻略についても書いてます。

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アドレスは表示されないので、目的によっては適合しません。こんなところに注釈を入れるのもなんですが、一応。