Мониторинг был и остается важнейшей частью системного и сетевого администрирования. Но если для маленькой локальной сети зачастую достаточно время от времени смотреть логи, то в случае крупных систем приходится использовать специализированные средства. Об одном из них — Zabbix и поговорим сегодня.
Введение
Начнем с архитектуры. Система мониторинга Zabbix состоит из нескольких подсистем, причем все они могут размещаться на разных машинах:
- сервер мониторинга, который периодически получает и обрабатывает данные, анализирует их и производит в зависимости от ситуации определенные действия, в основном оповещение администратора;
- база данных — в качестве таковой могут использоваться SQLite, MySQL, PostgreSQL и Oracle;
- веб-интерфейс на PHP, который отвечает за управление мониторингом и действиями, а также за визуализацию;
- агент Zabbix, запускается на той машине/устройстве, с которой необходимо снимать данные. Его наличие хоть и желательно, но, если установить его на устройство невозможно, можно обойтись SNMP;
- Zabbix proxy — используется в основном в тех случаях, когда необходимо мониторить сотни и тысячи устройств для снижения нагрузки на собственно сервер мониторинга.
Логическая единица мониторинга — узел. Каждому узлу присваивается описание и адрес — в качестве адреса можно использовать как доменное имя, так и IP. Узлы могут объединяться в группы, к примеру группа роутеров, для удобства наблюдения. Каждому серверу соответствует несколько элементов данных, то есть отслеживаемых параметров. Поскольку для каждого сервера настраивать параметры, за которыми нужно следить, неудобно (особенно это верно для больших сетей), можно создавать узлы-шаблоны и каждому серверу или группе серверов будет соответствовать несколько шаблонов.
В статье будут рассмотрены интересные сценарии использования Zabbix, но сначала опишем установку этого решения на RHEL-подобные системы с MySQL в качестве БД.
Установка и первичная настройка
Перво-наперво надо подключить репозиторий EPEL:
# yum install http://ftp.yandex.ru/epel/6/i386/epel-release-6-8.noarch.rpm
Затем поставить нужные пакеты:
# yum install zabbix20-server zabbix20-agent zabbix20-web-mysql nmap httpd policycoreutils-python net-snmp net-snmp-utils
# yum groupinstall "MySQL Database Client" "MySQL Database Server"
Для чего нужен httpd и утилиты SNMP, полагаю, понятно. А вот Nmap нужен для некоторых проверок, чтобы заполнить элементы данных. Теперь необходимо настроить автозапуск служб и их запустить.
# chkconfig httpd on
# chkconfig mysqld on
# chkconfig zabbix-server on
# chkconfig zabbix-agent on
# service mysqld start
И конечно же, надо произвести начальную настройку MySQL.
# mysql_secure_installation
Затем заходим в консоль MySQL и создаем БД и пользователя:
mysql> CREATE DATABASE zabbix CHARACTER SET utf8;
mysql> GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost' IDENTIFIED BY 'zabbixpassword';
Теперь импортируем базы данных:
# mysql -u zabbix -p zabbix < /usr/share/zabbix-mysql/schema.sql
# mysql -u zabbix -p zabbix < /usr/share/zabbix-mysql/images.sql
# mysql -u zabbix -p zabbix < /usr/share/zabbix-mysql/data.sql
Редактируем файл конфигурации сервера Zabbix (/etc/zabbix_server.conf
):
# <...>
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
Слегка подкрутим конфигурацию PHP (/etc/php.ini
):
# <...>
max_execution_time = 300
max_input_time = 300
post_max_size = 16M
date.timezone = Asia/Omsk
Настраиваем SELinux:
# semanage port -a -t http_port_t -p tcp 10051
# setsebool -P httpd_can_network_connect on
Наконец, запускаем оставшиеся службы:
# service httpd start
# service zabbix-server start
# service zabbix-agent start
В браузере подключаемся к http://server_name/zabbix и производим начальную конфигурацию фронтенда Zabbix (то есть имя БД, имя пользователя и пароль). После этого начальную настройку можно считать завершенной.
Хакер #179. Интернет вещей — новый вектор атак
Мониторинг nginx и memcache
Для мониторинга nginx можно, разумеется, использовать самописные скрипты. Но в некоторых случаях, когда времени катастрофически не хватает, хочется найти что-нибудь готовое. В случае с nginx таким готовым решением будет набор питоновских скриптов ZTC. Для их установки сперва нужно установить некоторые пакеты:
# yum install lm_sensors smartmontools
Затем используй следующие команды:
# wget https://bitbucket.org/rvs/ztc/downloads/ztc-12.02.1-1.el6.noarch.rpm
# rpm -ivh --nodeps ztc-12.02.1-1.el6.noarch.rpm
Опция --nodeps нужна по причине того, что пакет требует версию Zabbix 1.8, но ничто не мешает попробовать ZTC и на последних его версиях.
Теперь добавим еще один конфиг nginx (/etc/nginx/conf.d/nginx_status.conf
):
server {
listen localhost;
server_name nginx_status.localhost;
location /server-status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
И поправим конфиг nginx в ZTC (/etc/ztc/nginx.conf
):
# <...>
proto=http
host=localhost
port=80
resource=/server-status
Проверим работу скрипта ZTC:
# /opt/ztc/bin/nginx.py ping
# /opt/ztc/bin/nginx.py ping
Если все нормально, настраиваем Zabbix-agent на нужной машине (/etc/zabbix-agentd.conf
):
# <...>
UserParameter=nginx[*],/opt/ztc/bin/nginx.py $1
Теперь нужно настроить веб-интерфейс. Для этого необходимо импортировать шаблонTemplate_app_nginx.xml
, что лежит в /opt/ztc/templates/
. Замечу, что лежит он именно на том компьютере, где установлен ZTC, так что если у тебя на сервере нет GUI, то файл придется копировать на машину, на которой установлен браузер и с которой собственно и ведется мониторинг.
Не стоит забывать, что в этом наборе скриптов кроме мониторинга nginx есть еще мониторинг и других приложений, таких, например, как MongoDB. Настраивается он аналогично, поэтому рассматривать его смысла нет.
А вот для memcache среди этих скриптов нет ничего, так что придется нам его написать самим. Проверим его работо- и дееспособность:
# echo -e "stats\nquit" | nc -q2 127.0.0.1 11211
В ответ должны посыпаться статистические данные. Теперь пишем скрипт-однострочник/etc/zabbix/scripts/memcache.sh
(при этом не забываем сделать его исполняемым):
#!/bin/bash
echo -e "stats\nquit" | nc 127.0.0.1 11211 | grep "STAT $1 " | awk '{print $3}'
Как и в случае с nginx, правим конфиг Zabbix-agent (/etc/zabbix-agentd.conf
) и не забываем его рестартовать:
# <...>
UserParameter=memcache[*],/etc/zabbix/scripts/memcache.sh $1
Берем шаблон отсюда и импортируем его в веб-интерфейс.
INFO
Для сети средних размеров (когда нужно мониторить около десятка устройств) достаточно разместить сервер мониторинга, веб-интерфейс и БД на одной системе, а Zabbix-агенты — на узлах, требующих присмотра.
Мониторинг различных устройств с помощью Zabbix
В основном Zabbix используется для мониторинга серверов, но помимо собственно серверов есть еще множество других устройств, которые также нуждаются в мониторинге. Далее будет описана настройка Zabbix для мониторинга некоторых из них.
В большинстве сетей среднего и крупного размера имеется гремучая смесь всевозможного железа, которая досталась нынешнему админу со времен развертывания (и, скорее всего, это развертывание происходило еще при царе Горохе). По счастью, абсолютное большинство сетевого (да и не только) оборудования поддерживает открытый протокол SNMP, с помощью которого можно как получать о нем информацию, так и управлять параметрами. В данном случае нас интересует первое. Вкратце опишу нужные действия:
- включить поддержку SNMP на устройствах. Не забывай о безопасности — по возможности используй третью версию протокола, устанавливай авторизацию и изменяй имена community;
- добавить нужные элементы в Zabbix. Одному параметру SNMP соответствует один элемент; также нужно указать OID (идентификатор параметра) версию SNMP и, в зависимости от нее, параметры авторизации;
- добавить триггеры на нежелательное изменение параметров.
У каждой железки могут быть десятки отслеживаемых параметров, и вручную их добавлять замучаешься. Но в Сети можно найти множество шаблонов, которые уже содержат в себе все необходимые элементы, триггеры и графики, — остается только их импортировать и подключить нужные хосты. Также существуют стандартные OID, которые описаны в RFC. К таковым относится, например, uptime с OID .1.3.6.1.2.1.1.3.0 или — для коммутаторов — статус порта с OID .1.3.6.1.2.1.2.2.1.8.X, где X — номер порта.
Существует онлайн-генератор шаблонов, который генерирует их на основе стандартных OID. В основном он предназначен для железа от Cisco, но ничто не мешает его использовать для другого оборудования.
Zabbix также поддерживает и карту сети. К сожалению, ее нужно составлять вручную. Есть возможность поставить над соединительными линиями скорость — для этого требуется добавить в подпись нужный элемент в фигурных скобках. Помимо этого, в случае падения соединения можно раскрашивать соединительные линии красным цветом.
Тот же человек, что написал упомянутый генератор шаблонов, написал также и дополнение к фронтенду, которое отображает в удобном виде статус порта (скрипт для второго Zabbix лежит здесь). Установка его, как его автор сам и признает, достаточно заморочена — скрипт писался в первую очередь для внутреннего применения.
SNMP Traps в Zabbix
Протокол SNMP, помимо пассивного получения данных устройства, поддерживает также и активную их рассылку со стороны устройства. В англоязычной документации это именуется SNMP Trap, в русскоязычной же используется термин SNMP-трап. Трапы удобны, когда нужно срочно уведомить систему мониторинга об изменении какого-либо параметра. Для отлова трапов в Zabbix имеется три способа (во всех трех случаях нужен еще и демон snmptrapd):
- с помощью SNMPTT (SNMP Trap Translator);
- используя скрипт на Perl;
- используя скрипт на bash.
Далее описан первый вариант. Прежде всего, не забываем разрешить 161-й порт UDP и по необходимости временно отключить SELinux. Затем ставим нужные пакеты (предполагается, что репозиторий EPEL у тебя подключен):
# yum install net-snmp net-snmp-utils net-snmp-perl snmptt
Настраиваем snmptrapd (/etc/snmp/snmptrapd.conf
):
disableAuthorization yes
traphandle default snmptthandler
Первая строчка отключает проверки доступа, что, в общем-то, крайне не рекомендуется делать в условиях промышленного использования (здесь она исключительно для простоты конфигурации), вторая указывает обработчик всех поступивших трапов, коим и является snmptthandler.
Затем настраиваем snmptt (/etc/snmp/snmptt.ini
):
# <...>
net_snmp_perl_enable = 1
mibs_environment = ALL
date_time_format = %H:%M:%S %Y/%m/%d
Теперь нужно настроить шаблоны для маппинга трапов на Zabbix SNMP. Ниже будет приведен пример такого шаблона для двух видов трапов — coldStart и всех остальных (/etc/snmp/snmptt.conf
).
# <...>
EVENT general .* "General event" Normal
FORMAT ZBXTRAP $aA $1
EVENT coldStart .1.3.6.1.6.3.1.1.5.1.0.33 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
Первые две строчки описывают любые трапы, а вторая пара — конкретный трап с OID. Замечу, что для того, чтобы Zabbix ловил эти трапы, они должны быть именно в формате «ZBXTRAP адрес».
Включаем нужные службы:
# chkconfig snmptt on
# chkconfig snmptrapd on
# service snmptt start
# service snmptrapd start
Посылаем тестовые трапы и смотрим логи:
# snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.1' '0.0.0.0' 6 1 '55' .1.3.6.1.6.3.1.1.5.1 s "teststring000"
# snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.1' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.1 s "teststring000"
# tail /var/log/snmptt/snmptt.log
Если все нормально, переходим к конфигурированию Zabbix. В файле/etc/zabbix_server.conf
укажем местонахождение лога и включим встроенный SNMPTrapper:
# <...>
SNMPTrapperFile=/var/log/snmptt/snmptt.log
StartSNMPTrapper=1
После этого нужно зайти в веб-интерфейс Zabbix, по необходимости добавить в узле сети интерфейс SNMP и добавить элемент для трапа. Ставим все необходимые действия, если это нужно, и проверяем, для чего точно так же создаем тестовый трап.
INFO
Масштабирование в Zabbix работает достаточно хорошо — при должной настройке он выдерживает 6000 узлов.
Мониторинг VPN-туннелей на оборудовании Cisco
Возникла необходимость мониторинга загрузки кучи туннелей VPN на цисках. Все хорошо, SNMP как на циске, так и на Zabbix настроен, но есть одна загвоздка — OID для каждого соединения формируются динамически, как и их списки. Это связано с особенностями протокола IPsec, в которые я вдаваться не буду — скажу лишь, что это связано с процедурой установления соединения. Алгоритм извлечения нужных счетчиков, таким образом, настолько замудрен, что реализовать его встроенными средствами Zabbix не представляется возможным.
По счастью, имеется скрипт, который это делает сам. Его нужно скачать и закинуть в каталог ExternalScripts (в моем случае это был /var/lib/zabbixsrv/externalscripts
). Проверим его работоспособность:
# /var/lib/zabbixsrv/externalscripts/query_asa_lan2lan.pl ciscocom 192.168.10.1 ASA get RX 94.251.99.1
Если проверка прошла успешно, применим комбинацию LLD с этим скриптом. Создаем шаблон с правилом обнаружения (OID 1.3.6.1.4.1.9.9.171.1.2.3.1.7) и двумя элементами данных с внешней проверкой и ключами 'queryasalan2lan.pl["{$SNMPCOMMUNITY}", "{HOST.IP}", "ASA", "get, "RX", "{#SNMPVALUE}"]' и 'queryasalan2lan.pl["{$SNMPCOMMUNITY}", "{HOST.IP}", "ASA", "get", "TX", "{#SNMPVALUE}"]', назвав их соответственно "Incoming traffic in tunnel to {#SNMPVALUE}" и "Outgoing traffic in tunnel to {#SNMPVALUE}". После этого применяем шаблон к нужным узлам и ждем автообнаружения.
К сожалению, LLD сейчас не поддерживает объединение графиков из нескольких прототипов данных, так что приходится добавлять нужные элементы ручками. По окончании этой работы любуемся графиками.
Прикручиваем MIB к Zabbix
Сам по себе Zabbix не поддерживает MIB (Management Information Base), а готовые шаблоны есть отнюдь не для всех устройств. Конечно, все OID можно добавить и вручную (с помощью snmpwalk), но это работает, только если их у тебя не очень много. Однако существует плагин для веб-интерфейса Zabbix под названием SNMP Builder, который позволяет конвертировать MIB-файлы в шаблоны и уже эти шаблоны допиливать под свои нужды. Берем его из Git-репозитория:
# git clone https://github.com/atimonin/snmpbuilder.git
Накладываем патч (в твоем случае, разумеется, имена каталогов могут быть другими, и подразумевается, что ты находишься в каталоге, где размещен фронтенд Zabbix — в случае с RHEL-based системами это /usr/share/zabbix
):
# patch -p1 < /home/centos/snmpbuilder/snmpbuilder-2.0.5.patch
Копируем недостающие файлы и распаковываем картинки:
# tar xzvf /home/centos/snmpbuilder/snmpbuilder-2.0_imgs.tar.gz
# cp -r /home/centos/snmpbuilder/zabbix/* .
По необходимости редактируем переменную MIBSALLPATH в файле snmp_builder.php
. В отдельных случаях может также понадобиться слегка подправить его код, начиная со строки foreach(glob($path."/*.mib"). Код в этом случае будет выглядеть примерно так:
# <...>
foreach(glob($path."/*.mib") as $filename){
if (preg_match('/^'.preg_quote($path,'/').'\/(.+)\.mib$/',$filename,$matches)){
$result=exec("cat ".$filename."| grep -i 'DEFINITIONS.*::=.*BEGIN'|awk '{print $1}'");
$cmbMibs->addItem($result,$result);
}
}
Теперь можно уже использовать.
Прежде всего нужно найти MIB-файлы для твоего железа. Некоторые производители их скрывают, некоторые — нет. После того как ты их нашел, эти файлы нужно поместить в папку, которую ты указал в вышеуказанной переменной. В отдельных случаях могут возникнуть зависимости — в подобной ситуации нужно найти соответствующий MIB-файл, чтобы их разрешить. Итак, выбери шаблон, MIB-файл и укажи адрес устройства. Если все нормально, ты увидишь список OID, которые нужно затем выбрать для добавления к шаблону. После выбора нужно нажать кнопку «Сохранить». Добавленные элементы появятся в указанном шаблоне.
В отдельных ситуациях нужно отредактировать новодобавленные элементы, поскольку по дефолту интервал обновления 60 секунд, что в случае, например, с именем хоста не имеет особого смысла — лучше в подобных ситуациях ставить его равным 86 400 секунд (24 часа). Для счетчиков же нужно изменить формат хранения на «Дельта в секунду». Кроме того, с некоторыми элементами нужно настроить еще и преобразование их значений в удобочитаемый вид. Для этого перейди в «Администрирование -> Общие» и в выпадающем меню выбери «Преобразование значений», а там уже добавляй его.
В общем-то, модуль мы настроили — все остальное ты уже настраивай самостоятельно.
Версии протокола SNMP
Существует несколько версий SNMP. Первая версия появилась в 1988 году и на данный момент, хоть и считается устаревшей, все еще очень популярна. Версия 2 (фактически сейчас под ней подразумевают версию 2c) появилась в апреле 1993 года. Она была несовместима с первой версией. Основные новшества второй версии протокола заключались в обмене информацией между управляющими компьютерами. Кроме того, появилась команда получения сразу нескольких переменных (GetBulk).
Во времена разработки первой версии мало кто заботился о безопасности, поэтому о какой-либо защите в SNMPv1 и говорить нечего. Аутентификации как таковой не было — не считать же за нее строку Community, передаваемую в открытом виде? Были, конечно, попытки реализовать безопасность SNMPv1, но успехом они не увенчались. Во второй версии кардинальных изменений тоже не появилось. А вот SNMPv3 уже начала поддерживать как безопасность сообщений (USM), так и контроль доступа (VACM). В USM поддерживаются MD5 и SHA-1 для обеспечения защиты от модификации данных и DES (сейчас уже AES) для шифрования. VACM же вводит как возможность авторизации, так и возможность указывать, какой управляющий компьютер какими атрибутами может манипулировать.
Несмотря на то что настраивать SNMPv3 сложнее, крайне рекомендуется использовать именно его, а остальные версии протокола отключать.
Заключение
В данной статье я рассмотрел интересные возможности системы мониторинга Zabbix. Полагаю, если ты хороший админ, то эти возможности можешь применить с пользой для себя. Но не стоит забывать, что мониторинг не вещь в себе — его нужно применять в комплексе с организационными мерами.