4 SNMP trap

Обзор

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

В этом случае информация отправляется с устройства с поддержкой SNMP в snmptrapd и собирается или "ловится" сервером Zabbix или прокси 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. SNMP trapper Zabbix читает и разбирает файл с трапами.
  5. Для каждого трапа Zabbix находит все элементы данных SNMP trapper с интерфейсами узлов сети, соответствующими полученному адресу трапа. Обратите внимание, что при сопоставлении используется только выбранный IP или DNS в интерфейсе узла сети.
  6. Для каждого найденного элемента данных трап сравнивается с regexp в snmptrap[regexp]. Трап устанавливается как значение всех совпавших элементов данных. Если совпадающий элемент данных не найден и существует элемент данных snmptrap.fallback, трап устанавливается как его значение.
  7. Если трап не был установлен как значение какого-либо элемента данных, Zabbix по умолчанию записывает в журнал несопоставленный трап. (Это настраивается параметром 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 traps, которые соответствуют регулярному выражению, указанному в параметре regexp; если regexp не задан, перехватывает любой trap.
      В параметре поддерживаются пользовательские макросы и глобальные регулярные выражения.
      Возвращаемое значение: SNMP trap.
      Этот элемент данных можно задать только для SNMP-интерфейсов.
    • snmptrap.fallback - перехватывает все SNMP traps, которые не были перехвачены ни одним из элементов данных 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 можно использовать для передачи ловушек на сервер 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.

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

  1. Включите использование модуля Perl из пакета NET-SNMP:
net_snmp_perl_enable = 1
  1. Записывайте ловушки в файл ловушек, который будет считываться Zabbix:
log_enable = 1
log_file = [TRAP FILE]
  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 [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)
  1. Подробнее о формате SNMP-ловушек см. ниже.

Не используйте неизвестные ловушки - Zabbix не сможет их распознать. Неизвестные ловушки можно обработать, определив общее событие в snmptt.conf:

EVENT general .* "General event" Normal
Формат SNMP trap

Все настроенные получатели trap на Perl и конфигурация 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/trunk/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 (учтите начальные требования к настройке):

    Тип: SNMP trap
    Тип информации: Log
    Интерфейс узла сети: SNMP 127.0.0.1
    Ключ: snmptrap["linkUp"]
    Формат времени в журнале: 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

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