3. 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 трапы» в Администрирование → Общие → Прочие).
Замечания о переключении HA

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

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

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

  • Ваш узел сети должен иметь SNMP интерфейс

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

  • Настройте элемент данных с типом «SNMP trap»

В поле Ключ используйте один из ключей SNMP трапов:

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

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

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

Для того чтобы мониторинг SNMP трапов работал, он должен быть сначала корректно настроен (смотрите ниже).

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

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

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

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

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

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

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

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

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

Настройка SNMPTT

Для начала, snmptrapd необходимо настроить на использование SNMPTT.

Для лучшей производительности, SNMPTT нужно сконфигурировать как демон, используя snmptthandler-embedded для передачи ему трапов. Смотрите инструкции по настройке SNMPTT.

Когда 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
Настройка получателя 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
Формат 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

Требования к системе

Поддержка больших файлов

У Zabbix поддерживает большие файлы при работе с файлами SNMP трапов. Максимальный размер файла, который Zabbix может прочитать, — это 2^63 (8 эксабайт). Обратите внимание, что файловая система может иметь меньшее ограничение на максимальный размер файлов.

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

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 скрипт получателя для передачи трапов Zabbix серверу.

Настройка:

  1. Настройте Zabbix, чтобы запускался SNMP траппер, и укажите файл с трапами. Добавьте в 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/Dockerfiles/snmptraps/alpine/conf/usr/sbin/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 элемент данных для целей тестирования:

    SNMP интерфейс узла сети с IP: 127.0.0.1
    Ключ: snmptrap["linkUp"]
    Формат времени в журнале (логе): yyyy-MM-ddThh:mm:ss

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

  1. Далее мы настроим snmptrapd на выбранную нами версию SNMP протокола и отправим тестовые трапы, используя утилиту snmptrap.
SNMPv1, SNMPv2

Протоколы SNMPv1 и SNMPv2 полагаются на аутентификацию по «строке community». В примере ниже мы в качестве строки community будем использовать «secret». У отправителей SNMP трапов необходимо указать такое же значение.

Обратите внимание, что хотя SNMPv2 всё еще широко используется в промышленных средах, он не предлагает какое-либо шифрование и реальной аутентификации отправителя. Так как данные отправляются в виде обычного текста, то эти версии протоколов можно использовать только в безопасных средах, таких как приватные частные сети, и никогда не использовать в какой-либо общедоступной или в сторонних сетях.

SNMP версии 1 в настоящее время практически не используется, так как не поддерживает 64-битные счётчики и считается устаревшим протоколом.

Чтобы включить приём SNMPv1 или SNMPv2 трапов, вам необходимо добавить следующую строку в snmptrapd.conf. Замените «secret» на значение строки SNMP community, указанное в отправителях SNMP трапов:

authCommunity log,execute,net secret

Далее мы можем отправить тестовый трап, используя команду 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. Смотрите также: 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

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