Вот чего не хватает в Mikrotik так это аналога arpwatch (http://ee.lbl.gov/). В отличии от Cisco он даже не логирует дублирование адресов. Как вариант - для небольшой сети выход из такой ситуации прописать MAC-адреса статикой и использовать arp=reply-only. Если в силу каких либо причин этот вариант не подходит приходится изобретать велосипед. Я написал скрипт который раз в минуту считывает arp-таблицу Mikrotik и сравнивает с предыдущим показанием.
#!/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 строку:
*/1 * * * * root perl /путь к скрипту/arp/arp.pl > /dev/null 2>&1 После чего рестартуем cron:
Опрашиваем Mikrotik раз в минуту. На данный момент всё. Буду рад любой критике.
- Войдите или зарегистрируйтесь, чтобы оставлять комментарии