Snmp

Матеріал з NoDeny
Версія від 07:07, 24 травня 2023, створена Sv (обговорення | внесок) (→‎Ставим Net::SNMP)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Описание

Модуль предназначен для получения информации от оборудования и управления им. Оборудованием могут выступать не только коммутаторы, но и иные устройства, которые поддерживают snmp.

На верхнем уровне устройства разделяем на 2 типа: имеющие порты (интерфейсы) и нет. Если у устройства есть интерфейсы, то есть возможность получить информацию по каждому интерфейсу (включен/нет, скорость, ошибки и т.д.), а также изменить его состояние, например выключить.

Кроме этого, с устройства можно снимать трафик с любого или всех портов. Для этого введена категория «трафик свичей». У устройства можно именовать интерфейсы, например «на сервер» / «в район 1» - трафик назначается конкретному интерфесу.

Доступен поиск мака по свичам: выводит список свичей и номера портов, где обнаружился этот мак

Прием snmp trap-ов

Видео-демонстрация

Ставим Net::SNMP

На FreeBsd:

cd /usr/ports/net-mgmt/p5-Net-SNMP && make install clean

На Linux:

apt install libnet-snmp-perl


Запрашиваем по snmp у 10.100.100.14 параметр «описание устройства»:

snmpwalk -v2c -c public 10.100.100.14 1.3.6.1.2.1.1.1.0


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

  • На 10.100.100.14 не включен snmp версии v2c
  • На 10.100.100.14 не создана snmp community = public
  • На 10.100.100.14 нет параметра 1.3.6.1.2.1.1.1.0

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


Создаем группу для оборудования

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

  • Имя идентификационного поля: Инвентарный номер
  • Имеют поля ФИО, договор, пароль: убираем галку
  • Имеют баланс: убираем галку
  • К учетным записям подключаются услуги: убираем галку
  • К учетным записям подключаются ip, имеют трафик: ставим галку
  • Учетные записи имеют сущность «Порты»: ставим галку
  • В данной группе находятся сотрудники компании: убираем галку


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

  • Имя поля: snmp конфиг
  • Имя поля в бд: _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. В ней создаем документ с именем, например, «Соединения». Обязательно добавляем тег snmp_connection

Содержимое документа:

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

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

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

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

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

В этом примере:

  • В переменную %connection записываем параметры соединения как ключ => значение.
  • $c = Get_config 'Planet'; - в переменную $c мы получили конфиг с именем Planet. Инсталятор автоматически создает 3 конфига: Switch, PLanet и DLink. Вы можете создать и для других устройств, но об этом позже.
  • $c->Set_connection( %connection ); - установили новые параметры соединения (Community = 'CoolNet').


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


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

Допустим мы хотим добавить отображение параметра "контакты" для свичей DLink. В Документах, в папке Snmp создаем документ DLink. Обязательно ставим тег snmp_device. Содержимое документа:

# Получим конфиг DLink 
$c = Get_config 'DLink';

# Добавим новый mib
$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 добавили его в список отображаемых параметров. Вообще, есть 2 блока с отображаемыми данными:

  • Show - список данных, относящихся к устройству
  • Show_ports - список данных, относящихся к конкретным портам устройства.


Add_show_param добавляет mib в список Show. Но вы можете сами его сформировать, например:

$c->Param('Show', [
    'sysName',
    'sysContact',  
]);

В результате при опросе устройства по snmp будет отображено всего 2 параметра, причем в том же порядке, как указано в $c->{cfg}{Show}.

Обратите внимание, что oid в параметрах относящихся к портам устройства, обычно заканчивается на точку - это указывает на то, что результат может быть многострочным. Так что будьте внимательны: не спроста в некоторых параметрах не стоят точки в конце, а в других стоят.

Например, мы хотим для каждого порта вывести количество исходящих ошибок:

$c->Object('ifOutErrors',
    oid => '1.3.6.1.2.1.2.2.1.20.',
    name => 'Ошибки OUT',
);

Таблица с данными портов:

$c->Param('Show_ports', [
    'ifAdminStatus',
    'ifOperStatus',
    'ifSpeed',
    'ifInErrors',
    'ifOutErrors',
]);

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

В админке в папке Snmp создаем документ с именем DGS1100 и обязательно с тегом snmp_device

Содержимое документа:

$c = New_Config 'DGS1100', 'Switch';

$c->Object('dot1dTpFdbPort',
    oid  => '1.3.6.1.2.1.17.4.3.1.1.',
    name => 'Порт по маку',
);

$c->Param('Show_ports', [
    'dot1dTpFdbPort',
    'ifAdminStatus',
    'ifOperStatus',
    'ifSpeed',
    'ifInErrors',
    'ifAlias',
]);
  • Создали конфиг для свичей DGS1100.
  • Добавили mib: dot1dTpFdbPort. По нему можно будет получить информацию какие мак-адреса зарегистрированы на портах свича
  • Show_ports описывает таблицу с информацией о портах, которая выводится в админке при получении данных по snmp. В данном случае в этой таблице будут столбцы (в порядке как прописаны в Show_ports):
    • номер порта
    • dot1dTpFdbPort - список мак адресов (абонентов) на текущем порту
    • ifAdminStatus - заблокирован ли порт
    • ifOperStatus - текущее состояние (подключен или нет)
    • ifSpeed - скорость порта
    • ifInErrors - количество ошибок
    • ifAlias - имя порта


В документе соединений добавляем соединение для данного типа свичей:

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

В учетке свича укажите snmp конфиг DGS1100 (вероятно, вам придется его добавить в выпадающий список)


Изменение данных по snmp

Сделаем чтобы sysContact можно было менять из админки:

$c->Object('sysContact',
    oid  => '1.3.6.1.2.1.1.4.0',
    name => 'Контакты',
    set  => 'string',
);
  • Добавили set => 'string'

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

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

$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 => 'Выключить',
    },
);

Будьте внимательны и не ошибитесь в скобочках и стрелочках.

Обратите внимание, что в 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.

Дополнительно

Нестандартный порт:

$c->Set_connection( %connection, 'Port' => 2000);

Поиск/отображение мак-адресов:

Используется mib dot1dTpFdbPort. В вашем устройстве может не быть данного mib-а, а вместо него, например для D-Link DES-3028, dot1qTpFdbPort (1.3.6.1.2.1.17.7.1.2.2.1.2). В этом случае все равно надо использовать имя dot1dTpFdbPort, но указать 1.3.6.1.2.1.17.7.1.2.2.1.2:

$c->Object('dot1dTpFdbPort',
    oid  => '1.3.6.1.2.1.17.7.1.2.2.1.2.',
    name => 'Порт по маку',
);

Примеры

Получение длины кабеля:

$c->Object('swEtherCableDiagAction' , 
    oid => '1.3.6.1.4.1.171.12.58.1.1.1.12.',
    name => 'Диагностировать',
    values => {
        3 => 'Диагностировать',
    },
    set => {
        1 => 'Выполнить',
    }
);

$c->Object('swEtherCableDiagPair1Length' , 
    oid => '1.3.6.1.4.1.171.12.58.1.1.1.8.',
    name => 'Длина кабеля',
);

$c->Param('Show_ports', [
'dot1dTpFdbPort',
    'ifAdminStatus',
    'ifOperStatus',
    'ifSpeed',
    'ifInErrors',
    'swEtherCableDiagPair1Length',
    'swEtherCableDiagAction',
]);

Здесь swEtherCableDiagAction - это mib, который запускает диагностику на порту, после чего при запросе mib swEtherCableDiagPair1Length будет возвращена длина кабеля.