Jump to content
Калькуляторы

nagios snmp - количество маков Как посчитать количество маков на порту комутатора?

Подскажите пожалуйста есть ли у кого скрипт для nagios для подсчета количества мак адресов по snmp на заданом порту комутатора ну и срабатывание *OK* при наличии > 0 адресов и соответственно *CRITICAL* при = 0 адресов. Заранее благодарю.

Share this post


Link to post
Share on other sites
Подскажите пожалуйста есть ли у кого скрипт для nagios для подсчета количества мак адресов по snmp на заданом порту комутатора ну и срабатывание *OK* при наличии > 0 адресов и соответственно *CRITICAL* при = 0 адресов. Заранее благодарю.

 

Такого нет, но проблемы сделать оный не вижу. А что за коммутаторы то?

 

Хочу заметить что Нагиос не очень удобен для таких целей. Вы хотите видеть постоянно кучу сервисов в дауне, когда абонент отключил комп?

Да и наличие мака на порту не гарантирует работоспособность.

Share this post


Link to post
Share on other sites

Комутаторы в основном EdgeCore ES3528M. Мониторится будут не абонентские порты. Неужели никто не делал такой скрипт?

Share this post


Link to post
Share on other sites

да там 5 строчек на баше, oid нашли?

Share this post


Link to post
Share on other sites

Да вот в том то и дело что нет :( А не стандартных oid для свичей которые показывают маки на портах?

Share this post


Link to post
Share on other sites

Да вот в том то и дело что нет :( А не стандартных oid для свичей которые показывают маки на портах?

Блин, это лень что ли? Ну запросите ОИД у того кто продал свитчи, например у Монблана.

Действительно там же 5 строк.

Share this post


Link to post
Share on other sites

snmpwalk -v 2c -c public $ip .1.3.6.1.2.1.17.7.1.2.2.1.2.666 -Ovq

Маки в влане 666 в dec виде (меньше грузит железку, в отличии от hex). Грепни порт и wc -l. Ну как-то это криво.

 

у меня 1500 железок, и каждые 5 мин скрипт проходит по всем коммутаторам и по snmp собирает mac port в БД. Где эта информация уже анализируется на предмет закольцовок в сети, флуда, построения динамической топологии сети. Обход и анализ занимает около 3-х мин в вечернее время.

 

Можешь переделать этот код для себя

 

 

#!/usr/bin/perl -w

use strict;

my $result;

my $limit;

my @part;

 

$limit = $ARGV[0];

open(SNMP,"snmpwalk -v 2c -c public $ip 1.3.6.1.4.1.6527.3.1.2.1.1.1 -Ov|");

while (<SNMP>) {

@part=split(/ /, $_);

$result=$part[1];

}

if ($result <= $limit)

{

print "SNMP OK - $result\n";

exit 0;

}

else

{

print "SNMP CRITICAL - $result\n";

exit 2;

}

Edited by hub00

Share this post


Link to post
Share on other sites
у меня 1500 железок, и каждые 5 мин скрипт проходит по всем коммутаторам и по snmp собирает mac port в БД. Где эта информация уже анализируется на предмет закольцовок в сети, флуда, построения динамической топологии сети. Обход и анализ занимает около 3-х мин в вечернее время.

 

а каким образом анализируете? Если не секрет конечно

Share this post


Link to post
Share on other sites
у меня 1500 железок, и каждые 5 мин скрипт проходит по всем коммутаторам и по snmp собирает mac port в БД. Где эта информация уже анализируется на предмет закольцовок в сети, флуда, построения динамической топологии сети. Обход и анализ занимает около 3-х мин в вечернее время.

 

а каким образом анализируете? Если не секрет конечно

 

 

Не секрет и абсолютно ничего особенного.

 

Кольца или mac-move определяются путем сравнения пар mac-port только что полученных, с уже имеющимися в базе (полученными раннее). Если видим что mac переехал в другой порт, обновляем в базе новый порт, и к примеру я заношу запись в другую таблицу, мол в это время на этом коммутаторе мак переехал в этот порт с того порта. Как арп-вотч в линухе, только там ip-mac.

 

Флуд (мак-флуд) анализирую БД на количество новых маков за промежуток времени, если больше определенного значения, получаю уведомление.

 

Построение динамической топологии. Выбираю один мак как ориентир (мак шлюза в влане управления этими коммутаторами), опираясь на имеющуюся информацию в БД, определяю на коммутаторах аплинковые порты и потом уже строю цепочки.

 

Все делаю на перле, сбор и обработка данных производится многопоточно. Одновременно обрабатываю по 500 железок 4 ядра ксеона 2.5 Гигагерц 70-100% и 2.5-3Гб ОЗУ.

Edited by hub00

Share this post


Link to post
Share on other sites

Огромное спасибо hub00 за помощь.

Вот сделал свой скрипт на основе скрипта hub00. Пользуйтесь на здоровье :)

Параметры скрипта check_mac HOST PORT MIN_LIMIT

HOST - ип адрес свича

PORT - номер порта

MIN_LIMIT - минимальное значение для статуса OK (если ниже то CRITICAL)

скрипт также проверяет или порт физически активный (ifOperStatus.x) и в случае если не активный то также выдает CRITICAL

Скрипт проверен со свичами EdgeCore, Dlink, Planet, Linksys

#!/usr/bin/perl -w
use strict;
my $result;
my $limit;
my $port;
my $count;
my $portstatus;
my $ip;
my @part;

$ip = $ARGV[0];
$limit = $ARGV[2];
$port = $ARGV[1];
$count=0;
$portstatus=0;
if ($limit eq "" || $port eq "" || $ip eq "")
{
print "SNMP CRITICAL - Usage: check_mac HOST PORT MIN_LIMIT\n";
exit 2;
}

open(SNMPUP,"snmpwalk -v 2c -c public -Ov $ip ifOperStatus.$port |");
while (<SNMPUP>)
{
@part=split(/ /, $_);
$portstatus=$part[1];
chomp $portstatus;
}
close(SNMPUP);
open(SNMP,"snmpwalk -v 2c -c public -Ov $ip .1.3.6.1.2.1.17.7.1.2.2.1.2 |");
while (<SNMP>) {
@part=split(/ /, $_);
$result=$part[1];
if ($result == $port)
{
$count++;
}
}

if ($count >= $limit && $portstatus eq "up(1)")
{
print "SNMP OK - $count\n";
exit 0;
}
else
{
print "SNMP CRITICAL - $count\n";
exit 2;
}

Share this post


Link to post
Share on other sites

Bear_UA

А как должен выглядеть описание плагина и как описать сервис ,чтоб каждый раз айпишник свича не описывать??

'check_snmp' command definition
define command{
       command_name    check_mac
       command_line    /usr/lib/nagios/plugins/check_mac -H $ARG1$  $ARG2$

       }

 

define service{
use generic-service
host_name MAC
service_description Port25_MAC1
check_command check_mac!192.168.128.42 25 1
}

 

так что-то не забирает((

 

И что надо поправить ,дабы при активном порту ,но 0 маков он не critical бывл, а желтый warning ?

Share this post


Link to post
Share on other sites

Скорее всего так

1

command_line /usr/lib/nagios/plugins/check_mac $HOST$ $ARG1$ $ARG2$

2

 

check_command check_mac!25!1

 

И что надо поправить ,дабы при активном порту ,но 0 маков он не critical бывл, а желтый warning ?

 

наверное в конце скрипта сменить exit 2; на exit 1; (1 это варнинг кажется, поискать nagios.pm и посмотреть там или попробовать) и текст в принте строкой выше по вкусу (текст - комментарий)

Share this post


Link to post
Share on other sites

Спасибо всем! поправили немного для себя - чтоб критикал показывал при потушенном порте, а при меньше нормы маков - варнинг,

 

#!/usr/bin/perl -w
use strict;
my $result;
my $limit;
my $port;
my $count;
my $portstatus;
my $ip;
my @part;

$ip = $ARGV[0];
$limit = $ARGV[2];
$port = $ARGV[1];
$count=0;
$portstatus=0;
if ($limit eq "" || $port eq "" || $ip eq "")
{
print "SNMP CRITICAL - Usage: check_mac HOST PORT MIN_LIMIT\n";
exit 2;
}

open(SNMPUP,"snmpwalk -v 2c -c public -Ov $ip ifOperStatus.$port -r 1 -m RFC1213-MIB |");
while (<SNMPUP>)
{
@part=split(/ /, $_);
$portstatus=$part[1];
chomp $portstatus;
}
close(SNMPUP);
open(SNMP,"snmpwalk -v 2c -c public -Ov $ip .1.3.6.1.2.1.17.7.1.2.2.1.2 |");
while (<SNMP>) {
@part=split(/ /, $_);
$result=$part[1];
if ($result == $port)
{
$count++;
}
}

#if ($count >= $limit && $portstatus eq "up(1)")
#{
#print "SNMP OK MACs on port - $count\n";
#exit 0;
#}
#else
#{
#print "SNMP CRITICAL - $count\n";
#exit 2;
#}
if ($portstatus eq "up(1)") {
       if ($count>0) {
               print "SNMP OK MACs on port - $count\n";
               exit 0;
       } else {
               print "SNMP WARNING MACs on port = 0\n";
               exit 1;

       }
} else {
       print "SNMP CRITICAL - link down!\n";
       exit 2;
}



В /etc/nagios-plugins/config

 

'check_mac' command definition
define command{
       command_name    check_mac
       command_line    /usr/lib/nagios/plugins/check_mac $HOSTADDRESS$ $ARG1$  $ARG2$

       }

В сервисах хоста описываем

 

define service{
use generic-service
host_name 
service_description Port25
check_command check_mac!25!1
}

где 25 - номер порта 1 - минимальное кол-во маков для status ok

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this