Всем привет! Мы делаем проекты по Zabbix, накопили большую экспертизу и решили сделать переводы нескольких статей, которые нам показались интересными и полезными. Наверняка, будут полезны и вам. Также своим опытом делимся в телеграм-канале zabbix_ru, где вы можете найти полезные материалы и записи наших вебинаров, опубликованных на нашем ютуб-канале (прим. переводчика). Ниже ссылки на предыдущие статьи из цикла.
Миграция с MySQL на PostgreSQL
SELinux: интеграция с Zabbix и другими инструментами
Защита от ложных срабатываний триггеров в Zabbix с использованием функций min/max/avg
Zabbix – автоматизация управления пользователями (JIT)
Двухфакторная аутентификация (2FA) в Zabbix 7.0
В этой статье мы покажем вам, как настроить прием SNMP-трапов в Zabbix в операционной системе RHEL 9, как для SNMPv2, так и для SNMPv3! Этот процесс идентичен как для Zabbix Server, так и для Zabbix Proxy, и в случае использования HA его необходимо повторить на всех узлах кластера.
Установка дополнительных компонентов
Для настройки приёма SNMP-трапов необходимо установить на сервер следующие пакеты:
net-snmp (основной пакет, содержащий все необходимые бинарные файлы и библиотеки)
net-snmp-perl (модуль Perl для SNMP)
net-snmp-utils (инструменты в основном для отладки — опционально)
dnf install net-snmp-utils net-snmp-perl net-snmp
Настройка приема SNMP-трапов на уровне ОС
Сначала загрузите скрипт Perl для получения SNMP-трапов и отправки данных в Zabbix из официального репозитория Zabbix.
curl -o /usr/bin/zabbix_trap_receiver.pl https://git.zabbix.com/projects/ZBX/repos/zabbix/raw/misc/snmptrap/zabbix_trap_receiver.pl
Затем сделайте этот скрипт исполняемым:
chmod +x /usr/bin/zabbix_trap_receiver.pl
Далее необходимо настроить этот скрипт — открыть его:
nano /usr/bin/zabbix_trap_receiver.pl
Здесь задайте переменную $SNMPTrapperFile, которая указывает, где будет храниться файл с принятыми SNMP-трапами.
Задайте путь таким образом, чтобы гарантировать, что данный файл не будет удален, например, при перезапуске сервера.
В нашем случае это будет файл /var/log/snmptrap/snmptrap.log.
### Option: SNMPTrapperFile
# Temporary file used for passing data to the server (or proxy). Must be the same
# as in the server (or proxy) configuration file.
#
# Mandatory: yes
# Default: /tmp/zabbix_traps.tmp
$SNMPTrapperFile = '/var/log/snmptrap/snmptrap.log';
Создайте эту папку, затем:
mkdir /var/log/snmptrap
Настройки SNMP
После настройки скрипта для получения SNMP-трапов и отправки данных в Zabbix, далее необходимо настроить демон snmptrapd.
Откройте файл конфигурации /etc/snmp/snmptrapd.conf:
nano /etc/snmp/snmptrapd.conf
Ниже вы можете увидеть пример конфигурации для SNMPv1, SNMPv2 и SNMPv3, включая упомянутый выше сценарий (вы можете определить более одного сообщества SNMP).
Внимание: строка, содержащая вызов скрипта Perl для SNMP-трапов, должна быть самой последней строкой в этом конфигурационном файле!
Внимание: минимальная длина пароля для SNMPv3 должна быть не менее 8 символов, в нашем примере пароль: %Password123%.
#SNMPv3
createUser -e 0x800000020109840301 monitoring SHA512 zabbix_trap AES256 %Password123%
authUser execute monitoring
#SNMPv1,2
authCommunity execute initmax
#Zabbix SNMP trap receiver
perl do "/usr/bin/zabbix_trap_receiver.pl";
Настройте ротацию лога для файла snmptrap.log
Создайте файл конфигурации logrotate:
nano /etc/logrotate.d/snmptrap
Здесь настройте следующие параметры:
/var/log/snmptrap/snmptrap.log {
weekly
rotate 12
compress
delaycompress
missingok
notifempty
}
Включить порт SNMP в брандмауэре (необязательно)
Используйте следующие команды для добавления порта 162/UDP в качестве исключения брандмауэра:
firewall-cmd --permanent --add-service=snmptrap
firewall-cmd --reload
Применение конфигурации приема SNMP-трапов
Выполните следующие команды, чтобы перезапустить службу snmptrapd и включить ее работу после загрузки системы.
systemctl restart snmptrapd
systemctl enable snmptrapd
Остановите ненужные услуги
Если вы не хотите контролировать сервер с помощью SNMP, вы можете остановить и отключить службу snmpd.
Это не влияет на процесс сбора и отправки настроенных SNMP-трапов в Zabbix.
systemctl disable snmpd --now
Теперь вы успешно завершили настройку сбора трапов SNMP и можете перейти к настройке самого Zabbix.
Конфигурация Zabbix сервера
Сначала включите обработку SNMP-трапов и укажите путь к файлу с собранными трапами.
Откройте файл конфигурации Zabbix сервера /etc/zabbix/zabbix_server.conf:
nano /etc/zabbix/zabbix_server.conf
Отредактируйте здесь следующие параметры конфигурации и сохраните файл.
### Option: SNMPTrapperFile
# Temporary file used for passing data from SNMP trap daemon to the server.
# Must be the same as in zabbix_trap_receiver.pl or SNMPTT configuration file.
#
# Mandatory: no
# Default:
# SNMPTrapperFile=/tmp/zabbix_traps.tmp
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
### Option: StartSNMPTrapper
# If 1, SNMP trapper process is started.
#
# Mandatory: no
# Range: 0-1
# Default:
# StartSNMPTrapper=0
StartSNMPTrapper=1
Чтобы применить измененные параметры конфигурации, перезапустите Zabbix сервер:
systemctl restart zabbix-server
Настройка Zabbix Proxy (необязательно)
Если вы настраиваете Zabbix Proxy, процедура точно такая же.
Единственное отличие состоит в том, что те же самые параметры конфигурации будут изменены в файле конфигурации прокси-сервера Zabbix в /etc/zabbix/zabbix_proxy.conf:
nano /etc/zabbix/zabbix_proxy.conf
Здесь измените параметры конфигурации StartSNMPTrapper и SNMPTrapperFile так же, как и для сервера Zabbix:
### Option: SNMPTrapperFile
# Temporary file used for passing data from SNMP trap daemon to the proxy.
# Must be the same as in zabbix_trap_receiver.pl or SNMPTT configuration file.
#
# Mandatory: no
# Default:
# SNMPTrapperFile=/tmp/zabbix_traps.tmp
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
### Option: StartSNMPTrapper
# If 1, SNMP trapper process is started.
#
# Mandatory: no
# Range: 0-1
# Default:
# StartSNMPTrapper=0
StartSNMPTrapper=1
После этого следует перезапуск службы Zabbix Proxy:
systemctl restart zabbix-proxy
Вы завершили всю настройку сбора SNMP-трапов, осталось только протестировать функционал и применить сбор этих данных в Zabbix.
Тестирование конфигурации с помощью CLI
Отправьте тестовый трап SNMPv2 (имитацию «linkDown») с помощью следующей команды:
snmptrap -v 2c -c initmax localhost '' SNMPv2-MIB::snmpMIB IF-MIB::linkDown s eth0
Проверить, что SNMP-трап был отправлен правильно, можно в созданном файле с SNMP-трапами по следующему пути /var/log/snmptrap/snmptrap.log:
tail -n15 /var/log/snmptrap/snmptrap.log
Чтобы дать представление о том, как выглядит вывод непосредственно в логе, вот пример:
2024-02-10T00:53:43+0100 ZBXTRAP 127.0.0.1
PDU INFO:
notificationtype TRAP
errorstatus 0
transactionid 9
version 1
errorindex 0
community public
requestid 1092987547
receivedfrom UDP: [127.0.0.1]:32856->[127.0.0.1]:162
messageid 0
VARBINDS:
DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (2804608) 7:47:26.08
SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: SNMPv2-MIB::snmpMIB
IF-MIB::linkDown type=4 value=STRING: "eth0"
Отправка SNMPv3-трапа немного сложнее. Тестовая команда, имитирующая «linkDown» сетевого адаптера для SNMPv3, выглядит следующим образом. Не забудьте адаптировать настройки SNMP к конкретному устройству или настройкам локальной инфраструктуры.
snmptrap -v3 -umonitoring -lauthPriv -aSHA512 -Azabbix_trap -xAES256 -X%Password123% -e0x800000020109840301 localhost "" SNMPv2-MIB::snmpMIB IF-MIB::linkDown s eth1
Затем вы сможете найти вывод в файле /var/log/snmptrap/snmptrap.log:
tail -n20 /var/log/snmptrap/snmptrap.log
Пример вывода для SNMP-трапа версии 3 можно увидеть ниже:
2024-02-10T01:11:42+0100 ZBXTRAP 127.0.0.1
PDU INFO:
contextName
errorstatus 0
notificationtype TRAP
securitylevel 3
requestid 1877627576
version 3
securityName monitoring
transactionid 1
securitymodel 3
errorindex 0
messageid 653771479
contextEngineID 0x80001f888081e0634397b4c66500000000
receivedfrom UDP: [127.0.0.1]:53391->[127.0.0.1]:162
securityEngineID 0x800000020109840301
VARBINDS:
DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (2912564) 8:05:25.64
SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: SNMPv2-MIB::snmpMIB
IF-MIB::linkDown type=4 value=STRING: "eth1"
Мы намеренно отправляем тестовые команды на другой сетевой интерфейс для SNMPv2 (eth0) и SNMPv3 (eth1), чтобы их можно было легко отличить друг от друга.
Теперь мы можем перейти к настройке хоста и созданию шаблона для мониторинга с помощью SNMP в Zabbix.
Конфигурация в Zabbix
Сначала необходимо подготовить выбранный хост для мониторинга с использованием SNMP в Zabbix. Это можно сделать, добавив к нему интерфейс SNMP и установив правильный IP-адрес и порт для этого интерфейса. В нашей тестовой конфигурации мы будем использовать localhost и порт по умолчанию 161 для мониторинга. SNMP-community (переменная {$SNMP_COMMUNITY}) необходимо адаптировать для стандартного мониторинга SNMP.
Для SNMP-трапа community проверяется на уровне конфигурационного файла демона snmptrapd в/etc/snmp/snmptrapd.conf. Но не это не отменяет того, что community также необходимо учесть в настройках самого Zabbix. Сделать это можно глобально, в разделе Administration -> Macros, или локально на уровне хоста — во вкладке Macros. Однако вы также можете внести это изменение только на уровне созданного интерфейса SNMP, как показано на рисунке ниже.

Сохраните настройки хоста, и теперь вы готовы начать мониторинг с использованием SNMP.
Если вы хотите опробовать базовые функции SNMP, мы подготовили пример шаблона для Zabbix 6.0 и более поздних версий, который вы можете скачать по ссылке ниже.
Пример шаблона для приема SNMP-трапов для Zabbix 6.0+ можно загрузить здесь: zabbix_snmptrap_example_template.xml.
Создание тестового элемента snmptrap.fallback (необязательно)
Элемент типа fallback в первую очередь используется для захвата всех сообщений SNMP, которые ранее не были захвачены каким-либо другим конкретным элементом в шаблоне.
Поэтому сначала мы создадим элемент такого типа — создадим новый шаблон, добавим в него новый элемент и настроим его как на изображении ниже.

Теперь попробуйте снова запустить уже использованную тестовую команду для SNMPv2, имитирующую linkDown на eth0:
snmptrap -v 2c -c initmax localhost '' SNMPv2-MIB::snmpMIB IF-MIB::linkDown s eth0
В Zabbix в разделе Monitoring -> Latest data проверьте на тестовом хосте, что данные поступили корректно.
Здесь видно, что тестовые данные действительно пришли корректно. Сообщение имеет корректное SNMP-сообщество, исходный сервер действительно localhost, а данные сообщения содержат отправленную строку.

Теперь мы можем перейти к созданию конкретных элементов для отдельных отслеживаемых объектов.
Создание тестового элемента snmptrap (необязательно)
В новом шаблоне создайте новые элементы SNMP-ловушек, которые будут соответствовать тестовым командам из предыдущих шагов.
Для простоты мы будем использовать регулярное выражение в ключе этих элементов, как вы можете увидеть ниже:

Вы можете клонировать второй элемент для тестовой команды на eth1 через SNMPv3 из вновь созданного элемента и изменить имя сетевого интерфейса на eth1 в регулярном выражении.
Сохраните конфигурацию шаблона и снова запустите две тестовые команды.
Для SNMPv2 на eth0:
snmptrap -v 2c -c initmax localhost '' SNMPv2-MIB::snmpMIB IF-MIB::linkDown s eth0
В последних данных вы увидите, что на этот раз тест не обнаружил snmptrap.fallback, а обнаружил правильный элемент для этого интерфейса, который вы создали заранее.

И таким же образом проверим работоспособность второго элемента snmptrap для eth1. Еще раз выполните нашу тестовую команду для SNMPv3 для linkDown на интерфейсе eth1:
snmptrap -v3 -umonitoring -lauthPriv -aSHA512 -Azabbix_trap -xAES256 -X%Heslo123% -e0x800000020109840301 localhost "" SNMPv2-MIB::snmpMIB IF-MIB::linkDown s eth1
А в последних данных проверьте, что сообщение было успешно перехвачено с помощью этого элемента:

На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал zabbix_ru, где будет еще больше полезной информации.
hellp03
Ничего не имею против initMAX, сам разбирался по их материалам с написанием виджетов для Zabbix.
По поводу этой статьи, все понятно, не сильно отличается от оф. документации, но как я считаю, что здесь что в оф доке ни слова о том что масштабировать это решение, то еще приключение. Т.к. для одной железки все просто указал EngineID в snmptrapd.conf createUser -e 0x800000020109840301 и все хорошо.
А если железка не одна а тысяча, а еще они периодически меняются. Тут конечно можно соорудить велосипед с костылями, добавить скрипт который по snmp например собирет со всех железок EngineID и запишет их в snmptrapd.conf все это запихнуть в крон, плюсом периодически перезагружать сервис который принимает трапы. Либо настроить не trap, а inform. Который не требует подтверждения, при этом нужно наоборот прописать EngineID сервера (и проксиков если оборудование мониторится с них) на оборудовании, но это как мне кажется проще автоматизировать и масштабировать.