4. SNMP трап
Обзор
Получение 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) или SNMPTT.- Получатель разбирает, форматирует и записывает трап в файл.
- Zabbix SNMP траппер читает и анализирует файл с трапами.
- Для каждого трапа Zabbix находит все элементы данных с типом «SNMP трап» и интерфейсом узла сети, совпадающим с полученным из трапа адресом. Обратите внимание, что в процессе поиска соответствия используется только IP или DNS, выбранный у интерфейса узла сети.
- У каждого найденного элемента данных трап сравнивается с регулярным выражением в
snmptrap[регулярное выражение]. Трап записывается в качестве значения для всех совпавших элементов данных. Если совпадений не найдено, но существует элемент данныхsnmptrap.fallback, трап записывается в качестве значения для этого элемента данных. - Если трап не был записан в качестве значения для какого-либо элемента данных, Zabbix по умолчанию журналирует несовпавшие трапы. (Это поведение настраивается в Журналирование не совпадающих SNMP трапов в Администрирование (Administration) → Общие (General) → Другое (Other)).
Замечания о переключении HA
Во время переключения ноды кластера высокой доступности (HA) Zabbix продолжит обработку после последней записи в последней отметки времени ISO 8601; если та же запись не найдена, то для определения последней позиции будет использоваться только отметка времени.
Настройка SNMP трапов
Для этого типа элемента данных требуется следующая настройка в веб-интерфейсе:
Шаг 1: Создание SNMP интерфейса для узла сети
- В Сбор данных → Узлы сети (Data collection → Hosts), создайте узел сети либо отредактируйте существующий.
- В поле Интерфейсы (Interfaces) выберите тип интерфейса SNMP.
- Введите IP адрес/DNS имя и номер порта.
- Выберите из выпадающего списка Версия SNMP (SNMP version): (SNMPv1, SNMPv2 или SNMPv3) и добавьте учётные данные интерфейса в зависимости от выбранной версии SNMP.
Адрес из каждого полученного трапа будет сравниваться с IP и DNS адресами всех SNMP интерфейсов для поиска подходящих узлов сети.
Шаг 2: Настройка элемента данных
- Для узла сети создайте элемент данных или измените существующий.
-
В поле Ключ (Key) используйте один из ключей SNMP трапов:
snmptrap[регулярное_выражение]— Отлов всех SNMP трапов, которые соответствуют регулярному выражению, указанному в параметререгулярное_выражение; еслирегулярное_выражениене указано, принимаются все трапы.
В параметре поддерживаются пользовательские макросы и глобальные регулярные выражения.
Возвращаемое значение: SNMP трап.
Этот элемент данных можно привязать только к SNMP интерфейсам.snmptrap.fallback— Отлов всех SNMP трапов, которые не были перехвачены ни одним из элементов данныхsnmptrap[]для этого интерфейса.
Возвращаемое значение: SNMP трап.
Этот элемент данных можно привязать только к SNMP интерфейсам.
Многострочное совпадение по регулярному выражению в данный момент времени не поддерживается.
- Для обработки штампов времени для параметра Тип информации укажите значение Журнал (лог). Другие форматы, такие как Числовой, также приемлемы, но для этого может потребоваться пользовательский обработчик трапов.
Настройка мониторинга SNMP трапов
Настройка Zabbix server/proxy
Чтобы читать ловушки, необходимо настроить Zabbix server или proxy на запуск процесса SNMP trapper и указать файл ловушек, в который SNMPTT или приемник ловушек Bash/Perl записывает данные.
Для этого отредактируйте файл конфигурации (zabbix\_server.conf или zabbix\_proxy.conf):
StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]
Если используется параметр systemd PrivateTmp, этот файл, скорее всего, не будет работать в /tmp.
Настройка приемника ловушек Bash
Требования: только snmptrapd.
Скрипт приемника ловушек Bash
можно использовать для передачи ловушек в Zabbix server из snmptrapd через файл trapper. Чтобы
настроить его, добавьте параметр traphandle в файл конфигурации snmptrapd (snmptrapd.conf),
см. пример.
Возможно, потребуется перезапустить snmptrapd, чтобы он применил изменения в своей конфигурации.
Настройка Perl-приемника ловушек
Требования: Perl, Net-SNMP, скомпилированный с --enable-embedded-perl (по умолчанию включено начиная с Net-SNMP 5.4)
Perl-приемник ловушек (см. misc/snmptrap/zabbix\_trap\_receiver.pl) можно использовать для передачи ловушек на сервер Zabbix напрямую из snmptrapd.
Чтобы настроить его:
- Добавьте Perl-скрипт в файл конфигурации snmptrapd (
snmptrapd.conf), например:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
- Настройте приемник, например:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';
Возможно, потребуется перезапустить snmptrapd, чтобы он применил изменения в своей конфигурации.
Если имя скрипта не заключено в кавычки, 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
Настройка SNMPTT
Сначала необходимо настроить snmptrapd для использования SNMPTT.
Для наилучшей производительности SNMPTT следует настроить как демон, используя snmptthandler-embedded, чтобы передавать ему ловушки.
См. инструкции по настройке SNMPTT.
Когда SNMPTT настроен на прием ловушек, настройте snmptt.ini:
- Включите использование модуля Perl из пакета
NET-SNMP:
net_snmp_perl_enable = 1
- Записывайте ловушки в файл ловушек, который будет считываться Zabbix:
log_enable = 1
log_file = [TRAP FILE]
- Установите формат даты и времени:
date_time_format = %Y-%m-%dT%H:%M:%S%z
Пакет net-snmp-perl был удален в RHEL 8.0-8.2; снова добавлен в RHEL 8.3.
Дополнительные сведения см. в разделе известные проблемы.
Теперь отформатируйте ловушки так, чтобы Zabbix мог их распознать (отредактируйте snmptt.conf):
- Каждая инструкция
FORMATдолжна начинаться сZBXTRAP [address], где[address]будет сравниваться с IP- и DNS-адресами SNMP-интерфейсов в Zabbix. Например:
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
- Подробнее о формате SNMP-ловушек см. ниже.
Не используйте неизвестные ловушки — Zabbix не сможет их распознать.
Неизвестные ловушки можно обработать, определив общее событие в snmptt.conf:
EVENT general .* "General event" Normal
Формат SNMP трапа
Все заданные получатели трапов Perl и конфигурация SNMPTT трапов должны форматировать трап следующим образом:
[штамп времени] [трап, часть 1] ZBXTRAP [адрес] [трап, часть 2]
где
[штамп времени]— штамп времени в формате%Y-%m-%dT%H:%M:%S%z.ZBXTRAP— заголовок, который указывает, что с этой строки начался новый трап.[адрес]— IP адрес, используемый для поиска узла сети для этого трапа.
Обратите внимание, что 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
Системные требования
Рекомендуется установить файлы MIB, чтобы гарантировать, что значения элементов данных отображаются в правильном формате. Без файлов MIB могут возникнуть проблемы с форматированием, такие как отображение значений в HEX вместо UTF-8 или наоборот.
Поддержка больших файлов
Zabbix поддерживает большие файлы при работе с файлами SNMP трапов. Максимальный размер файла, который Zabbix может прочитать, — это 2\^63 (8 эксабайт). Обратите внимание, что файловая система может иметь меньшее ограничение на максимальный размер файлов.
Ротация журнала
Zabbix не предоставляет какую-либо систему ротации журналов — это должно быть обеспечено пользователем. При ротации журнала старый файл должен быть сначала переименован и только после этого удалён, чтобы никакие трапы не пропали:
- Zabbix открывает файл с трапами с последней известной позиции и переходит к шагу 3.
- Zabbix проверяет, была ли выполнена ротация открытого в данный момент файла, сравнивая номера inode с заданным у файла трапов номером inode. Если открытого файла нет, Zabbix сбрасывает последнюю позицию и переходит к шагу 1.
- Zabbix читает данные из открытого в данный момент файла и устанавливает новую позицию.
- Обрабатываются новые данные. Если этот файл был ротирован, то он закрывается и Zabbix переходит назад к шагу 2.
- Если не было новых данных, Zabbix засыпает на 1 секунду и возвращается к шагу 2.
Файловая система
Из-за такой реализации файла трапов Zabbix'у, чтобы различать файлы, требуется, чтобы файловая система поддерживала inode'ы (эта информация берётся из вызова stat()).
Примеры настройки с использованием разных версий протокола SNMP
В этом примере используются snmptrapd и Bash-скрипт-получатель для передачи trap-сообщений на сервер Zabbix.
Настройка:
- Настройте Zabbix на запуск SNMP trapper и укажите файл trap-сообщений. Добавьте в
zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
- Скачайте Bash-скрипт в
/usr/sbin/zabbix_trap_handler.sh:
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/templates/scripts/snmptraps/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
snmptrapd может потребоваться перезапустить, чтобы он применил изменения в своей конфигурации.
-
Создайте элемент данных SNMP TEST (учтите начальные требования к настройке):
Тип: SNMP trap
Тип информации: Log
Интерфейс узла сети: SNMP 127.0.0.1
Ключ:snmptrap["linkUp"]
Формат времени в журнале:yyyyMMdd.hhmmss
Обратите внимание, что используется формат даты и времени ISO 8601.
- Далее мы настроим
snmptrapdдля выбранной версии протокола SNMP и отправим тестовые trap-сообщения с помощью утилитыsnmptrap.
SNMPv1, SNMPv2
Протоколы SNMPv1 и SNMPv2 используют аутентификацию по "community string". В примере ниже мы будем использовать "secret" в качестве community string. Он должен быть задан тем же значением на отправителях SNMP trap-сообщений.
Обратите внимание, что хотя SNMPv2 по-прежнему широко используется в рабочих средах, он не обеспечивает ни шифрования, ни настоящей аутентификации отправителя. Данные передаются в открытом виде, поэтому эти версии протокола следует использовать только в защищенных средах, например в частной сети, и никогда не использовать в общедоступных сетях или сетях третьих сторон.
SNMP версии 1 сейчас практически не используется, поскольку не поддерживает 64-битные счетчики и считается устаревшим протоколом.
Чтобы разрешить прием trap-сообщений SNMPv1 или SNMPv2, добавьте следующую строку в snmptrapd.conf.
Замените secret на community string SNMP, настроенную на отправителях SNMP trap-сообщений:
authCommunity log,execute,net secret
Далее можно отправить тестовое trap-сообщение с помощью snmptrap. В этом примере мы используем
распространенный OID "link up":
snmptrap -v 2c -c secret localhost '' linkUp.0
SNMPv3
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.
См. также: 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