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).
Последовательность обработки трапа:
snmptrapdполучает трап.snmptrapdпередает трап скрипту-получателю (Bash, Perl) или SNMPTT.- Получатель разбирает, форматирует и записывает трап в файл.
- SNMP trapper Zabbix читает и разбирает файл с трапами.
- Для каждого трапа Zabbix находит все элементы данных SNMP trapper с интерфейсами узлов сети, соответствующими полученному адресу трапа. Обратите внимание, что при сопоставлении используется только выбранный IP или DNS в интерфейсе узла сети.
- Для каждого найденного элемента данных трап сравнивается с regexp в
snmptrap[regexp]. Трап устанавливается как значение всех совпавших элементов данных. Если совпадающий элемент данных не найден и существует элемент данныхsnmptrap.fallback, трап устанавливается как его значение. - Если трап не был установлен как значение какого-либо элемента данных, Zabbix по умолчанию записывает в журнал несопоставленный трап. (Это настраивается параметром Log unmatched SNMP traps в Administration > General > Other.)
Замечания о переключении HA
Во время переключения ноды кластера высокой доступности (HA) Zabbix продолжит обработку после последней записи в последней отметки времени ISO 8601; если та же запись не найдена, то для определения последней позиции будет использоваться только отметка времени.
Настройка SNMP traps
Для этого типа элемента данных требуется следующая настройка веб-интерфейса:
Шаг 1: Создайте SNMP-интерфейс для узла сети
- В Сбор данных > Узлы сети, создайте узел сети или отредактируйте существующий.
- В поле Интерфейсы выберите тип интерфейса SNMP.
- Введите IP-адрес/имя DNS и номер порта.
- Выберите версию SNMP в раскрывающемся списке: (SNMPv1, SNMPv2, или SNMPv3) и добавьте учетные данные интерфейса в зависимости от выбранной версии SNMP.
Адрес каждого полученного trap будет сравниваться с IP-адресами и DNS-адресами всех SNMP-интерфейсов, чтобы найти соответствующие узлы сети.
Шаг 2: Настройте элемент данных
- Для узла сети создайте элемент данных или отредактируйте существующий.
-
В поле Ключ используйте один из ключей SNMP trap:
snmptrap[regexp]- перехватывает все SNMP traps, которые соответствуют регулярному выражению, указанному в параметреregexp; еслиregexpне задан, перехватывает любой trap.
В параметре поддерживаются пользовательские макросы и глобальные регулярные выражения.
Возвращаемое значение: SNMP trap.
Этот элемент данных можно задать только для SNMP-интерфейсов.snmptrap.fallback- перехватывает все SNMP traps, которые не были перехвачены ни одним из элементов данныхsnmptrap[]для этого интерфейса.
Возвращаемое значение: SNMP trap.
Этот элемент данных можно задать только для SNMP-интерфейсов.
В настоящее время сопоставление с многострочными регулярными выражениями не поддерживается.
- Установите для Типа информации значение 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:
- Включите использование модуля 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 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:
- Zabbix открывает trap-файл в последнем известном расположении и переходит к шагу 3.
- Zabbix проверяет, был ли текущий открытый файл ротирован, сравнивая номер inode с номером inode заданного trap-файла. Если открытого файла нет, Zabbix сбрасывает последнее расположение и переходит к шагу 1.
- Zabbix читает данные из текущего открытого файла и задает новое расположение.
- Новые данные анализируются. Если это был ротированный файл, файл закрывается и выполняется возврат к шагу 2.
- Если новых данных нет, Zabbix засыпает на 1 секунду и возвращается к шагу 2.
Файловая система
Из-за реализации trap-файла Zabbix требуется, чтобы файловая система поддерживала inode для различения файлов (информация получается с помощью вызова stat()).
Примеры настройки с использованием разных версий протокола SNMP
В этом примере используются snmptrapd и Bash-скрипт-получатель для передачи trap-сообщений на сервер Zabbix.
Настройка:
- Настройте Zabbix на запуск SNMP trapper и укажите файл trap-сообщений. Добавьте в
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/templates/scripts/snmptraps/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 и отправим тестовые 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