Snmp: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
(Новая страница: «==Ставим Net::SNMP== <source lang="bash"> cd /usr/ports/net-mgmt/p5-Net-SNMP && make install clean </source> Запрашиваем по snmp у свич…»)
 
 
(Не показані 53 проміжні версії цього користувача)
Рядок 1: Рядок 1:
==Описание==
Модуль предназначен для получения информации от оборудования и управления им. Оборудованием могут выступать не только коммутаторы, но и иные устройства, которые поддерживают snmp.
На верхнем уровне устройства разделяем на 2 типа: имеющие порты (интерфейсы) и нет. Если у устройства есть интерфейсы, то есть возможность получить информацию по каждому интерфейсу (включен/нет, скорость, ошибки и т.д.), а также изменить его состояние, например выключить.
Кроме этого, с устройства можно снимать трафик с любого или всех портов. Для этого введена категория «трафик свичей». У устройства можно именовать интерфейсы, например «на сервер» / «в район 1» - трафик назначается конкретному интерфесу.
Доступен поиск мака по свичам: выводит список свичей и номера портов, где обнаружился этот мак
Прием snmp trap-ов
[https://www.youtube.com/watch?v=16aVPdVfmGI Видео-демонстрация]
==Ставим Net::SNMP==
==Ставим Net::SNMP==


На FreeBsd:
<source lang="bash">
<source lang="bash">
cd /usr/ports/net-mgmt/p5-Net-SNMP && make install clean
cd /usr/ports/net-mgmt/p5-Net-SNMP && make install clean
</source>
</source>


Запрашиваем по snmp у свича 10.100.100.14 параметр «описание устройства»:
На Linux:
<source lang="bash">
apt install libnet-snmp-perl
</source>
 
<br>
 
Запрашиваем по snmp у 10.100.100.14 параметр «описание устройства»:


<source lang="bash">
<source lang="bash">
Рядок 11: Рядок 33:
</source>
</source>


Если не получили информацию:
<br>
 
Если не получили информацию, возможно:
 
* На 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


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


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


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


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


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


* Имя поля: snmp конфиг
* Имя поля: snmp конфиг
Рядок 34: Рядок 65:
* Тип объекта: snmp
* Тип объекта: snmp
Здесь же ставим галку напротив группы «Свичи».
Здесь же ставим галку напротив группы «Свичи».
<br>


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


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


Проверим:
Теперь для безопасности на свиче изменим community, например, на название сети CoolNet. Проверим:
<source lang="bash">
snmpwalk -v2c -c CoolNet 10.100.100.14 1.3.6.1.2.1.1.1.0
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.
</source>
 
<br>


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


команда 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'


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


Рядок 65: Рядок 101:
$c = Get_config 'Switch';
$c = Get_config 'Switch';
$c->Set_connection( %connection );
$c->Set_connection( %connection );
В примере мы указали, что Community = 'CoolNet'. Мы получили уже созданные системой конфиги Switch (стандартные свичи), DLink и Planet. Во всех мы изменили параметры соединения Community и версию.
</pre>
 
Это код на языке perl. К сожалению, в snmp бывают нестандартные моменты, для обработки которых приходится писать дополнительный код прямо в конфиге. Например, бывают ситуации, когда номер порта не соответсвует реальному и нужно к нему добавить или отнять определенное значение. Поэтому пришлось оформить конфиг в виде perl-кода. Он не сложный и вы сможете по аналогии написать свой на основе примеров, приведенных ниже.
 
В этом примере:
* В переменную %connection записываем параметры соединения как ключ => значение.
* $c = Get_config 'Planet'; - в переменную $c мы получили конфиг с именем Planet. Инсталятор автоматически создает 3 конфига: Switch, PLanet и DLink. Вы можете создать и для других устройств, но об этом позже.
* $c->Set_connection( %connection ); - установили новые параметры соединения (Community = 'CoolNet').
 
<br>
Проверяем в админке получение данных свича по snmp. Пробуем выключить его какой-либо порт. Учтите, что в настройках самого свича community CoolNet должно иметь права на изменение данных.


Зафиксируем изменения и проверим, что в конфиге нет ошибок:
<br>
sudo perl install.pl -x
perl -c cfg/_snmp.cfg.pm
Проверяем в админке получение данных свича. Пробуем выключить его какой-либо порт. Учтите, что в настройках самого свича, community CoolNet должно иметь права на изменение данных.


Добавим какой-нибудь mib в список отображаемых данных
==Добавим какой-нибудь mib в список отображаемых данных==
редактируем patch.cfg.snmp.cfg.pm
 
Допустим мы хотим добавить отображение параметра "контакты" для свичей DLink. В Документах, в папке Snmp создаем документ DLink. Обязательно ставим тег snmp_device. Содержимое документа:
 
<pre>
# Получим конфиг DLink
$c = Get_config 'DLink';
 
# Добавим новый mib
$c->Object('sysContact',
$c->Object('sysContact',
     oid  => '1.3.6.1.2.1.1.4.0',
     oid  => '1.3.6.1.2.1.1.4.0',
     name => 'Тестовый параметр',
     name => 'Контакты',
);
);
# В список отображаемых параметров
$c->Add_show_param('sysContact');
$c->Add_show_param('sysContact');
Здесь мы создали новый mib с кодом sysContact = '1.3.6.1.2.1.1.4.0' и с помощью Add_show_param добавили его в список отображаемых параметров.
</pre>
 
Здесь мы создали новый mib с кодом sysContact = '1.3.6.1.2.1.1.4.0' и с помощью Add_show_param добавили его в список отображаемых параметров. Вообще, есть 2 блока с отображаемыми данными:
 
* Show - список данных, относящихся к устройству
* Show_ports -  список данных, относящихся к конкретным портам устройства.
 
<br>
 
Add_show_param добавляет mib в список Show. Но вы можете сами его сформировать, например:
 
<pre>
$c->Param('Show', [
    'sysName',
    'sysContact', 
]);
</pre>


Изменение отображаемой информации
В результате при опросе устройства по snmp будет отображено всего 2 параметра, причем в том же порядке, как указано в $c->{cfg}{Show}.
Допустим, по snmp мы получаем какие-то значения в неудобном для восприятия виде. Например, ifAdminStatus возвращает 1 если порт включен, 2 - если выключен. Давайте заменим 1 на «включен», а 2 на «выключен». Хотя это уже сделано в стандартном конфиге, но мы для примера перезапишем.


редактируем patch.cfg.snmp.cfg.pm
Обратите внимание, что oid в параметрах относящихся к портам устройства, обычно заканчивается на точку - это указывает на то, что результат может быть многострочным. Так что будьте внимательны: не спроста в некоторых параметрах не стоят точки в конце, а в других стоят.  
 
Например, мы хотим для каждого порта вывести количество исходящих ошибок:
 
<pre>
$c->Object('ifOutErrors',
    oid => '1.3.6.1.2.1.2.2.1.20.',
    name => 'Ошибки OUT',
);
</pre>
 
Таблица с данными портов:
 
<pre>
$c->Param('Show_ports', [
    'ifAdminStatus',
    'ifOperStatus',
    'ifSpeed',
    'ifInErrors',
    'ifOutErrors',
]);
</pre>
 
==Создаем конфиг нестандартного устройства==
 
В админке в папке Snmp создаем документ с именем DGS1100 и обязательно с тегом snmp_device
 
Содержимое документа:
 
<pre>
$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',
]);
</pre>
 
* Создали конфиг для свичей DGS1100.
* Добавили mib: dot1dTpFdbPort. По нему можно будет получить информацию какие мак-адреса зарегистрированы на портах свича
* Show_ports описывает таблицу с информацией о портах, которая выводится в админке при получении данных по snmp. В данном случае в этой таблице будут столбцы (в порядке как прописаны в Show_ports):
** номер порта
** dot1dTpFdbPort - список мак адресов (абонентов) на текущем порту
** ifAdminStatus - заблокирован ли порт
** ifOperStatus - текущее состояние (подключен или нет)
** ifSpeed - скорость порта
** ifInErrors - количество ошибок
** ifAlias - имя порта
 
<br>
 
В документе соединений добавляем соединение для данного типа свичей:
 
<pre>
$c = Get_config 'DGS1100';
$c->Set_connection( %connection );
</pre>
 
В учетке свича укажите snmp конфиг DGS1100 (вероятно, вам придется его добавить в выпадающий список)
<br>
 
<br>
 
==Изменение данных по snmp==
 
Сделаем чтобы sysContact можно было менять из админки:
 
<pre>
$c->Object('sysContact',
    oid  => '1.3.6.1.2.1.1.4.0',
    name => 'Контакты',
    set  => 'string',
);
</pre>
 
* Добавили set  => 'string'
 
==Изменение отображаемой информации==
 
Допустим, по snmp мы получаем какие-то значения в неудобном для восприятия виде. Например, ifAdminStatus возвращает 1 если порт включен, 2 - если выключен. Давайте заменим 1 на «включен», а 2 на «выключен». Хотя это уже сделано в стандартном конфиге, но мы для примера перезапишем:
 
<pre>
$c->Object('ifAdminStatus',
$c->Object('ifAdminStatus',
     oid    => '1.3.6.1.2.1.2.2.1.7.',
     oid    => '1.3.6.1.2.1.2.2.1.7.',
Рядок 101: Рядок 258:
     },
     },
);
);
Будьте внимательны и не ошибитесь в скобочках и стрелочках, проверьте правильность конфига как было указано выше (perl -c), и не забывайте, что конфиг обновится только после sudo perl install.pl -x.
</pre>
 
Будьте внимательны и не ошибитесь в скобочках и стрелочках.


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


<pre>
$c->Object('xxxxxxxx',
$c->Object('xxxxxxxx',
     oid    => 'x.x.x.x.x.x.x.x.',
     oid    => 'x.x.x.x.x.x.x.x.',
Рядок 116: Рядок 276:
     }
     }
);
);
</pre>
В данном примере, при выводе информации по портам, в колонке «Мак-адрес» будет выведен мак-адрес без префикса 0x (0x001122334455 преобразуется в 001122334455). При этом он будет оформлен как ссылка на поиск информации о мак-адресе в NoDeny.
В данном примере, при выводе информации по портам, в колонке «Мак-адрес» будет выведен мак-адрес без префикса 0x (0x001122334455 преобразуется в 001122334455). При этом он будет оформлен как ссылка на поиск информации о мак-адресе в NoDeny.


В нашей сети есть свич, который имеет нестандартные mib-ы
==Дополнительно==
редактируем patch.cfg.snmp.cfg.pm
===Нестандартный порт:===
$c = New_Config 'DGS1100', 'Switch';
<pre>
$c->Object('dot1dTpFdbPort')->{oid} = '1.3.6.1.2.1.17.7.1.2.2.1.2.1.';
$c->Set_connection( %connection, 'Port' => 2000);
Здесь мы создали еще один конфиг с именем DGS1100 для свича DGS-1100-06/ME. В нем, мы изменили один mib (dot1dTpFdbPort) - получение номера порта по мак-адресу.
</pre>
 
===Поиск/отображение мак-адресов:===
Используется 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:


Названия конфигов выбираются исключительно вами, например, можно использовать DLink - вы как бы намекаете, что все ваши DLink-свичи поддерживают параметры этого конфига.
<pre>
$c->Object('dot1dTpFdbPort',
    oid  => '1.3.6.1.2.1.17.7.1.2.2.1.2.',
    name => 'Порт по маку',
);
</pre>


Write-only параметр
==Примеры==
редактируем patch.cfg.snmp.cfg.pm
===Получение длины кабеля:===
$c->Object('SaveConfig',
<pre>
     oid => '1.3.6.1.4.1.171.12.1.2.6.0',
$c->Object('swEtherCableDiagAction' ,  
     name => 'Конфиг',
     oid => '1.3.6.1.4.1.171.12.58.1.1.1.12.',
     set    => {
     name => 'Диагностировать',
         2 => 'Записать',
     values => {
         3 => 'Диагностировать',
     },
     },
    set => {
        1 => 'Выполнить',
    }
);
);
$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',
$c->Object('swEtherCableDiagPair1Length' ,  
     oid => '1.3.6.1.4.1.35160.1.1.0',
     oid => '1.3.6.1.4.1.171.12.58.1.1.1.8.',
    name => 'Серийный номер',
     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', [
$c->Param('Show_ports', [
  'firmwareVersion', 'uptimeSeconds', 'deviceName', 'deviceDescription',
'dot1dTpFdbPort',
    'ifAdminStatus',
    'ifOperStatus',
    'ifSpeed',
    'ifInErrors',
    'swEtherCableDiagPair1Length',
    'swEtherCableDiagAction',
]);
]);
Здесь мы создали конфиг с именем PING3. Установили параметр Switch в 0, что означает, что устройство не имеет портов и они не будут опрашиваться. Создали mib-ы по документации к устройству и в параметре Show указали в каком порядке они должны отображаться при опросе по snmp. Имя и описание разрешили менять (set => 'string').
</pre>
 
Здесь swEtherCableDiagAction - это mib, который запускает диагностику на порту, после чего при запросе mib swEtherCableDiagPair1Length будет возвращена длина кабеля.
Алгоритм создания конфига для неизвестного устройства
проверяем, что устройство выдает правильное количество своих портов:
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

Поточна версія на 07:07, 24 травня 2023

Описание

Модуль предназначен для получения информации от оборудования и управления им. Оборудованием могут выступать не только коммутаторы, но и иные устройства, которые поддерживают 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 будет возвращена длина кабеля.