Документация → Snmp модуль
Ставим Net::SNMP
cd /usr/ports/net-mgmt/p5-Net-SNMP && make install clean
Запрашиваем по snmp у свича 10.100.100.14 параметр «описание устройства»:
snmpwalk -v2c -c public 10.100.100.14 1.3.6.1.2.1.1.1.0

Если не получили информацию:

Парамерты Snmp (mib-ы) в некоторой степени стандартизированы, но иногда бывают отличия даже в разных моделях устройств одного производителя. Невозможно дать универсальные команды по включению и настройке snmp в конкретном устройстве - вам необходимо изучить документацию к нему. Отметим только, что это обычно интуитивно понятно и, зачастую, команды для настройки snmp можно узнать путем просмотра текущего конфига устройства.

В админке, в меню «Настройки» → «Группы» создаем группу «Свичи», у которой устанавливаем такие параметры:

В меню «Настройки» → «Доп.поля» проверяем, что инсталятор создал поле:

Здесь же ставим галку напротив группы «Свичи».

В группе «Свичи» создаем учетную запись свича, добавляем ip и параметр «snmp конфиг» устанавливаем в значение «Стандартный свич». После этого пробуем получить данные свича нажав на ссылку «Инфо по snmp». Если не получаем никаких данных, то включаем debug режим на титульной странице, повторяем запрос «Инфо по snmp» и смотрим в debug.

Комментарии к портам можно установить в меню «Порты» на странице данных текущего свича.

Теперь для безопасности на свиче изменим community, например, на название сети CoolNet.

Проверим:
snmpwalk -v2c -c CoolNet 10.100.100.14 1.3.6.1.2.1.1.1.0

Создадим конфигурационный файл для наших snmp-устройств. Конфиг /usr/local/nodeny/cfg/_snmp.cfg.pm содержит стандартные параметры типичных snmp-устройств. Нам нужно добавить в этот конфиг параметры своего оборудования. Если у нас полностью типичное snmp-устройство, то нужно изменить только community.

Как уже неоднократно отмечалось, не следует напрямую менять файлы nodeny, поскольку ваши изменения «затрутся» при обновлении NoDeny+. Поэтому изменения внесем в файл-патч:

команда bash
ee /usr/local/nodeny/modules/MyNetwork/patch.cfg.snmp.cfg.pm 
редактируем patch.cfg.snmp.cfg.pm
#<ACTION> file=>'cfg/snmp.cfg.pm',hook=>'end',after=>'snmp'

%connection = (
    Community => 'CoolNet',
    Version   => 2,
);

$c = Get_config 'Planet';
$c->Set_connection( %connection );

$c = Get_config 'DLink';
$c->Set_connection( %connection );

$c = Get_config 'Switch';
$c->Set_connection( %connection );

В примере мы указали, что Community = 'CoolNet'. Мы получили уже созданные системой конфиги Switch (стандартные свичи), DLink и Planet. Во всех мы изменили параметры соединения Community и версию.

Зафиксируем изменения и проверим, что в конфиге нет ошибок:
sudo perl install.pl -x
perl -c cfg/_snmp.cfg.pm

Проверяем в админке получение данных свича. Пробуем выключить его какой-либо порт. Учтите, что в настройках самого свича, community CoolNet должно иметь права на изменение данных.

Добавим какой-нибудь mib в список отображаемых данных

редактируем patch.cfg.snmp.cfg.pm
$c->Object('sysContact',
    oid  => '1.3.6.1.2.1.1.4.0',
    name => 'Тестовый параметр',
);
$c->Add_show_param('sysContact');

Здесь мы создали новый mib с кодом sysContact = '1.3.6.1.2.1.1.4.0' и с помощью Add_show_param добавили его в список отображаемых параметров.

Изменение отображаемой информации

Допустим, по snmp мы получаем какие-то значения в неудобном для восприятия виде. Например, ifAdminStatus возвращает 1 если порт включен, 2 - если выключен. Давайте заменим 1 на «включен», а 2 на «выключен». Хотя это уже сделано в стандартном конфиге, но мы для примера перезапишем.

редактируем patch.cfg.snmp.cfg.pm
$c->Object('ifAdminStatus',
    oid    => '1.3.6.1.2.1.2.2.1.7.',
    name   => 'Включен?',
    values => {
        1 => 'включен',
        2 => 'выключен',
        3 => 'тестируется',
    },
    css    => {
        2 => 'error',
    },
    set    => {
        1 => 'Включить',
        2 => 'Выключить',
    },
);

Будьте внимательны и не ошибитесь в скобочках и стрелочках, проверьте правильность конфига как было указано выше (perl -c), и не забывайте, что конфиг обновится только после sudo perl install.pl -x.

Обратите внимание, что в mib мы добавили еще 2 параметра: css - будет выводить красным цветом (error) значение 2 (порт отключен), set - позволяет менять параметр из админки. Если параметра set не будет, mib будет доступен только для чтения.

Если же мы хотим произвести более сложные действия с отображаемыми данными, то можем ключ values указать на фрагмент кода:

$c->Object('xxxxxxxx',
    oid    => 'x.x.x.x.x.x.x.x.',
    name   => 'Мак-адрес',
    values => sub {
        my($value) = @_;
        $value =~ s/^0x//;
        return [ url->a($value, a => 'mac_info', mac => $value) ];
    }
);

В данном примере, при выводе информации по портам, в колонке «Мак-адрес» будет выведен мак-адрес без префикса 0x (0x001122334455 преобразуется в 001122334455). При этом он будет оформлен как ссылка на поиск информации о мак-адресе в NoDeny.

В нашей сети есть свич, который имеет нестандартные mib-ы

редактируем patch.cfg.snmp.cfg.pm
$c = New_Config 'DGS1100', 'Switch';
$c->Object('dot1dTpFdbPort')->{oid} = '1.3.6.1.2.1.17.7.1.2.2.1.2.1.';

Здесь мы создали еще один конфиг с именем DGS1100 для свича DGS-1100-06/ME. В нем, мы изменили один mib (dot1dTpFdbPort) - получение номера порта по мак-адресу.

Названия конфигов выбираются исключительно вами, например, можно использовать DLink - вы как бы намекаете, что все ваши DLink-свичи поддерживают параметры этого конфига.

Write-only параметр

редактируем patch.cfg.snmp.cfg.pm
$c->Object('SaveConfig',
    oid  => '1.3.6.1.4.1.171.12.1.2.6.0',
    name => 'Конфиг',
    set    => {
        2 => 'Записать',
    },
);
$c->Add_write_param('SaveConfig');

Пишем конфиг пинговалки PING3 (equicom.dp.ua)

редактируем patch.cfg.snmp.cfg.pm
$c = New_Config 'PING3', 'Switch';
$c->Set_connection( %connection );

$c->Param('Switch', 0);

$c->Object('firmwareVersion',
    oid  => '1.3.6.1.4.1.35160.1.1.0',
    name => 'Серийный номер',
);
$c->Object('uptimeSeconds',
    oid  => '1.3.6.1.4.1.35160.1.2.0',
    name => 'Время работы, сек',
);
$c->Object('deviceName',
    oid  => '1.3.6.1.4.1.35160.1.7.0',
    name => 'Имя',
    set  => 'string',
);
$c->Object('deviceDescription',
    oid  => '1.3.6.1.4.1.35160.1.8.0',
    name => 'Описание',
    set  => 'string',
);

$c->Param('Show', [
  'firmwareVersion', 'uptimeSeconds', 'deviceName', 'deviceDescription',
]);

Здесь мы создали конфиг с именем PING3. Установили параметр Switch в 0, что означает, что устройство не имеет портов и они не будут опрашиваться. Создали mib-ы по документации к устройству и в параметре Show указали в каком порядке они должны отображаться при опросе по snmp. Имя и описание разрешили менять (set => 'string').

Алгоритм создания конфига для неизвестного устройства

проверяем, что устройство выдает правильное количество своих портов:
snmpwalk -v2c -c CoolNet 10.100.100.14 1.3.6.1.2.1.2.1.0

Портов может быть больше реально существующих, например, на один больше (+ loopback). Если выдает неверное значение либо же ошибку - возможно, параметр иной. Попробуем просканировать рядом стоящие параметры, например будем убирать по одному последнему числу в mib пока не получим список параметров:

Например, в одном из свичей автора:
snmpwalk -v2c -c CoolNet 10.100.100.14 1.3.6.1.2

Найдем значения, равные количеству портов устройства и поищем в интернете, возможно, в каких-либо устройствах они используются.

Сбор трафика

NoDeny+ может собирать статистику трафика, проходящую через порты устройств. Обратите внимание, трафик начисляется свичу, а не подключенным к нему клиентам. Данная фича предназначена для того, чтобы вы знали загрузку портов в любой момент времени в прошлом, а также имели возможность видеть визуально на графиках загрузку по портам в разные моменты времени. Если данная возможность вам не нужна - пропускайте этот раздел.

Команда bash
ee /usr/local/nodeny/kernel/collectors.cfg
Добавляем в /usr/local/nodeny/kernel/collectors.cfg
            {
                type      => 'snmp',
                config    => 'Switch',
                addr      => '10.100.100.10',
            },

Обратите внимание, что конфиг Switch должен быть описан в файле /usr/local/nodeny/cfg/_snmp.cfg.pm как мы сделали это выше по тексту.

Также в /usr/local/nodeny/kernel/collectors.cfg временно закомментируйте сбор статистики с других коллекторов, чтобы при тестовом запуске не выводилась лишняя информиация:

Тестируем. Команда bash
perl /usr/local/nodeny/nokernel.pl -m=collectors -C
Сбор трафика. Команда bash
perl /usr/local/nodeny/nokernel.pl -m=collectors -v

Первый срез трафика не попадает в базу данных т.к. он принимается за точку отсчета. Ждите минуту второго среза и если появится трафик в меню «Трафик» → «Свичи» - все ок.

Прием snmp-трапов

Ставим perl модуль Net::SNMPTrap
/usr/ports/net-mgmt/p5-Net-SNMPTrapd && make install clean

Запускаем snmp trap-сервер в verbose-режиме:

Команда bash
perl /usr/local/nodeny/nokernel.pl -m=snmp_trap -v

Вероятно, придется запустить от root, например, под sudo.

Настраиваем какой-нибудь свич на отправку snmp-трапов и провоцируем его на отправку трапа, например, на дисконнект линка. Если сервер принимает трап и видно, что записывает в базу данных - ставим модуль в автозагрузку:

Команда bash
echo '/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=snmp_trap -d &' >> /etc/rc.local