Заставляем ZABBIX ловить SNMP трапы Печать


Сегодня расскажу о том, как настроить Zabbix для реакции на важные для нас snmp трапы. Если вы не знакомы с протоколом SNMP, с чем его едят можно узнать здесь. Что такое Zabbix можно почитать здесь. Ну а в двух словах, SNMP протокол служит для мониторинга и управления устройствами по сети. А Zabbix — программный комплекс для сетевого мониторинга.
Принцип работы SNMP следующий: в сети имеется устройство/хост (например cisco 2811), параметры которого мы хотим мониторить, и присутствует компьютер/сервер, с которого мы хотим мониторить. Возможны следующие действия: сервер отправляет SNMP запрос на cisco 2811 и получает SNMP ответ с интересующими его параметрами. Или можно настроить cisco 2811 так, что если на ней случается какое-либо событие (например интерфейс перешел shutdown, или кто-то изменил конфиг или ещё что-то (список возможных событий довольно велик)) то хост (cisco 2811) посылает серверу сообщение (SNMP trap) в котором говорится о наступившем событии.

Первый вариант удобен для мониторинга не критичных, постоянно меняющихся параметров, например, загрузка сетевых интерфейсов, температура и т.п. Для этого достаточно периодически, например раз в минуту, запрашивать эти параметры у хоста. А вот запрашивать каждую минуту состояние интерфейса, или BGP сессии, которая пожет упасть раз в месяц — решение не рациональное. В данной ситуации нам помогут SNMP трапы. Будем считать что Zabbix у вас установлен. Итак, приступаем к настройке.

Настройка SNMP на Cisco 2811

На циске выполняем следующее:

snmp-server trap-source Loopback 0

snmp-server enable traps нужный_вам_трап

snmp-server host 10.1.1.10 MyCommunity

где:
Loopback 0 — интерфейс с которого доступен SNMP сервер,
10.1.1.10 ip адрес SNMP сервера,
нужный_вам_трап — например: snmp-server enable traps snmp authentication linkdown linkup,

или просто: snmp-server enable traps — включаются все доступные трапы.
MyCommunity — комьюнити (а-ля пароль) к SNMP серверу (если используется snmp v1).

Настраиваем SNMP сервер.

У меня, в качестве SNMP сервера выступает машина с CentOS 5.4, на которой установлен Zabbix.
Сначала необходимо установить следующий пакет:
net-snmp-utils
из него нам понадобится snmptrapd и snmpwalk.
Создаём конфиг /etc/snmp/snmptrapd.conf следующего содержания:
 ignoreauthfailure no
disableAuthorization no
authCommunity log,execute,net MyCommunity
donotfork no
pidfile /tmp/snmptrap.pid
traphandle default /bin/bash /usr/local/bin/snmptrap.sh
donotlogtraps no
logoption f /var/log/snmptrap.log
outputOption efnQs
Самая важная здесь строчка: traphandle default /bin/bash /usr/local/bin/snmptrap.sh, она указывает что делать если пришел SNMP трап. В нашем случае запускается скрипт snmptrap.sh.
Про остальные строки конфига подробно можно почитать в мане:
man snmptrapd.conf
и
man snmpcmd
Теперь из папки с исходниками Zabbix: /tmp/zabbix-1.8.1/misc/snmptrap/ копируем скриптик snmptrap.sh в /usr/local/bin/
Я немного подправил скрипт, т.к. предлагаемый меня не устраивал:
 #!/bin/bash
#
# Zabbix
# Copyright © 2000,2001,2002,2003 Alexei Vladishev
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#

# CONFIGURATION

LOG="/var/log/snmptrapmy.log";
ZABBIX_SERVER="localhost";
ZABBIX_PORT="10051";
ZABBIX_SENDER="/usr/local/bin/zabbix_sender";
KEY="snmptraps";
HOST="snmptraps";

# END OF CONFIGURATION

read hostname
read ip
read uptime
read oid
read index
read desc
read type
read info
read trapip
read community
read var1

ip=`echo $ip | cut -d"[" -f2 | cut -d"]" -f1`
uptime=`echo $uptime|cut -f2 -d'='`
oid=`echo $oid|cut -f2 -d'='`
index=`echo $index|cut -f2 -d'='`
desc=`echo $desc|cut -f2 -d'='`
type=`echo $type|cut -f2 -d'='`
info=`echo $info|cut -f2 -d'='`
trapip=`echo $trapip|cut -f2 -d'='`
community=`echo $community|cut -f2 -d'='`
var1=`echo $var1|cut -f2 -d'='`

hostname=`snmpwalk -c public $ip system.sysName.0 2> /dev/null|cut -d"="
 -f2|cut -d":" -f2`
str="$hostname $ip $oid $desc $info"
echo "$str" >> $LOG

$ZABBIX_SENDER -z $ZABBIX_SERVER -p $ZABBIX_PORT -s $HOST -k $KEY -o "$str"
У меня с трапом не приходил hostname, поэтому я получаю его самостоятельно этой строчкой:
hostname=`snmpwalk -c public $ip system.sysName.0 2> /dev/null|cut -d"=" -f2|cut -d":" -f2, для её работы нужна утилита snmpwalk (входит в установленный нами выше пакет), и дополнительная строчка в конфиге cisco:
snmp-server community NewCommunity

Запускаем snmptrapd.

Смотрим, нет ли ошибок в /var/log/snmptrap.log, если нет, идём на циску и пытаемся инициировать событие, например погасить интерфейс. Смотрим, что появилось в /var/log/snmptrap.log и snmptrapmy.log.
У меня в snmptrapmy.log появилось следующее:
CISCO_HOST_NAME 10.1.1.5 linkDown Vlan10 «administratively down».
Vlan 10 — это имя интерфейса, который мы хотим мониторить.
Отлично! Трапы приходят! (Если ничего не пришло, проверьте свой файервол). Теперь настроим Zabbix.

Настройка Zabbix

В заббиксе создайте новый хост с ip-адресом 0.0.0.0 и с именем snmptraps. Добавьте его в любую группу, например Zabbix Servers.

image
Теперь создайте Item с такими параметрами:
Description: GetTraps,
Type: Zabbix trapper,
Key: snmptraps,
Type of information: Text,
Сохраните.

image
В разделе Item, хоста snmptraps, перед столбцом Description, появится столбец Log и маленькая иконка.

image
Щёлкните на ней, и выберите «Create Log Trigger».

image
Создайте триггер с такими параметрами:
Description: LinkStatus,
Item: GetTrap,
Expression: 10.1.1.5 linkDown Vlan10 (не забудьте нажать кнопочку add)
Severity: по_вкусу
Сохраните.

image
Теперь в Configuration->Actions создайте новый экшен на только что созданный триггер. Настройте его так:

image
Всё, можно проверять, погасите на циске интерфейс, и через некоторое время должен сработать ваш только что настроенный экшен.

Чтобы добавить реакцию zabbix на любой другой трап, воспроизведите это событие на хосте, посмотрите, что запишется в snmptrapmy.log на SNMP сервере, и укажите полученный OID в триггере zabbix. Как только zabix получит трап (который ему передаёт скрипт snmptrap.sh), он проверяет, есть ли в полученной строке указанный в триггере шаблон, и, если есть, то триггер срабатывает. Сработанный триггер вызывает привязанный к нему Action, который отправляет уведомление администратору о случившемся событии.

Если не работает:

Если трапы на SNMP сервере не логируются, выяснить в чём проблема можно отправив трапы вручную, с помощью программы snmptrap: на другом компьютере, установите программу snmptrap и выполните следующее:

snmptrap -v1 -cMyCommunity IP_SNMP_SERVERA .1.3.6.1.6.3.1.1.5.2 0 0 "" "" .1.3.6.1.4.1 s "HelloWinn"
Отправленный трап должен записаться в /var/log/snmptrap.log на SNMP сервере. Если его там нет, проверьте, запущен ли snmptrapd и как там дела с правилам вашего файервола и пингуется ли ваш SNMP сервер :-)

 

Более подробно про настройку Zabbix можно почитать здесь.

Автор Bordac, http://bloggik.net/ - Статьи и программы для Админа.

 

UPD:

для того чтобы, правильно светился hostname:

из файла snptrap.sh
1)удаляем строчку:
HOST="snmptraps";
2) изменяем:
$ZABBIX_SENDER -z $ZABBIX_SERVER -p $ZABBIX_PORT -s $HOST -k $KEY -o "$str"
на
$ZABBIX_SENDER -z $ZABBIX_SERVER -p $ZABBIX_PORT -s $hostname -k $KEY -o "$str"
3) прописываем в /etc/hosts:

127.0.0.1 localhost
192.168.1.1 zabbix.local
10.10.10.1 Router-1
10.10.10.2 Router-2
10.10.10.3 Router-3

4) теперь можно принимать трапы для каждого устройства отдельно, создавая их в заббихе в разделе HOSTS.
Router-1
Router-2
и т.д.
вот рабочий триггер:
({TRIGGER.VALUE}#1)&({Router-1:snmptraps.regexp(linkDown \s+Loopback2)}=1)|({TRIGGER.VALUE}#0)&({Router-1:snmptraps.regexp(linkUp\s +Loopback2)}=0)

Спасибо kbish за дополнения.