Организация системы мониторинга сети с помощью пакетов SNMP и SNMPTT.
Систему мониторинга разворачиваем на сервере с ОС CentOS 6.3. Используемая версия SNMP - 2c.
Установка пакетов SNMP:
1. Устанавливаем пакеты из репозитария
# yum install net-snmp-utils
# yum install net-snmp
2. Сохраняем оригинальные конфигурационные файлы на всякий случай
# mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.org
# mv /etc/snmp/snmptrapd.conf /etc/snmp/snmptrapd.conf.org
3. Создаем новый файл конфигурации демона SNMPD. Этот демон отвечает за работу запросов и ответов протокола SNMP. Работает на 161 порту.
# nano /etc/snmp/snmpd.conf
и вписываем туда:
rocommunity public
syslocation "Samara"
syscontact rtech@samara.ttk.ru
4. Создаем новый файл конфигурации демона SNMPTRAP. Этот демон отвечает за прием snmptrap. Работает на 162 порту.
# touch /etc/snmp/snmptrapd.conf
Вписываем в файл:
authCommunity log,execute,net public
logoption f /var/log/snmptrap.log
Второй строчкой указываем путь логов демона snmptrapd.
ПРИМЕЧАНИЕ: Если необходимо, что бы программа Net-snmp принимала вообще все SNMP TRAP (без учета авторизаций), то необходимо после строчки authCommunity вписать строчку:
disableAuthorization yes
5. Запускаем сервис SNMPD и SNMPTRAP и добавляем в автозагрузку
# /etc/init.d/snmpd start
# chkconfig snmpd on
# service snmptrapd start
# chkconfig snmptrapd on
6. Проверяем, что сервисы запустились и работают на 161 и 162 порту:
# netstat -ltupn | grep snmp
tcp 0 0 127.0.0.1:199 0.0.0.0:* LISTEN 24867/snmpd
udp 0 0 0.0.0.0:161 0.0.0.0:* 24867/snmpd
udp 0 0 0.0.0.0:162 0.0.0.0:* 24880/snmptrapd
7. Разрешаем хождение пакетов в iptables. Так как сервер используется в локальной сети, можно вообще убрать все правила, закомментировав их в файле /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
#-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#-A INPUT -p icmp -j ACCEPT
#-A INPUT -i lo -j ACCEPT
#-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#-A INPUT -j REJECT --reject-with icmp-host-prohibited
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
Затем рестартуем iptables:
# service iptables restart
8. Отключаем SElinux, для этого открываем файл /etc/sysconfig/selinux
# nano /etc/sysconfig/selinux
Оставляем одну строку, остальное комментируем:
SELINUX=disabled
9. Перезагружаемся командой
# reboot
и убеждаемся, что после перезагрузки демоны SNMPD и SNMPTRAP стартовали.
Проверка работы пакетов SNMP:
Для проверки работы SNMP нужно сетевое устройство, работающее по SNMP, например коммутатор D-Link. Коммутатор D-Link должен быть корректно настроен для работы с SNMP. Пример настройки SNMP на коммутаторе D-Link в случае использования стандартных community (private и public).
enable snmp traps
enable snmp authenticate traps
enable snmp linkchange_traps
config snmp linkchange_traps ports all enable
config snmp coldstart_traps enable
config snmp warmstart_traps enable
config snmp system_name SMA-Mos4a-S2
config snmp system_location Samara. Moskovskoe shosse,4
config snmp system_contact rtech@samara.transtk.ru
enable rmon
create snmp community private view CommunityView read_write
create snmp community public view CommunityView read_only
create snmp host 10.200.16.230 v2c public
1. Проверяем работоспособность демона SNMPD, делая пробный запрос административного статуса портов к любому свичу D-Link, например:
# snmpwalk -v 2c -c public 10.200.72.12 IF-MIB::ifAdminStatus
Вывод должен показать примерно следующее:
IF-MIB::ifAdminStatus.1 = INTEGER: up(1)
IF-MIB::ifAdminStatus.2 = INTEGER: up(1)
IF-MIB::ifAdminStatus.3 = INTEGER: up(1)
IF-MIB::ifAdminStatus.4 = INTEGER: up(1)
IF-MIB::ifAdminStatus.5 = INTEGER: up(1)
IF-MIB::ifAdminStatus.6 = INTEGER: up(1)
IF-MIB::ifAdminStatus.7 = INTEGER: up(1)
IF-MIB::ifAdminStatus.8 = INTEGER: up(1)
IF-MIB::ifAdminStatus.9 = INTEGER: down(2)
IF-MIB::ifAdminStatus.10 = INTEGER: down(2)
IF-MIB::ifAdminStatus.1083 = INTEGER: up(1)
IF-MIB::ifAdminStatus.1088 = INTEGER: up(1)
IF-MIB::ifAdminStatus.1095 = INTEGER: up(1)
IF-MIB::ifAdminStatus.1104 = INTEGER: up(1)
IF-MIB::ifAdminStatus.1428 = INTEGER: up(1)
IF-MIB::ifAdminStatus.3023 = INTEGER: up(1)
IF-MIB::ifAdminStatus.3024 = INTEGER: up(1)
IF-MIB::ifAdminStatus.5121 = INTEGER: up(1)
2. Передернув любой порт свича наблюдаем наличие логов в файле /var/log/snmptrap.log.
# cat /var/log/snmptrap.log
2013-11-19 15:12:51 <UNKNOWN> [UDP: [10.200.72.43]:161->[10.200.16.227]]:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (11642652) 1 day, 8:20:26.52 SNMPv2-MIB::snmpTrapOID.0 = OID: IF-MIB::linkDown IF-MIB::ifIndex.19 = INTEGER: 19 IF-MIB::ifAdminStatus.19 = INTEGER: up(1) IF-MIB::ifOperStatus.19 = INTEGER: down(2)
2013-11-19 15:12:53 <UNKNOWN> [UDP: [10.200.72.43]:161->[10.200.16.227]]:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (11642655) 1 day, 8:20:26.55 SNMPv2-MIB::snmpTrapOID.0 = OID: IF-MIB::linkUp IF-MIB::ifIndex.19 = INTEGER: 19 IF-MIB::ifAdminStatus.19 = INTEGER: up(1) IF-MIB::ifOperStatus.19 = INTEGER: up(1)
Этим убеждаемся, что демон SNMPTRAPD работает.
Устанавливаем пакет SNMPTT (пакет удобной работы с SNMP TRAPами)
1. Добавляем репозитарий
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
2. Устанавливаем
# yum install snmptt
# yum install net-snmp net-snmp-utils net-snmp-perl
3. Открываем файл настроек SNMPTT /etc/snmp/snmptt.ini
# nano /etc/snmp/snmptt.ini
и меняем следующие строчки:
mode = daemon #(по умолчанию mode = standalone)
net_snmp_perl_enable = 1 #(по умолчанию 0)
mibs_environment = ALL #(по умолчанию закомментировано)
date_time_format = %Y-%m-%d %H:%M:%S #(по умолчанию не задано)
4. Открываем конфигурационный файл snmptrapd.conf демона SNMPTRAP.
# nano /etc/snmp/snmptrapd.conf
и вписываем в конец директиву
traphandle default /usr/sbin/snmptthandler
Эта директива, заставляет демон snmptrapd работать с snmptt и все приходящие трапы передавать на анализ процессу snmptt.
Что бы не плодить лишних логов, можно закомментировать строку:
#logoption f /var/log/snmptrap.log
В этом случае логи процесса SNMPTRAP собираться не будут. Все сообщения будет обрабатывать процесс SNMPTT.
5. Запускаем сервис snmptt командой:
# service snmptt start
6. Добавляем сервис snmptt в автозагрузку
# chkconfig --add snmptt
# chkconfig --level 2345 snmptt on
7. Рестартуем сервисы SNMPD и SNMPTRAPD:
# service snmpd restart
# service snmptrapd restart
8. Настраиваем SNMPTT на прием всех возможных трапов. Для этого необходимо внести изменения в файл конфигурации принимаемых трапов /etc/snmp/snmptt.conf.
Резервируем копию оригинального файла:
# cp /etc/snmp/snmptt.conf /etc/snmp/snmptt.conf.org
Открываем файл /etc/snmp/snmptt.conf
# nano /etc/snmp/snmptt.conf
Удаляем все, что там имеется и вписываем:
EVENT Samara_alarm .* "all" 1
NODES 10.200.0.0/16
NODES 10.199.0.0/16
NODES 10.198.0.0/16
FORMAT $+*
Первой строчкой обозначаем, что мы принимаем все трапы, что все трапы будут иметь метку Samara_alarm и будут иметь первый приоритет. Далее обозначается, что разрешено принимать трапы с ip сетей 10.200.0.0./16, 10.199.0.0./16, 10.198.0.0/16. Последняя строчка определяет расширенный вид SNMP TRAP в логах.
9. Делаем файл логов snmptt доступным для процесса snmptt:
# chmod 777 /var/log/snmptt/snmptt.log
10. Рестартуем сервис snmptt
# service snmptt restart
11. После описанных выше действий процесс snmptt принимает все поступающие в систему SNMP трапы, преобразует их в удобный формат и складывает в папку /var/log/snmptt/.
/var/log/snmptt/snmptt.log – здесь хранятся поступающие трапы
/var/log/snmptt/snmpttsystem.log – здесь хранятся логи работы самого сервиса snmptt
Настраиваем SNMPTT на работу с базой данных MySQL
1. Создаем базу данных и таблицы MySQL, в которые будут собираться SNMPTRAPы.
Подключаемся к MySQL
# mysql -uroot –p
Создаем базу данных «snmptt»:
>CREATE DATABASE `snmptt` DEFAULT CHARACTER SET utf8;
Создаем таблицы базы данных:
>USE `snmptt`;
>CREATE TABLE IF NOT EXISTS `snmptt` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`eventname` varchar(50) DEFAULT NULL,
`eventid` varchar(50) DEFAULT NULL,
`trapoid` varchar(100) DEFAULT NULL,
`enterprise` varchar(100) DEFAULT NULL,
`community` varchar(20) DEFAULT NULL,
`hostname` varchar(100) DEFAULT NULL,
`agentip` varchar(16) DEFAULT NULL,
`category` varchar(20) DEFAULT NULL,
`severity` varchar(20) DEFAULT NULL,
`uptime` varchar(20) DEFAULT NULL,
`traptime` datetime DEFAULT NULL,
`formatline` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`commit` int(2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
>CREATE TABLE IF NOT EXISTS `snmptt_unknown` (
`trapoid` varchar(100) DEFAULT NULL,
`enterprise` varchar(100) DEFAULT NULL,
`community` varchar(20) DEFAULT NULL,
`hostname` varchar(100) DEFAULT NULL,
`agentip` varchar(16) DEFAULT NULL,
`uptime` varchar(20) DEFAULT NULL,
`traptime` varchar(30) DEFAULT NULL,
`formatline` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Создаем пользователя базы данных с именем snmptt и с паролем passw0rdik
> create user 'snmptt'@'localhost' identified by 'passw0rdik';
> grant all privileges on snmptt.* to 'snmptt'@'localhost';
Выходим из MySQL
> exit
2. Прописываем в настройках snmptt доступ к базе данных MySQL
Открываем файл
# nano /etc/snmp/snmptt.ini
и изменяем следующие строки:
# MySQL: Set to 1 to enable logging to a MySQL database via DBI (Linux / Windows)
# This requires DBI:: and DBD::mysql
mysql_dbi_enable = 1 (по умолчанию 0)
# MySQL: Username to use
mysql_dbi_username = snmptt (имя пользователя mysql)
# MySQL: Password to use
mysql_dbi_password = passw0rdik (пароль пользователя mysql)
# The date time format for the traptime column in SQL. Defaults to
# localtime(). When a date/time field is used in SQL, this should
# be changed to follow a standard that is supported by the SQL server.
# Example: For a MySQL DATETIME, use %Y-%m-%d %H:%M:%S.
date_time_format_sql = %Y-%m-%d %H:%M:%S (по молчанию закомментировано и не задано)
3. Рестартуем сервис snmptt
# service snmptt restart
4. Теперь snmp трапы собираются в базе данных MySQL. Убедившись, что это так, прекращаем логирование snmptrap-ов в log файл для экономии места на диске.
Открываем конфигурационный файл
# nano /etc/snmp/snmptt.ini
и меняем значение параметра:
# Set to 1 to enable text logging of *TRAPS*. Make sure you specify a log_file
# location
log_enable = 0 (для сбора логов в файл было установлено 1)
Рестартуем сервис snmptt
# service snmptt restart
Подключаем дополнительные MIBы
1. Создаем папку в которой будем хранить mib-ы.
#mkdir /etc/snmp/mibs
2. Помещаем в папку MIB файл, например от UPS DELTA - DeltaUPS-MIB.txt.
3. Конвертируем MIB файл
# cd /etc/snmp/mibs
# snmpttconvertmib --in=DeltaUPS-MIB.txt --out=snmpttupsdelta.cong
Получился файл snmpttupsdelta.cong
4. Подключаем этот файл в настройки демона SNMPTT
Открываем файл snmptt.ini:
#nano /etc/snmp/snmptt.ini
Пролистываем файл в самый конец и находим строку snmptt_conf_files=<<END. Вписываем туда путь к нашем созданному файлу
[TrapFiles]
# A list of snmptt.conf files (this is NOT the snmptrapd.conf file). The COMPLETE path
# and filename. Ex: '/etc/snmp/snmptt.conf'
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf
/etc/snmp/mibs/snmpttupsdelta.cong
END
5. Рестартуем сервис:
# service snmptt restart
6. Теперь при пропадании электропитания в базе будет запись:
.1.3.6.1.4.1.2254.2.4.20.0.3
WARNING: Power failed! The UPS is operating on battery power.
ВАЖНО:
1) Для корректной работы системы сбора SNMPTRAPов, необходимо иметь точную работу сервера времени в системе.
2) При написании руководства предполагалось, что сервер LAMP установлен в системе.
ПОЛЕЗНЫЕ ССЫЛКИ:
http://www.netping.ru/view.aspx?id=284 - Получение TRAP сообщений на устройствах NetPing под FreeBSD
http://hobbymods.ru/index.php?dn=article&to=art&id=80 - Настройка отправки SNMP traps на некоторых типах коммутаторов.
http://www.opennet.ru/tips/info/2317.shtml - Организация приема SNMP trap’ов и их отправки на коммутаторах DLink
http://va0816.blogspot.ru/2013/06/zabbix-snmp-traps.html - Настройка Zabbix SNMP traps