4 SNMP trap

Обзор

Получение SNMP traps — это обратный процесс по сравнению с опросом устройств с поддержкой SNMP.

В этом случае информация отправляется с устройства с поддержкой SNMP в snmptrapd и собирается, или "ловится", сервером Zabbix или прокси Zabbix из файла.

Обычно traps отправляются при изменении некоторого условия, и агент подключается к серверу на порт 162 (в отличие от порта 161 на стороне агента, который используется для запросов). Использование traps может помочь обнаружить некоторые кратковременные проблемы, возникающие в промежутке между опросами, которые могут быть пропущены при получении данных по запросу.

Получение SNMP traps в Zabbix предназначено для работы с snmptrapd и одним из механизмов передачи traps в Zabbix — либо Bash-скриптом, либо Perl-скриптом, либо SNMPTT.

Самый простой способ настроить мониторинг traps после конфигурирования Zabbix — использовать решение на Bash-скрипте, поскольку Perl и SNMPTT часто отсутствуют в современных дистрибутивах и требуют более сложной настройки. Однако это решение использует скрипт, настроенный как traphandle. Для лучшей производительности в рабочих системах используйте встроенное решение на Perl (либо скрипт с опцией do perl, либо SNMPTT).

Последовательность обработки trap:

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

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

Настройка SNMP traps

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

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

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

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

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

В настоящее время сопоставление с регулярным выражением в нескольких строках не поддерживается.

  1. Установите для Типа информации значение Log, чтобы временные метки были разобраны. Другие форматы, такие как Numeric, также допустимы, но могут потребовать пользовательский обработчик trap.

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

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

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

StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]

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

Настройка приемника ловушек Bash

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

Скрипт приемника ловушек Bash script можно использовать для передачи ловушек на сервер Zabbix из 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 [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 trap

Все настроенные получатели trap Perl и конфигурация trap SNMPTT должны форматировать trap следующим образом:

[timestamp] [the trap, part 1] ZBXTRAP [address] [the trap, part 2]

где

  • [timestamp] - метка времени в формате %Y-%m-%dT%H:%M:%S%z.
  • ZBXTRAP - заголовок, который указывает, что в этой строке начинается новый trap.
  • [address] - IP-адрес, используемый для поиска узла сети для этого trap.

Обратите внимание, что ZBXTRAP и [address] будут удалены из сообщения во время обработки. Если trap отформатирован иначе, Zabbix может неожиданно разобрать trap.

Пример trap:

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

Это приведет к следующему trap для интерфейса 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 не предоставляет систему ротации журнала - это должно выполняться пользователем. При ротации журнала сначала следует переименовать старый файл и только потом удалять его, чтобы не потерять ни одного trap:

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

Из-за реализации trap-файла 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.4/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 в качестве шифра.

Чтобы включить прием 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

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