Mikrotik arpwatch

Вот чего не хватает в Mikrotik так это аналога arpwatch (http://ee.lbl.gov/). В отличии от Cisco он даже не логирует дублирование адресов. Как вариант - для небольшой сети выход из такой ситуации прописать MAC-адреса статикой и использовать arp=reply-only. Если в силу каких либо причин этот вариант не подходит приходится изобретать велосипед. Я написал скрипт который раз в минуту считывает arp-таблицу Mikrotik и сравнивает с предыдущим показанием.

vi ~/arp.pl
#!/usr/bin/perl
use lib "/Путь к библиотеке Mtik";
use vars qw($error_msg $debug);
use Mtik;
use POSIX qw /strftime/;

$Mtik::debug = 0;
my $mtik_host = 'адрес';
my $mtik_username = 'логин';
my $mtik_password = 'пароль';
#Я использую время по Гринвичу, но иногда требуется и локальное - 10800 смещение относительно gmt.
my $time=time()+10800;
sub mail {
open( MAIL, "|/usr/sbin/sendmail -oi -t" ) or die "can't fork sendmail: $!";
print MAIL <<EOF;
To: support\@домен
Content-type: text/plain; charset=UTF-8
Subject: $subject
$body
EOF
 close MAIL;
}
if (Mtik::login($mtik_host,$mtik_username,$mtik_password)) {
    open(HOSTS, "</Путь к файлу/arp/arp.tbl")||die $!;
    @arp= <HOSTS>;
    close HOSTS;
    my(%arpwatch) = Mtik::get_by_key('/ip/arp/print','mac-address');
    foreach my $mac (keys (%arpwatch)) {
        $ip = $arpwatch{$mac}{'address'};
        if (grep /$ip $mac/, @arp){
        #здесь я хотел что-то сделать и забыл...
            @arpenable = grep /$mac/, @arp;
        }else{
            if (grep /$ip /,@arp){
            foreach $arp (@arp) {
                if ($arp =~ /$ip/){
                    @lasttime = split(/ /,$arp);
                    $arp =~ s/($ip.{18}.{11})/$ip $mac $time/;
                    $oldchangetime = $lasttime [2];
                    $oldmac = $lasttime[1]}
            }
#Если вам необходимо только локальное время соответственно заменяем gmtime на localtime
#и убираем смещение в переменной time
            $time2 =  strftime ("%A, %d %B %Y %H:%M:%S", gmtime $oldchangetime), "\n";
            $time1 =  strftime ("%A, %d %B %Y %H:%M:%S", gmtime $time), "\n";
            $subject = "changed ethernet address $ip \n";
            $body = "New ip address: $ip\n ethernet address: $mac\ntimestamp: $time1\n
                            previous ehternet address: $oldmac\nprevious timestamp: $time2 ";
            mail ();
            }else{
                $subject = "new station $ip\n";
                $body = " New ip address: $ip \n ethernet address: $mac";
                mail ();
                push (@arp, "$arpwatch{$mac}{'address'} $mac $time\n");
           }
        }
    }
    open(HOSTS, ">/путь к файлу/arp/arp.tbl")||die $!;
    foreach $arp (@arp) {
    chomp;
    print HOSTS "$arp";
    }
    close HOSTS;
    Mtik::logout;
}

Для определения производителя сетевого устройства можно использовать Net::MAC::Vendor, но т.к. в используемом мной Debian 5 ("Lenny") эта библиотека отсутствует, я не стал добавлять эту функциональность. Кому надо могут добавить:

#!/usr/bin/perl                                                                                                                            
use Net::MAC::Vendor;                                                                                                                      
        my $mac = "00:0d:93:29:f6:c2";                                                                                                     
        my $array = Net::MAC::Vendor::lookup( $mac ); 
        my $vendor = "@{$array}[0]\n";
        print $vendor;

Последним этапом добавляем в /etc/crontab строку:

vi /etc/crontab

*/1 * * * * root perl /путь к скрипту/arp/arp.pl > /dev/null 2>&1 После чего рестартуем cron:

/etc/init.d/cron restart

Опрашиваем Mikrotik раз в минуту. На данный момент всё. Буду рад любой критике.