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).

Последовательность действий при получении трапа:

  1. snmptrapd получает трап.
  2. snmptrapd передает трап скрипту-получателю (Bash, Perl) или SNMPTT.
  3. Получатель разбирает, форматирует и записывает трап в файл.
  4. Zabbix SNMP траппер читает и анализирует файл с трапами.
  5. Для каждого трапа Zabbix находит все элементы данных с типом «SNMP трап» и интерфейсом узла сети, совпадающим с полученным из трапа адресом. Обратите внимание, что в процессе поиска соответствия используется только IP или DNS, выбранный у интерфейса узла сети.
  6. У каждого найденного элемента данных трап сравнивается с регулярным выражением в snmptrap[регулярное выражение]. Трап записывается в качестве значения для всех совпавших элементов данных. Если совпадений не найдено, но существует элемент данных snmptrap.fallback, трап записывается в качестве значения для этого элемента данных.
  7. Если трап не был записан в качестве значения для какого-либо элемента данных, Zabbix по умолчанию журналирует несовпавшие трапы. (Это поведение настраивается в Журналирование не совпадающих SNMP трапов в Администрирование (Administration)Общие (General)Другое (Other)).
Замечания о переключении HA

Во время переключения ноды кластера высокой доступности (HA) Zabbix продолжит обработку после последней записи в последней отметки времени ISO 8601; если та же запись не найдена, то для определения последней позиции будет использоваться только отметка времени.

Настройка SNMP трапов

Для этого типа элемента данных требуется следующая настройка в веб-интерфейсе:

Шаг 1: Создание SNMP интерфейса для узла сети
  1. В Сбор данных → Узлы сети (Data collection → Hosts), создайте узел сети либо отредактируйте существующий.
  2. В поле Интерфейсы (Interfaces) выберите тип интерфейса SNMP.
  3. Введите IP адрес/DNS имя и номер порта.
  4. Выберите из выпадающего списка Версия SNMP (SNMP version): (SNMPv1, SNMPv2 или SNMPv3) и добавьте учётные данные интерфейса в зависимости от выбранной версии SNMP.

Адрес из каждого полученного трапа будет сравниваться с IP и DNS адресами всех SNMP интерфейсов для поиска подходящих узлов сети.

Шаг 2: Настройка элемента данных
  1. Для узла сети создайте элемент данных или измените существующий.
  2. В поле Ключ (Key) используйте один из ключей SNMP трапов:

    • snmptrap[регулярное_выражение] — Отлов всех SNMP трапов, которые соответствуют регулярному выражению, указанному в параметре регулярное_выражение; еслирегулярное_выражение не указано, принимаются все трапы.
      В параметре поддерживаются пользовательские макросы и глобальные регулярные выражения.
      Возвращаемое значение: SNMP трап.
      Этот элемент данных можно привязать только к SNMP интерфейсам.
    • snmptrap.fallback — Отлов всех SNMP трапов, которые не были перехвачены ни одним из элементов данных snmptrap[] для этого интерфейса.
      Возвращаемое значение: SNMP трап.
      Этот элемент данных можно привязать только к SNMP интерфейсам.

Многострочное совпадение по регулярному выражению в данный момент времени не поддерживается.

  1. Для обработки штампов времени для параметра Тип информации укажите значение Журнал (лог). Другие форматы, такие как Числовой, также приемлемы, но для этого может потребоваться пользовательский обработчик трапов.

Настройка мониторинга SNMP трапов

Настройка Zabbix сервера/прокси

Для чтения трапов Zabbix сервер или прокси должны быть настроены на запуск процесса SNMP траппера, а также должны знать абсолютный путь к файлу с трапами, который заполняется при помощи SNMPTT или получателя трапов Bash/Perl. Чтобы это сделать, измените файл конфигурации (zabbix_server.conf или zabbix_proxy.conf):

StartSNMPTrapper=1
SNMPTrapperFile=[TRAP ФАЙЛ]

Если используется параметр systemd PrivateTmp [en], этот файл вряд ли заработает в /tmp.

Настройка получателя трапов Bash

Требования: только snmptrapd.

Можно использовать Bash скрипт получателя трапов для передачи трапов Zabbix серверу напрямую с snmptrapd. Чтобы его настроить, добавьте опцию traphandle в файл конфигурации (snmptrapd.conf) snmptrapd, смотрите пример.

:::notetips Может потребоваться перезапустить snmptrapd, чтобы изменения в его конфигурации вступили в силу. :::

Настройка получателя Perl трапов

Требования: Perl, скомпилированный с --enable-embedded-perl Net-SNMP (компилируется по умолчанию, начиная с Net-SNMP 5.4)

Получатель трапов Perl (ищите в misc/snmptrap/zabbix\_trap\_receiver.pl) можно использовать для передачи трапов Zabbix серверу напрямую с snmptrapd. Для его настройки:

  • добавьте Perl скрипт в файл конфигурации snmptrapd (snmptrapd.conf), например:
perl do "[АБСОЛЮТНЫЙ ПУТЬ К PERL СКРИПТУ-ПОЛУЧАТЕЛЮ]";
  • настройте сам получатель, например:
$SNMPTrapperFile = '[TRAP ФАЙЛ]';
$DateTimeFormat = '[ФОРМАТ ДАТЫ/ВРЕМЕНИ]';

Может потребоваться перезапустить 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 [en].

Когда SNMPTT настроен на получение трапов, настройте snmptt.ini:

  1. Включите использование модуля Perl из пакета NET-SNMP:
net_snmp_perl_enable = 1
  1. Включите журналирование трапов в файл с трапами, который будет читаться Zabbix'ом:
log_enable = 1
log_file = [TRAP ФАЙЛ]
  1. Задайте формат даты/времени:
date_time_format = %Y-%m-%dT%H:%M:%S%z

Пакет net-snmp-perl был удалён в RHEL 8.0-8.2; добавлен заново в RHEL 8.3. Для получения более подробной информации смотрите известные проблемы.

Теперь задайте формат трапов, чтобы они распознавались Zabbix'ом (отредактируйте snmptt.conf):

  1. Каждая инструкция FORMAT должна начинаться с ZBXTRAP [адрес], где [адрес] будет сравниваться с 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)
  1. Подробнее о формате 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 trapper. Максимальный размер файла, который Zabbix может прочитать, составляет 2^63 (8 EiB). Обратите внимание, что файловая система может накладывать более низкий предел на размер файла.

Ротация журнала

Zabbix не предоставляет какую-либо систему ротации журналов — это должно быть обеспечено пользователем. При ротации журнала старый файл должен быть сначала переименован и только после этого удалён, чтобы никакие трапы не пропали:

  1. Zabbix открывает файл с трапами с последней известной позиции и переходит к шагу 3.
  2. Zabbix проверяет, была ли выполнена ротация открытого в данный момент файла, сравнивая номера inode с заданным у файла трапов номером inode. Если открытого файла нет, Zabbix сбрасывает последнюю позицию и переходит к шагу 1.
  3. Zabbix читает данные из открытого в данный момент файла и устанавливает новую позицию.
  4. Обрабатываются новые данные. Если этот файл был ротирован, то он закрывается и Zabbix переходит назад к шагу 2.
  5. Если не было новых данных, Zabbix засыпает на 1 секунду и возвращается к шагу 2.
Файловая система

Из-за такой реализации файла трапов Zabbix'у, чтобы различать файлы, требуется, чтобы файловая система поддерживала inode'ы (эта информация берётся из вызова stat()).

Примеры настройки с использованием разных версий протокола SNMP

В этом примере используются snmptrapd и Bash-скрипт обработчика для передачи trap-сообщений на сервер Zabbix.

Настройка:

  1. Настройте Zabbix на запуск SNMP trapper и укажите файл trap-сообщений. Добавьте в zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
  1. Скачайте Bash-скрипт в /usr/sbin/zabbix_trap_handler.sh:
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/7.0/templates/scripts/snmptraps/zabbix_trap_handler.sh

Если необходимо, измените переменную ZABBIX_TRAPS_FILE в скрипте. Чтобы использовать значение по умолчанию, сначала создайте родительский каталог:

mkdir -p /var/lib/zabbix/snmptraps
  1. Добавьте следующее в snmtrapd.conf (см. рабочий пример)
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh

Возможно, потребуется перезапустить snmptrapd, чтобы он применил изменения в своей конфигурации.

  1. Создайте элемент данных SNMP TEST (учтите первоначальные требования к настройке):

    Type: SNMP trap
    Type of information: Log
    Host interface: SNMP 127.0.0.1
    Key: snmptrap["linkUp"]
    Log time format: yyyyMMdd.hhmmss

Обратите внимание, что используется формат даты и времени ISO 8601.

  1. Далее мы настроим 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 в качестве шифра.

Настройте snmptrapd на прием trap-сообщений SNMPv3, добавив следующие строки в snmptrapd.conf:

# Создать пользователя USM SNMPv3 с аутентификацией и конфиденциальностью
createUser -e <engineID> <securityName> SHA <authKey> AES <privKey>
# Разрешить пользователю регистрировать trap-сообщения и выполнять скрипты обработчика trap-сообщений
authUser log,execute <securityName>

Например:

createUser -e 0x8000000001020304 traptest SHA myAuthPassword AES myPrivPassword
authUser log,execute traptest

Обратите внимание на ключевое слово "execute", которое разрешает выполнение скриптов для этой модели безопасности пользователя.

Чтобы проверить настройку trap-сообщений SNMPv3, отправьте тестовое trap-сообщение с помощью следующей команды:

snmptrap -v 3 -n "" -a SHA -A myAuthPassword -x AES -X myPrivPassword -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

Смотрите также