пятница, 17 октября 2014 г.

Macsys - системная служба для сбора syslog и mac-notify сообщений с коммутаторов D-Link

Macsys - системная служба для ОС Windows, собирающая syslog и snmptrap mac-notify сообщения с коммутаторов D-Link и сохраняющая их в базу данных MySQL. Macsys был написан потому что мне, в свое время, не удалось найти другого достойного решения для данной задачи. Сейчас же я пользуюсь unix-демоном, написанным на python, а macsys не развивается уже 3 года, но, тем не менее, он все еще может найти свое применение в инфраструктуре ISP.

Программа работает с двумя MySQL-серверами. С первого она получает список коммутаторов, от которых ожидается прием данных. Обновление этого списка происходит через указанный в настройках интервал. На второй сервер отправляются результаты. Данные отправляются по мере получения, независимо от интервала опроса первого сервера. Для syslog и для mac-notify предусмотрены отдельные таблицы. Программа использует стандартные порты для syslog и snmptrap, т.е. UDP 514 и UDP 162 соответственно. Эти порты не должны быть заняты другими приложениями.

Установка службы происходит при помощи вот такой длинной команды:
macsys.exe -install -sr mysql_server_for_reading_data -ur username -pr password -dr database -qr read_query -sw mysql_server_for_storing_data -uw username -pw password -dw database -twm mactrap_table_name -tws syslog_table_name -log extended|debug|normal -time renewal_interval

Здесь перечисленно довольно много параметров, но на пугаться этого не стоит. :) Ниже мы разберем, что есть что.

-sr - IP-адрес MySQL-сервера "для чтения", где содержится список устройств
-ur - Имя пользователя для подключения к серверу "для чтения"
-pr - Пароль для подключения к серверу "для чтения"
-dr - Имя базы данных на сервере "для чтения"
-qr - Запрос для выбора устройств из базы данных на сервере "для чтения"
-sw - IP-адрес MySQL-сервера "для записи", где будут сохраняться принятые сообщения
-uw - Имя пользователя для подключения к серверу "для записи"
-pw - Пароль для подключения к серверу "для записи"
-dw - Имя базы данных на сервере "для записи"
-twm - Имя таблицы для mactap на сервере "для записи"
-tws - Имя таблицы для syslog на сервере "для записи"
-log - Режим журналирования (extended|debug|normal)
-time - Интервал опроса сервера "для чтения" и обновления файла журнала

Настройки для работы с MySQL сохраняются в реестре по обычному для служб системы адресу в разделе Parameters. Но вот насчет -log и -time ничего сказать не могу - уже не помню. :)

Допустим, есть сервер 10.0.0.2 с базой данных maindb, где в таблице devices хранится информация о коммутаторах. Для сохранения полученных сообщений предполагается использовать сервер 10.0.0.4 с базой данных macsys, где в таблице mactap будет храниться информация о mac notify, а в таблице syslog - syslog-сообщения. Для подключения к 10.0.0.2 используются имя и пароль user1/pass1, а для подключения к 10.0.0.4 - user2/pass2. При этом мы хотим работу сервиса в обычном (не отладочном) режиме с интервалом обновления списка устройств в 5 минут.

Для работы программе нужны ID устройств и их IP адреса. Мы можем получить их из нашей воображаемой базы следующим запросом: "select devices.id,devices.ip from maindb.devices;"

Скопируем macsys.exe в отведенную ей директорию (у меня это c:\Windows\System2\) и подставим все параметры в командную строку:

macsys.exe -install -sr 10.0.0.2 -ur user1 -pr pass2 -dr maindb -qr "select devices.id,devices.ip from maindb.devices;" -sw 10.0.0.4 -uw user2 -pw pass2 -dw macsys -twm mactrap -tws syslog -log normal -time 5


После выполнения команды служба установится в системе.

Теперь вернемся к нашим MySQL серверам. Если первая воображаемая база данных maindb существует у нас давно и успешно обновляется, то вот на втором сервере базы данных macsys еще нет. Создадим ее:
CREATE DATABASE IF NOT EXISTS `macsys` /*!40100 DEFAULT CHARACTER SET latin1 */;

Затем создадим таблицу mactrap:
CREATE TABLE `mactrap` (
    `id` INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    `switch_id` SMALLINT(2) UNSIGNED NOT NULL DEFAULT '0',
    `ip` INT(4) UNSIGNED NOT NULL,
    `action` TINYINT(1) UNSIGNED NOT NULL,
    `mac` CHAR(12) NOT NULL,
    `port` TINYINT(1) UNSIGNED NOT NULL,
    `datetime` INT(4) UNSIGNED NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `switch_id` (`switch_id`),
    INDEX `port` (`port`),
    INDEX `mac` (`mac`),
    INDEX `datetime` (`datetime`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
AUTO_INCREMENT=0;


Теперь очередь таблицы syslog:
CREATE TABLE `syslog` (
    `id` INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    `switch_id` SMALLINT(2) UNSIGNED NOT NULL DEFAULT '0',
    `ip` INT(4) UNSIGNED NOT NULL,
    `type` TINYINT(1) UNSIGNED NOT NULL,
    `data` CHAR(160) NOT NULL,
    `datetime` INT(4) UNSIGNED NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `switch_id` (`switch_id`),
    INDEX `datetime` (`datetime`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
AUTO_INCREMENT=0;


Создадим пользователя user2:
CREATE USER 'user2'@'%' IDENTIFIED BY 'pass2';
GRANT USAGE ON *.* TO 'user2'@'%';
GRANT ALL PRIVILEGES ON `macsys`.* TO 'user2'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;


Запустим службу:
C:\Windows\System32>net start macsysservice
Служба "MAC-Trap & SysLog Server" запускается.
Служба "MAC-Trap & SysLog Server" успешно запущена.

В директории C:\Windows\System32 должен появиться файл macsys.log. Записи в нем говорят о том, что все хорошо.
2014.10.17 12:51:36 Service 'MAC-Trap & SysLog Server' started...
2014.10.17 12:51:36 Variable '[read] SQL Server' is OK
2014.10.17 12:51:36 Variable '[read] SQL User' is OK
2014.10.17 12:51:36 Variable '[read] SQL Password' is OK
2014.10.17 12:51:36 Variable '[read] SQL Database' is OK
2014.10.17 12:51:36 Variable '[read] SQL Query' is OK
2014.10.17 12:51:36 Variable '[write] SQL Server' is OK
2014.10.17 12:51:36 Variable '[write] SQL User' is OK
2014.10.17 12:51:36 Variable '[write] SQL Password' is OK
2014.10.17 12:51:36 Variable '[write] SQL Database' is OK
2014.10.17 12:51:36 Variable '[write] SQL Table MAC-Trap' is OK
2014.10.17 12:51:36 Variable '[write] SQL Table SysLog' is OK
2014.10.17 12:51:36 All variables is OK!
2014.10.17 12:51:36 Connection for SQL Server '10.0.0.2' (Read) established
2014.10.17 12:51:36 SQL Read-Query OK. 2379 rows found
2014.10.17 12:51:42 Connection for SQL Server '10.0.0.4' (Write) established

Осталось настроить коммутаторы на отправку сообщений на наш сервер, где запущена служба macsys. Предположим, сервер имеет IP-адрес 10.0.0.3, а на коммутаторах используется snmp-community "public". Выполним на коммутаторах команды:
enable syslog
create syslog host 1 ipaddress 10.0.0.3 state enable

enable mac_notification
config mac_notification ports 1-24 enable
create snmp host 10.0.0.3 v2c public


Через 5 минут служба обновит список коммутаторов с сервера и сообщит в лог-файл, сколько сообщений было получено и сколько было успешно отправлено на сервер.
2014.10.17 12:56:42 MacTrap Messages: recieved 174, sended 174
2014.10.17 12:56:42 SysLog  Messages: recieved 92, sended 92
2014.10.17 12:56:42 Connection for SQL Server '10.0.0.2' (Read) established
2014.10.17 12:56:42 SQL Read-Query OK. 2379 rows found

Таким образом, настройка закончена. Данные из таблиц mactrap и syslog можно использовать в своих внутренних сервисах. Они часто нужны при "разборе полетов" и в других, не менее интересных, ситуациях. :)

Если программой будут получены сообщения с устройства, которого нет в его списке, ID устройства будет считаться равным то ли 0, то ли пустой строке. По идее, об этом факте должно быть также сообщено в лог-файл, но этого не происходит. Сейчас, спустя 3-4 года, сложно сказать почему так. :) Быть может, записи появляются  только в режимах extended и debug. Тем не менее, в остальном это рабочее решение, которое идеально подходит для начинающих системных администраторов небольших сетей. В одной из следующих заметок я расскажу об аналогичном unix-демоне, который использую в настоящее время.

md5 (macsys.exe):
f34e56a235df1c1b4f47ada54a6c5294

sha1 (macsys.exe):
fd75d00d7cbcf9acebc3ce9646d47c70784e0263

Сам файл можно взять тут:
https://drive.google.com/file/d/0B4tByM_LyCe9S3hyZ1liNDg1SlU/view?usp=sharing

1 комментарий: