Загрузка arp-таблицы по snmp со свитча (а не с роутера!).

Форум для размещения материалов по реализации различных схем использования ПО, решению частых проблем и предупреждению частых ошибок
Закрыто
akh
Сообщения: 212
Зарегистрирован: Чт июн 30, 2005 07:18

Загрузка arp-таблицы по snmp со свитча (а не с роутера!).

Сообщение akh »

Спасибо Нетапу за удобный функционал по импорту в биллинг связок ip<->mac из arp-таблицы биллинговой машины! В том виде, в котором эта функция приведена в доке она не очень удобна поскольку приходится открывать на файерволле как минимум icmp для незарегистрированных в АСР абонентов. Последнее не очень хорошо.

Предлагаю для решения задачи модифицированный utm5_arp.pl, с помощью которого можно считывать arp-таблицу с управляемого свитча по SNMP. Используется IP-MIB::ipNetToMediaTable (http://www.ietf.org/rfc/rfc1213.txt). Скрипт тестировался на DES-3326SR.

Код: Выделить всё

#!/usr/bin/perl
# e-mail&#58;info@netup.ru
# Copyright &#40;c&#41; 2001-2005 NetUP Inc. <info@netup.ru>. All rights reserved.
# Modifyed by Serge A. Akhmanov <serge@s2s.msu.ru>, 2007
# Tested on DES-3326SR

use Socket;
use DBD&#58;&#58;mysql;
use DBI&#40;&#41;;
use Time&#58;&#58;Local;
use Getopt&#58;&#58;Std;

$switch_ip = "192.168.0.2";
$mibvar = "1.3.6.1.2.1.4.22";
$snmp_comunity = "public";
$arp_command = "/usr/bin/snmptable -v2c -c $snmp_comunity $switch_ip $mibvar | grep dynamic";

#Load settings from config
open &#40;CONFIG, "/netup/utm5/utm5.cfg"&#41;;
@config = <CONFIG>;
close &#40;CONFIG&#41;;
foreach $line &#40;@config&#41; &#123;
  if &#40;$line =~ m/^&#40;&#91;^#&#93;.+?&#41;=&#40;.*&#41;$/&#41; &#123;
    $$1 = $2;
  &#125;;
&#125;;

# Connect to the database
if &#40;$database_type eq "mysql"&#41; &#123;
  $DBI_data="DBI&#58;$database_type&#58;database=$database;host=$database_host;mysql_socket=$database_sock_path;";
&#125; elsif &#40;$database_type eq "postgres"&#41; &#123;
  $DBI_data="DBI&#58;$database_type&#58;dbname=$database";
&#125; else &#123;
  print "Unknown database $database_type! Stopped. \n";
  exit &#40;1&#41;;
&#125;;
$dbh = DBI->connect&#40;"$DBI_data","$database_login","$database_password",&#123;'RaiseError' => 1&#125;&#41;;

open&#40;MAC,"$arp_command|"&#41;;
@mac = <MAC>;
close &#40;MAC&#41;;
foreach &#40;@mac&#41;&#123;
        if &#40;$_ =~ m/&#91;^0-f&#93;*&#40;.&#123;1,2&#125;&#40;&#58;|-&#41;.&#123;1,2&#125;&#40;&#58;|-&#41;.&#123;1,2&#125;&#40;&#58;|-&#41;.&#123;1,2&#125;&#40;&#58;|-&#41;.&#123;1,2&#125;&#40;&#58;|-&#41;.&#123;1,2&#125;&#41;&#91;^0-9&#93;+&#40;&#91;0-9&#93;+\.&#91;0-9&#93;+\.&#91;0-9&#93;+\.&#91;0-9&#93;+&#41;.+/&#41;&#123;
                $bin_ip = unpack&#40;"N",inet_aton&#40;$7&#41;&#41;;
                $bin_ip =  $bin_ip > 2147483647 ? &#40;$bin_ip - 0xFFFFFFFF - 1&#41;&#58;$bin_ip;

                # insert obtained ip-mac into DB. Don't insert duplicates
                my $duplicated = 0;
                $q = "SELECT ip FROM temp_ip WHERE ip=$bin_ip LIMIT 1";
                $sth = $dbh->prepare&#40; $q &#41;;
                $sth->execute&#40;&#41;;
                while&#40; $zzz = $sth->fetchrow_hashref &#41;
                &#123;
                        $duplicated = 1;
                &#125;;
                if &#40;!$duplicated&#41;&#123;
                        $dbh->do&#40;"INSERT INTO temp_ip &#40;ip, mac&#41; VALUES &#40;$bin_ip, '$1'&#41;"&#41;;
                        printf &#40;"Inserted ip/mac $7/$1 to database \n"&#41;;
                &#125;;
        &#125;;
&#125;;
Перед использованием рекомендую выполнить вручную команды

Код: Выделить всё

snmpwalk -v2c -c public 192.168.0.2 1.3.6.1.2.1.4.22
snmptable -v2c -c public 192.168.0.2 1.3.6.1.2.1.4.22 

Закрыто