Получение SNMP трапов является противоположностью опросу SNMP устройств.
В этом случае информация отправляется с SNMP устройства демону snmptrapd и собирается, или «ловится», Zabbix сервером или прокси из файла.
Обычно трапы отправляются при наступлении некоторых условий, и агент подключается на 162 порт сервера (в отличие от 161 порта на стороне агента, который используется для запросов). Использование трапов может помочь обнаружить некоторые кратковременные проблемы, которые происходят между интервалами опроса и могут быть пропущены при запросах данных.
Получение SNMP трапов в Zabbix рассчитано на работу с snmptrapd и с одним из встроенных механизмов передачи трапов в Zabbix — либо bash/perl скрипты, либо SNMPTT.
Самый простой способ настроить мониторинг трапов после настройки Zabbix — это использовать решение на основе Bash скрипта, так как Perl и SNMPTT зачастую отсутствуют в современных дистрибутивах и требуют более сложной настройки. Однако, это решение использует скрипт, который настраивается в виде traphandle
. Для повышения производительности в промышленных системах используйте встроенное решение Perl (либо скрипт с опцией do perl
, либо SNMPTT).
Последовательность действий при получении трапа:
snmptrapd
получает трапsnmptrapd
передает трап скрипту-получателю (Bash, Perl) или SNMPTTsnmptrap[регулярное выражение]
. Трап записывается в качестве значения для всех совпавших элементов данных. Если совпадений не найдено, но существует элемент данных snmptrap.fallback
, трап записывается в качестве значения для этого элемента данных.Во время переключения ноды кластера высокой доступности (HA) Zabbix продолжит обработку после последней записи в последней отметки времени ISO 8601; если та же запись не найдена, то для определения последней позиции будет использоваться только отметка времени.
Настройка следующих полей в веб-интерфейсе является специфичной для этого типа элементов данных:
В Сбор данных → Узлы сети, в поле Интерфейсы узла сети добавьте SNMP интерфейс с корректным IP или DNS адресом. Адрес из каждого полученного трапа сравнивается с IP и DNS адресами всех SNMP интерфейсов для поиска подходящих узлов сети.
В поле Ключ используйте один из ключей SNMP трапов:
Ключ | ||
---|---|---|
Описание | Возвращаемое значение | Комментарии |
snmptrap[регулярное выражение] | ||
Отлов всех SNMP трапов, которые соответствуют регулярному выражению, указанному в поле регулярное выражение. Если регулярное выражение не указано, принимаются все трапы. | SNMP трап | Этот элемент данных можно привязать только к SNMP интерфейсам. В параметре этого ключа элемента данных поддерживаются пользовательские макросы и глобальные регулярные выражения. |
snmptrap.fallback | ||
Отлов всех SNMP трапов, которые не были перехвачены ни одним из элементов данных snmptrap[] для этого интерфейса. | SNMP трап | Такой элемент данных можно привязать только к SNMP интерфейсам. |
Многострочное совпадение по регулярному выражению в данный момент времени не поддерживается.
Укажите Тип информации значением «Журнал (лог)» для обработки штампов времени. Обратите внимание, что другие форматы, такие как «Числовой», также приемлемы, но для этого может потребоваться пользовательский обработчик трапов.
Для того чтобы мониторинг SNMP трапов работал, он должен быть сначала корректно настроен (смотрите ниже).
Для чтения трапов, Zabbix сервер или прокси должны быть настроены на запуск процесса SNMP траппера, а также должны знать абсолютный путь к файлу с трапами, который заполняется при помощи SNMPTT или получателя трапов Bash/Perl. Чтобы это сделать, измените файл конфигурации (zabbix_server.conf или zabbix_proxy.conf):
Если используется systemd параметр PrivateTmp, этот файл вряд ли заработает в /tmp.
Требования: только snmptrapd.
Можно использовать Bash скрипт получателя трапов для передачи трапов Zabbix серверу напрямую с snmptrapd. Чтобы его настроить, добавьте опцию traphandle
в файл конфигурации (snmptrapd.conf
) snmptrapd, смотрите пример.
snmptrapd может потребоваться перезапустить, чтобы изменения в его конфигурации вступили в силу.
Для начала, snmptrapd необходимо настроить на использование SNMPTT.
Для лучшей производительности, SNMPTT нужно сконфигурировать как демон, используя snmptthandler-embedded для передачи ему трапов. Смотрите инструкции по настройке SNMPTT.
Когда SNMPTT настроен на получение трапов, настройте snmptt.ini
:
Пакет «net-snmp-perl» удалён в RHEL 8.0-8.2; добавлен заново в RHEL 8.3. Для получения более подробной информации смотрите известные проблемы.
Теперь задайте формат трапов, чтобы они распознавались Zabbix'ом (отредактируйте snmptt.conf):
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
Не используйте неизвестные трапы — Zabbix может их не распознать. Неизвестные трапы могут быть обработаны, если задать общее событие в snmptt.conf:
Требования: Perl, скомпилированный с --enable-embedded-perl Net-SNMP (компилируется по умолчанию, начиная с Net-SNMP 5.4)
Получатель трапов Perl (ищите в misc/snmptrap/zabbix_trap_receiver.pl) можно использовать для передачи трапов Zabbix серверу напрямую с snmptrapd. Для его настройки:
snmptrapd может потребоваться перезапустить, чтобы изменения в его конфигурации вступили в силу.
Если имя скрипта не заключено в кавычки, snmptrapd откажется запускаться с сообщениями наподобие этих:
Все заданные получатели трапов Perl и конфигурация SNMPTT трапов должны форматировать трап следующим образом:
где
Обратите внимание, что «ZBXTRAP» и «[адрес]» при обработке отрезаются из сообщения. Если трап форматируется как-то иначе, Zabbix может разобрать такие трапы неожиданным образом.
Пример трапа:
2024-01-11T15:28:47+0200 .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: 2
Это приведёт к следующему виду трапа для SNMP интерфейса с IP=192.168.1.1:
2024-01-11T15:28:47+0200 .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
У Zabbix поддерживает большие файлы при работе с файлами SNMP трапов. Максимальный размер файла, который Zabbix может прочитать, — это 2^63 (8 эксабайт). Обратите внимание, что файловая система может иметь меньшее ограничение на максимальный размер файлов.
Zabbix не предоставляет какую-либо систему ротации журналов — это должно быть обеспечено пользователем. При ротации журнала старый файл должен быть сначала переименован и только после этого удалён, чтобы никакие трапы не пропали:
Из-за реализации файла с трапами, для Zabbix требуется файловая система с поддержкой inode для того чтобы различать файлы (эта информация берётся из вызова stat()).
Этот пример использует snmptrapd и Bash скрипт получателя для передачи трапов Zabbix серверу.
Настройка:
zabbix_server.conf
:/usr/sbin/zabbix_trap_handler.sh
:curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/7.0/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh
При необходимости подправьте в скрипте переменную ZABBIX_TRAPS_FILE. Для использования значения по умолчанию создайте сначала родительскую директорию:
snmtrapd.conf
следующее (смотрите рабочий пример)snmptrapd может потребоваться перезапустить, чтобы изменения в его конфигурации вступили в силу.
Создайте SNMP элемент данных для целей тестирования:
SNMP интерфейс узла сети с IP: 127.0.0.1
Ключ: snmptrap["linkUp"]
Формат времени в журнале (логе): yyyy-MM-ddThh:mm:ss
Обратите внимание, что используется формат даты и времени ISO 8601.
snmptrapd
на выбранную нами версию SNMP протокола и отправим тестовые трапы, используя утилиту snmptrap
.Протоколы SNMPv1 и SNMPv2 полагаются на аутентификацию по «строке community». В примере ниже мы в качестве строки community будем использовать «secret». У отправителей SNMP трапов необходимо указать такое же значение.
Обратите внимание, что хотя SNMPv2 всё еще широко используется в промышленных средах, он не предлагает какое-либо шифрование и реальной аутентификации отправителя. Так как данные отправляются в виде обычного текста, то эти версии протоколов можно использовать только в безопасных средах, таких как приватные частные сети, и никогда не использовать в какой-либо общедоступной или в сторонних сетях.
SNMP версии 1 в настоящее время практически не используется, так как не поддерживает 64-битные счётчики и считается устаревшим протоколом.
Чтобы включить приём SNMPv1 или SNMPv2 трапов, вам необходимо добавить следующую строку в snmptrapd.conf
. Замените «secret» на значение строки SNMP community, указанное в отправителях SNMP трапов:
Далее мы можем отправить тестовый трап, используя команду snmptrap
. В этом примере мы будем использовать типовой OID «link up»:
SNMPv3 решает проблемы безопасности SNMPv1/v2 и обеспечивает аутентификацию и шифрование. Вы можете использовать методы аутентификации MD5 или несколько вариантов SHA и шифры DES или несколько вариантов AES.
Чтобы включить приём SNMPv3, добавьте следующие строки в snmptrapd.conf
:
Пожалуйста, обратите внимание на ключевое слово «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. Смотрите также: http://www.net-snmp.org/wiki/index.php/Strong_Authentication_or_Encryption
В обоих примерах в вашем /var/lib/zabbix/snmptraps/snmptraps.log
вы увидите похожие строки:
2024-01-30T10:04:23+0200 ZBXTRAP 127.0.0.1
UDP: [127.0.0.1]:56585->[127.0.0.1]:162
DISMAN-EVENT-MIB::sysUpTimeInstance = 2538834
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0
Значение элемента данных в Zabbix будет:
2024-01-30 10:04:23 2024-01-30 10:04:21
2024-01-30T10:04:21+0200 UDP: [127.0.0.1]:56585->[127.0.0.1]:162
DISMAN-EVENT-MIB::sysUpTimeInstance = 2538834
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0
Пример с Perl:
2024-01-30T11:42:54+0200 ZBXTRAP 127.0.0.1
PDU INFO:
receivedfrom UDP: [127.0.0.1]:58649->[127.0.0.1]:162
notificationtype TRAP
version 1
community public
errorstatus 0
transactionid 1
requestid 2101882550
messageid 0
errorindex 0
VARBINDS:
DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (457671) 1:16:16.71
SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: IF-MIB::linkUp.0