LAN内の機器を監視する

 LANに接続している機器のMACアドレスを記録するbashスクリプトを書いてみた。動作させている環境はUbuntu Server 12.04 LTS 64bit。

#!/bin/bash
dir="/home/username/MAC"
date=`date '+%Y%m%d'`
logfile=$date.csv
time=`date '+%H:%M'`
nmap -n xxx.xxx.xxx.xxx
IFS=$'\n'
arpout=(`arp -a | grep ":"`)
num=`expr ${#arpout[@]} - 1`
for line in `seq 0 $num`
do
mac=`echo ${arpout[$line]} | cut -d " " -f 4`
ip=`echo ${arpout[$line]} | cut -d " " -f 2 | sed s/"("//g | sed s/")"//g`
echo $time,$mac,$ip >> $dir/$logfile
done

使う場合は最低限、記録したファイルを置くための”dir”のパス、それとipアドレスの範囲を”nmap -n xxx.xxx.xxx.xxx”のとこで設定する。これを実行すると、指定したディレクトリに”20131211.csv”といった感じのファイルができて、

16:35,04:20:9a:xx;xx;xx,10.226.125.25
16:35,00:1f:5b:xx;xx;xx,10.226.125.13
16:35,34:15:9e:xx;xx;xx,10.226.125.5
16:35,00:12:e2:xx;xx;xx,10.226.125.62
16:35,00:90:cc:xx;xx;xx,10.226.125.50

という風に記録される(”xx:xx:xx”の部分は置き換えている)。つまり各行に”時刻,MACアドレス,IPアドレス”という具合だ。ARPテーブルを書き換えるにはBroadcastsにpingを打つ、と解説しているところも多いのだが、それだと記録されない機器が手元にあったのでnmapを使っている。正直、私の環境では動いているものの、全てを理解して書いているわけでは無いので、再利用性が低いかも知れないし、間違っているところがあるかも知れない。特にarp -aの出力からcsvに変換するところなどは完全に出力形式依存で、ただ単にgrepとかcutとかsedを使って整形しているだけである。

 とりあえず1ヶ月程動作させて、記録したcsvからデータを集計してブラウザで見れる仕組みまで作ったのであるが、問題なく動いている。これを使うと、LAN内にどの機器がどれだけの時間接続していたかがわかる。基本的にはネットワークに接続していた時間≒起動していた時間、なので、例えば「あぁ、NASNEは省電力モードONにしてるけど、毎日15時間くらい起動してるな」とか、そういうことが分かる。

 もちろん、侵入された場合にログとして機能することも考えられる。無線LANでのMACアドレス制限は無意味だとよく言われるが、それは制限してても突破できるというだけで、制限されてなければわざわざMACアドレスを調べてから侵入しようとはしない場合もあろうわけで、そうなればUNKNOWNなMACアドレスの機器が接続されたことに気づくことが可能である。

 ちなみに、VPNなどでルータを越えてきた機器については、ルータのMACアドレスが記録されてしまうので、集計しやすくするためにはVPNサーバーの方で割り振るIPアドレスを決めておくとかすると良いかも。

 集計やブラウザでの表示に関する仕組みは、私の気が向くか、あるいはこの投稿に反響があれば記そうと思う。

Post a Comment

Your email is never published nor shared.