3. SNMP трапы
Обзор
Получение SNMP-трапов является противоположностью опроса устройств с поддержкой SNMP.
В этом случае информация отправляется с устройства с поддержкой SNMP в snmptrapd и собирается, или «перехватывается», сервером Zabbix или прокси Zabbix из файла.
Обычно трапы отправляются при изменении некоторого условия, и агент подключается к серверу через порт 162 (в отличие от порта 161 на стороне агента, который используется для опросов). Использование трапов позволяет обнаруживать кратковременные проблемы, возникающие в промежутках между опросами и которые могут быть пропущены данными опроса.
Получение SNMP-трапов в Zabbix рассчитано на работу с snmptrapd и одним из механизмов передачи трапов в Zabbix — либо Bash- или Perl-скриптом, либо SNMPTT.
Самый простой способ настроить мониторинг трапов после настройки Zabbix —
использовать решение на основе Bash-скрипта, поскольку Perl и SNMPTT часто
отсутствуют в современных дистрибутивах и требуют более сложной настройки.
Однако это решение использует скрипт, настроенный как traphandle.
Для лучшей производительности в производственных системах используйте решение
на встроенном Perl (либо скрипт с опцией do perl, либо SNMPTT).
Процесс получения трапа:
snmptrapdполучает трапsnmptrapdпередает трап скрипту-приемнику (Bash, Perl) или SNMPTT- Приемник разбирает, форматирует и записывает трап в файл
- SNMP trapper Zabbix читает и разбирает файл трапов
- Для каждого трапа Zabbix находит все элементы данных "SNMP trapper" с интерфейсами узла сети, соответствующими адресу полученного трапа. Обратите внимание, что при сопоставлении используется только выбранное значение "IP" или "DNS" в интерфейсе узла сети.
- Для каждого найденного элемента данных трап сравнивается с регулярным выражением в
snmptrap[regexp]. Трап устанавливается как значение всех совпавших элементов данных. Если совпадающий элемент данных не найден и существует элемент данныхsnmptrap.fallback, трап устанавливается как его значение. - Если трап не был установлен как значение какого-либо элемента данных, Zabbix по умолчанию записывает несовпавший трап в журнал. (Это настраивается параметром "Log unmatched SNMP traps" в Administration > General > Other.)
Замечания о переключении HA
Во время переключения ноды кластера высокой доступности (HA) Zabbix продолжит обработку после последней записи в последней отметки времени ISO 8601; если та же запись не найдена, то для определения последней позиции будет использоваться только отметка времени.
Настройка SNMP-ловушек
Для этого типа элемента данных требуется следующая настройка веб-интерфейса.
1. Создайте SNMP-интерфейс для вашего узла сети
- В разделе Data collection > Hosts создайте/отредактируйте узел сети и в поле Interfaces добавьте интерфейс типа "SNMP", указав IP-адрес или DNS-имя.
Адрес из каждой полученной ловушки будет сравниваться с IP- и DNS-адресами всех SNMP-интерфейсов для поиска соответствующих узлов сети.
2. Настройте элемент данных
- В разделе Data collection > Hosts создайте/отредактируйте необходимый элемент данных.
- В поле Key используйте один из ключей SNMP-ловушек:
| Key | ||
|---|---|---|
| Описание | Возвращаемое значение | Комментарии |
| snmptrap[regexp] | ||
| Перехватывает все SNMP-ловушки, соответствующие регулярному выражению, указанному в regexp. Если regexp не указан, перехватывает любую ловушку. | SNMP-ловушка | Этот элемент данных можно задать только для SNMP-интерфейсов. В параметре этого ключа элемента данных поддерживаются пользовательские макросы и глобальные регулярные выражения. |
| snmptrap.fallback | ||
| Перехватывает все SNMP-ловушки, которые не были перехвачены ни одним из элементов данных snmptrap[] для этого интерфейса. | SNMP-ловушка | Этот элемент данных можно задать только для SNMP-интерфейсов. |
Сопоставление с многострочными регулярными выражениями в настоящее время не поддерживается.
- Установите Type of information в значение "Log", чтобы временные метки разбирались автоматически. Другие форматы, такие как "Numeric", также допустимы, но могут потребовать пользовательского обработчика ловушек.
Настройка мониторинга 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, скомпилированный с --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.
Когда SNMPTT настроен на получение трапов, настройте snmptt.ini:
- включите использование модуля Perl из пакета NET-SNMP:
net_snmp_perl_enable = 1
- включите журналирование трапов в файл с трапами, который будет читаться Zabbix'ом:
log_enable = 1
log_file = [TRAP ФАЙЛ]
- задайте формат даты/времени:
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 [адрес]", где [адрес] будет сравниваться с 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 читает данные из текущего открытого файла и устанавливает новое расположение.
- Новые данные разбираются. Если это был ротированный файл, файл закрывается, и выполняется возврат к шагу 2.
- Если новых данных нет, Zabbix ожидает 1 секунду и возвращается к шагу 2.
Файловая система
Из-за реализации файла с трапами, для Zabbix требуется файловая система с поддержкой inode для того чтобы различать файлы (эта информация берётся из вызова stat()).
Примеры настройки с использованием разных версий протокола SNMP
В этом примере используются snmptrapd и Bash-скрипт-приемник для передачи трапов на сервер Zabbix.
Настройка:
- Настройте Zabbix на запуск SNMP trapper и
укажите файл трапов. Добавьте в
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/Dockerfiles/snmptraps/alpine/conf/usr/sbin/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 и отправим тестовые трапы с помощью утилитыsnmptrap.
SNMPv1, SNMPv2
Протоколы SNMPv1 и SNMPv2 используют аутентификацию по "community string". В примере ниже мы будем использовать "secret" в качестве community string. Оно должно быть установлено в то же значение на отправителях SNMP trap.
Обратите внимание, что хотя SNMPv2 по-прежнему широко используется в производственных средах, он не предоставляет ни шифрования, ни реальной аутентификации отправителя. Данные передаются в открытом виде, поэтому эти версии протокола следует использовать только в защищенных средах, таких как частная сеть, и никогда не использовать в публичных сетях или сетях третьих сторон.
Версия SNMP 1 в наши дни практически не используется, поскольку не поддерживает 64-битные счетчики и считается устаревшим протоколом.
Чтобы включить прием трапов SNMPv1 или SNMPv2, добавьте следующую строку в snmptrapd.conf.
Замените "secret" на SNMP community string, настроенную на отправителях SNMP trap:
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.
См. также: 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