SNMP-трапы
Получение SNMP-трапов является полной противоположностью запросам к SNMP-устройствам.
В этом случае информация отправляется с SNMP-устройства и собирается или определяется Подсистемой.
Обычно трапы отправляются при наступлении некоторых условий, и Агент подключается на 162-ый порт Сервера (в отличие от 161-ого порта на стороне Агента, который используется для запросов). Использование трапов может помочь обнаружить некоторые кратковременные проблемы, которые происходят между интервалами опроса и могут быть пропущены при запросах данных.
Получение SNMP-трапов в Подсистеме рассчитано на работу с snmptrapd и с одним из встроенных механизмов передачи трапов в Подсистема – либо bash/perl- скрипты, либо SNMPTT.
Самый простой способ настройки мониторинга трапов после настройки Подсистемы – это использовать решение на основе Bash-скрипта, так как Perl и SNMPTT зачастую отсутствуют в современных дистрибутивах и требуют более сложной настройки. Данное решение использует скрипт, который настраивается в виде traphandle. Для повышения производительности в производственных системах используют встроенное решение Perl (либо скрипт с "do perl"-опцией, либо SNMPTT).
Последовательность действий при получении трапа следующая:
- snmptrapd получает трап;
- snmptrapd передает трап скрипту получателю (Bash, Perl) или SNMPTT;
- получатель разбирает, форматирует и записывает трап в файл;
- SNMP-траппер читает и анализирует файл с трапами;
- для каждого трапа Подсистема находит все элементы данных с типом "SNMP трап" и интерфейсом узла сети, совпадающим с полученным адресом из трапа;
Примечание – В процессе поиска соответствия используется только выбранный "IP" или "DNS" у интерфейса узла сети.
- у каждого найденного элемента данных трап сравнивается с регулярным выражением
snmptrap\[регулярное выражение\]. Трап записывается в качестве значения для всех совпавших элементов данных. Если совпадений не найдено, но существует элемент данныхsnmptrap.fallback, то трап записывается в качестве значения для этого элемента данных; - если трап не был записан в качестве значения для какого-либо элемента данных, Подсистема по умолчанию журналирует не совпавшие трапы. Это поведение настраивается в "Журналировать не совпадающие SNMP трапы" в меню "Администрирование → Общие → Прочие".
Настройка SNMP-трапов
Настройка следующих полей в веб-интерфейсе является специфичной для этого типа элементов данных:
- Узел сети должен иметь SNMP-интерфейс. В "Настройка → Узлы сети", в поле "Интерфейсы узла сети" добавляют SNMP-интерфейс с корректными IP- или DNS-адресами. Адрес из каждого полученного трапа сравнивается с IP- и DNS-адресами всех SNMP-интерфейсов для поиска подходящих узлов сети.
- Настройка элемента данных. В поле Ключ используют один из ключей SNMP-трапов (таблица 74).
Многострочное совпадение по регулярному выражению времени не поддерживается.
В поле "Тип информации" указывают значение "Журнал (лог)" для обработки штампов времени. Следует обратить внимание, что другие форматы, такие как "Числовой", также приемлемы, но для этого может потребоваться пользовательский обработчик трапов.
Для того чтобы мониторинг SNMP-трапов работал, он должен быть сначала корректно настроен.
Настройка мониторинга SNMP-трапов
Для чтения трапов Сервер или Прокси должны быть настроены на запуск процесса SNMP-траппера, а также должны знать абсолютный путь к файлу с трапами, который заполняется при помощи SNMPTT или получателя трапов Bash/Perl. Чтобы это сделать, изменяют файл конфигурации (zabbix_server.conf или zabbix_proxy.conf):
StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]
Если используется system-параметр PrivateTmp, то этот файл не заработает в /tmp.
Для настройки получателя трапов Bash используется только snmptrapd. Можно использовать Bash-скрипт получателя трапов для передачи трапов Серверу напрямую с snmptrapd. Чтобы его настроить, добавляют опцию traphandle в файл конфигурации snmptrapd.conf.
Для настройки SNMPTT snmptrapd необходимо настроить на использование SNMPTT.
Для лучшей производительности SNMPTT нужно сконфигурировать как демон, используя snmptthandler-embedded для передачи ему трапов.
После настройки SNMPTT на получение трапов, конфигурируют snmptt.ini:
- включить использование модуля Perl из пакета NET-SNMP:
net_snmp_perl_enable = 1
- включить журналирование трапов в файл с трапами, который Подсистема будет читать:
log_enable = 1
log_file = [TRAP FILE]
- задать формат даты/времени:
date_time_format = %H:%M:%S %Y/%m/%d
Пакет net-snmp-perl удален в RHEL 8.0-8.2; добавлен заново в RHEL 8.3.
Далее задают формат трапов, чтобы они распознавались Подсистемой (редактируют snmptt.conf):
- каждая инструкция FORMAT должна начинаться с "ZBXTRAP адрес", где адрес будет сравниваться с IP- и DNS-адресами у SNMP-интерфейсов в Подсистеме, например:
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
- не используют неизвестные трапы, так как Подсистема может их не распознать. Неизвестные трапы могут быть обработаны, если задать общее событие в snmptt.conf:
EVENT general .* "General event" Normal
Для настройки получателя Perl-трапов используются Perl, Net-SNMP, скомпилированный с "--enable-embedded-perl".
Получатель трапов Perl (в misc/snmptrap/zabbix_trap_receiver.pl) можно использовать для передачи трапов Серверу напрямую с snmptrapd. Для его настройки нужно:
- добавить Perl-скрипт в файл конфигурации snmptrapd (snmptrapd.conf), например:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
- настроить сам получатель, например:
$SNMPTrapperFile = "[TRAP FILE]";
$DateTimeFormat = "[DATE TIME FORMAT]";
Если имя скрипта не заключено в кавычки, snmptrapd не будет запускаться с подобными сообщениями:
Regexp modifiers "/l" and "/a" are mutually exclusive at (eval 2) line 1, at end of line
Regexp modifier "/l" may not appear twice at (eval 2) line 1, at end of line
Все заданные получатели трапов perl и конфигурация SNMPTT-трапов должны форматировать трап следующим образом:
[штамп времени] [трап, часть 1] ZBXTRAP [адрес] [трап, часть 2]
где:
- штамп времени – штамп времени, используемый в элементах данных типа "Журнал (лог)";
- ZBXTRAP – заголовок, который указывает, что с этой строки начался новый трап;
- адрес – IP-адрес, используемый для поиска узла сети для этого трапа.
Следует обратить внимание, что ZBXTRAP и адрес при обработке отрезаются из сообщения. Если трап форматируется как-то иначе, Подсистема может разобрать такие трапы непредсказуемым образом.
Пример трапа:
приведет к следующему виду трапа для SNMP-интерфейса с IP=192.168.1.1:
11:30:15 2011/07/27 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events" localhost – ZBXTRAP 192.168.1.1 Link down on interface 2. Admin state: 1. Operational state: 211:30:15 2011/07/27 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events" localhost – Link down on interface 2. Admin state: 1. Operational state: 2
Требования к системе
В Подсистеме имеется "поддержка больших файлов" при работе с файлами SNMP-трапов. Максимальный размер файла, который Подсистема может прочитать, это 263 (8 эксабайт). Следует обратить внимание, что файловая система может иметь меньшее ограничение на максимальный размер файлов.
Подсистема не предоставляет какой-либо механизм ротации журналов – это должно быть обеспечено пользователем. Ротация журналов должна начинаться с переименования старого файла и только после этого удаления, чтобы никакие трапы не пропали:
- Подсистема открывает файл с трапами с последней известной позиции и переходит к шагу 3;
- Подсистема проверяет, была ли выполнена ротация открытого в данный момент файла, сравнивая номера inode с заданным у файла трапов номером inode; если открытого файла нет, Подсистема сбрасывает последнюю позицию и переходит к шагу 1;
- Подсистема читает данные из открытого в данный момент файла и устанавливает новую позицию;
- обрабатываются новые данные; если этот файл был ротирован, то он закрывается, и Подсистема переходит назад к шагу 2;
- если не было новых данных, Подсистема приостанавливается на 1 секунду и возвращается к шагу 2.
Из-за реализации файла с трапами для Подсистемы требуется файловая система с поддержкой inode для того, чтобы различать файлы (эта информация берется из вызова stat()).
Примеры с использованием разных версий SNMP-протоколов
Этот пример использует snmptrapd и Bash-скрипт получателя для передачи трапов Серверу.
Настройка выполняется с помощью следующих действий:
- настроить Подсистему, чтобы запускался SNMP-траппер, и указать файл с трапами; добавить в
zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/tmp/my_zabbix_traps.tmp
- загрузить Bash-скрипт в /usr/sbin/zabbix_trap_handler.sh:
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/6.0/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh
При необходимости следует подправить в скрипте переменную ZABBIX_TRAPS_FILE. Для использования значения по умолчанию создать сначала родительскую директорию:
mkdir -p /var/lib/zabbix/snmptraps
- добавить в snmtrapd.conf:
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
- создать SNMP-элемент данных
TEST:
SNMP интерфейс узла сети с IP: 127.0.0.1
Ключ: snmptrap["linkup"]
Формат времени в журнале (логе): yyyyMMdd.hhmmss
- настроить
snmptrapdна выбранную версию SNMP-протокола и отправить тестовые трапы, используя утилитуsnmptrap.
Протоколы SNMPv1 и SNMPv2 основываются на аутентификации по community-строке. В примере ниже используется "secret" как community- строка. У отправителей SNMP-трапов необходимо указать такое же значение.
Следует обратить внимание, что хотя SNMPv2 все еще широко используется в производственных средах, он не предлагает какое-либо шифрование и реальной аутентификации отправителя. Так как данные отправляются в виде обычного текста, то эти версии протоколов можно использовать только в безопасных средах, таких как приватные частные сети, и никогда не использовать в какой-либо общедоступной или в сторонних сетях.
SNMPv1 в настоящее время практически не используется, так как не поддерживает 64-битные счетчики, и считается устаревшим протоколом.
Чтобы включить прием SNMPv1- или SNMPv2-трапов, необходимо добавить следующую строку в snmptrapd.conf, заменив "secret" на значение строки SNMP community, указанное в отправителях SNMP-трапов:
authCommunity log,execute,net secret
Далее можно отправить тестовый трап, используя команду snmptrap. В этом примере используется типовой OID "link up":
snmptrap -v 2c -c secret localhost 0 linkUp.0
Протокол SNMPv3 решает проблемы безопасности SNMPv1/v2 и обеспечивает аутентификацию и шифрование. Можно использовать методы аутентификации MD5 или несколько вариантов SHA и шифры DES или несколько вариантов AES. Чтобы включить прием SNMPv3, добавляют следующие строки в snmptrapd.conf:
createUser -e 0x8000000001020304 traptest SHA mypassword AES
authuser log,execute traptest
Следует обратить внимание на ключевое слово "execute", которое позволяет выполнять скрипты для этой модели безопасности пользователя.
snmptrap -v 3 -n "" -a SHA -A mypassword -x AES -X mypassword -l authPriv -u traptest -e 0x8000000001020304 localhost 0 linkUp.0
Примечание – Если требуется использовать надежные методы шифрования, такие как AES192 или AES256, рекомендуется net-snmp, начиная с версии 5.8. Возможно, потребуется пересобрать его с опцией "configure: --enable-blumenthal-aes". Более старые версии net-snmp не поддерживают AES192/AES256.
В обоих примерах в /var/lib/zabbix/snmptraps/snmptraps.log есть похожие строки:
20220805.102235 ZBXTRAP 127.0.0.1
UDP: [127.0.0.1]:35736->[127.0.0.1]:162
DISMAN-EVENT-MIB::sysUpTimeInstance = 0:0:00:00.00
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0
Значение элемента данных в Подсистеме будет таким:
2022-08-05 10:22:352022-08-05 10:22:33
20220805.102233 UDP: [127.0.0.1]:35736->[127.0.0.1]:162
DISMAN-EVENT-MIB::sysUpTimeInstance = 0:0:00:00.00
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0