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\) и подставим все параметры в командную строку:
После выполнения команды служба установится в системе.
Теперь вернемся к нашим 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
Программа работает с двумя 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
Версия под FreeBSD - http://xcme.blogspot.ru/2015/10/maxys-mac-notify-syslog_17.html
ОтветитьУдалить