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 FILE]
- задайте формат даты и времени:
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 [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)
- Подробнее о формате 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
Тип информации: Журнал
Интерфейс узла сети: SNMP 127.0.0.1
Ключ:snmptrap["linkUp"]
Формат времени журнала: yyyyMMdd.hhmmss
Обратите внимание, что используется формат даты и времени ISO 8601.
- Далее мы настроим
snmptrapdдля выбранной версии протокола SNMP и отправим тестовые трапы с помощью утилитыsnmptrap.
SNMPv1, SNMPv2
Протоколы SNMPv1 и SNMPv2 используют аутентификацию по "community string". В примере ниже мы будем использовать "secret" в качестве community string. Оно должно быть установлено в то же значение на отправителях SNMP-трапов.
Обратите внимание, что хотя SNMPv2 по-прежнему широко используется в производственных средах, он не предоставляет ни шифрования, ни реальной аутентификации отправителя. Данные передаются в открытом виде, поэтому эти версии протокола следует использовать только в защищенных средах, таких как частная сеть, и никогда не использовать в любых публичных или сторонних сетях.
SNMP версии 1 в настоящее время практически не используется, поскольку не поддерживает 64-битные счетчики и считается устаревшим протоколом.
Чтобы включить прием трапов SNMPv1 или SNMPv2, добавьте следующую строку в snmptrapd.conf.
Замените "secret" на SNMP community string, настроенную на отправителях 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.
См. также: 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