Итак, если вы вдруг случайно настроили
сенсоры, коллекторы и FlowTools,
то естественно встанет вопрос с анализатором. Flow-Tools — очень
хороший пакет программ. Но если вы работаете в более-менее приличной
конторе, в которой есть больше одного IT работника, вам понадобится как
то представлять (показывать) информацию своим коллегам и начальству для
дальнейшего разбора полетов.
Задача: Подготовить отчеты по трафику для удобного просмотра.
Имеем: Данные коллектора (flow-capture).
Подготовка
В
современном мире пожалуй самым удобным доступом к данным является
доступ через WEB. Потому естественно нам понадобится
Apache. Вероятней
всего нам понадобится
MySQL и
PHP (но не факт). Я поставлю пакет этих
программ потому что рано или поздно мне это понадобится. Еще отмечу, что
если программирую я, то обычно выбираю perl, но как правило у нас будет
много попутного софта, который будет написан на PHP. Как вам — решайте
сами.
Обзор ПО для работы с NetFlow
FlowViewerЭтот
«продукт» первым мне на глаза попался. Набрел я на него пока
устанавливал flow-tools и мастерил первый perl-скрипт для генерации
отчетов. На сайте я увидел, что текущая версия 4.0, однако в
(обновленной) коллекции портов FreeBSD почему то доступна только третья.
Так же на сайте сказано, что их система перешла в SourceForge (читаем
сырое), начинаем беспокоиться…
Сперва я попробовал установить версию
из портов. Процесс установки был вполне себе простым. В конце было
предложено добавить несколько строчек в Apache и гарантировалось
счастье.
Но счастье не пришло. Естественно пришлось идти на сайт,
качать более новую версию, долго вникать в тонкости. В результате я
смог добиться невнятной картинки, на которой никаких данных так и не
отображалось. Так как с двух ударов в бубен работать не начало, было
принято решение двигаться дальше. Тем более пока есть куда.
CactiЭтот
комплекс позиционирует себя как «complete network graphing solution». Я
слышал много положительных отзывов о этой программе от различных людей,
заслуживающих уважения. В сумме звучит многообещающе. Попробуем. Ниже
информация по cacti v 0.8.8a.
Установка:
# whereis cacti
cacti: /usr/ports/net-mgmt/cacti
#cd /usr/ports/net-mgmt/cacti
make install clean
После установки нам будет написано:
Cacti is now installed. If you intall it for the first time,
you may have to follow this steps to make it work correctly:
1. Create the MySQL database:
# mysqladmin --user=root create cacti
2. Create a mysql user/password for cacti:
(change user and/or password if required)
# echo "GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'cactiuser'; FLUSH PRIVILEGES;" | mysql
3. Import the default cacti database:
# mysql cacti < /usr/local/share/cacti/cacti.sql
4. Edit /usr/local/share/cacti/include/config.php.
5. Add the line to cron jobs with the command:
# crontab -u cacti -e
*/5 * * * * /usr/local/bin/php /usr/local/share/cacti/poller.php > /dev/null 2>&1
6. Add alias in apache config for the cacti dir:
Alias /cacti "/usr/local/share/cacti/"
7. Be sure apache gives an access to the directory ('Allow from' keywords).
8. Open a cacti login page in your web browser and login with admin/admin.
If you update cacti, open a login page, an updating process
will start automatically.
Я
следовал этой инструкции с небольшой поправкой. Команды mysql и
mysqladmin я выполнял с ключом -p (запускать с паролем), поскольку у
меня запрещено работать без пароля.
Далее я попытался войти на
страничку, которая мне выдала массу предупреждений с руганью на
временные зоны. Оказывается требуется прописать временную зону в
/usr/local/etc/php.ini
date.timezone = имя_зоны
имя_зоны
я скопировал с выданного предупреждения. Также можно попытаться
выяснить
тут. После поправки мне пришлось перезапустить Апач, потому что
иначе ничего не менялось (варны продолжали сыпаться).
После этих танцев на страничке появился «мастер», который:
1) спросил ставлю ли я систему с нуля или это апгрейд более старой версии
2) Предложил проверить пути к нужным ресурсам
Так
же он предупредил, что настройки будут сохранены и больше окошко
беспокоить не будет (после нажатия кнопки «finish»). Все — видим окно с
логином. Пользователь/пароль должны быть admin/admin. После входа сразу
попросят сменить пароль. Так что не пугаемся, пишем уже нужный нам.
Итак
мы имеем вполне себе дружественный веб-интерфейс. Если честно, когда я
добавил один из своих маршрутизаторов и увидел, что начали рисоваться
красивые графики, меня это повергло в дикий восторг. (Оно и понятно
после таких то мучений с предыдущим проектом). Но мы не хотим видеть
статистику только по SNMP (хоть это и очень нужная фича). Потому мы
двигаемся дальше.
Cacti имеет в своем арсенале plugin — flowviwer (нет, это другое). Качаем и смотрим:
# fetch http://docs.cacti.net/_media/plugin:flowview-v1.0-1.tgz
# tar -xf plugin:flowview-v1.1-1.tgz -C /usr/local/share/cacti/plugins
# less /usr/local/share/cacti/plugins/flowview/README
видим в папке два sql скрипта flowview.sql и plugin_flowview_ports.sql
первый почему то ставится автоматом, а второй - нет. На всякий случай поставим:
# mysql -p cacti < plugin_flowview_ports.sql
В выводе нас интересует:
----[ Installation
First, make sure you have the plugin architecture installed.
http://cactiusers.org/wiki/PluginArchitectureInstall
Install just like any other plugin, just throw it in the plugin directory,
in a folder called flowview.
Edit your includes/config.php and add it to your $plugins list, and you are rolling
http://cactiusers.org/wiki/PluginsInstall
Хорошо, поставим сперва PluginArchitecture:
# fetch http://www.cacti.net/downloads/pia/cacti-plugin-0.8.7h-PA-v3.0.tar.gz
# tar -xf cacti-plugin-0.8.7h-PA-v3.0.tar.gz
# cp cacti-plugin-arch/* /usr/local/share/cacti
# cd /usr/local/share/cacti
# patch -p1 -N < cacti-plugin-0.8.7h-PA-v3.0.diff
# mysql -p cacti < pa.sql
Что характерно, у меня скрипт ругнулся на то, что таблицы уже все есть. Проверил — так и есть.
Далее редактируем файл конфигурации: /usr/local/share/cacti/include/config.php
/* make sure these values refect your actual database/host/user/password */
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "cactiuser";
$database_port = "3306";
$database_ssl = false;
/* load up old style plugins here */
$plugins = array();
$plugins[] = 'flowview';
Смотрим
на web-интерфейсе появилась секция «Plugin Management» (вкладка
Console). Открыв, видим плагин и статус «Not installed». В левой части
сточки видим значок со стрелочкой. Наводим — появляется подсказка
«Install» — это оно. Жмем — статус меняестся и появляется еще один
значок — Enable (lol). Жмем — появляется вкладка «flows». Похоже мы на
верном пути.
Грабли
Грабли, которые меня ждали —
неправильно указанные пути. После добавления устройства и попытки
посмотреть данные, мне сказали что неправильно указан путь к бинарникам
flow-tools. Вместо /usr/bin они лежат в /usr/local/bin; плюс ко всему
пришлось поменять путь к файлам коллектора netflow. У меня они в
/var/db/flows
В общем то тут проблем особо не появилось. Проблемы пошли потом, когда я попытался воспользоваться этим благом…
Поскольку это всего лишь плагин и делал его судя по всему один человек (Jimmy Conner), полезли косячки:
1)
Последней версии flow-tools не нравится синтаксис скрипта для запуска
flow-capture, который лежит в папке плагина «flowview», а именно:
echo
"NOTE: Launching flow-capture as '$tools_path/flow-capture -w
$path/$folder 0/$from/$port -S5 -V$v -z $comp -n $rotate -e $expire -N
$nest'\n";
shell_exec($tools_path . "/flow-capture -w $path/$folder 0/$from/$port -S5 -V$v -z $comp -n $rotate -e $expire -N $nest");
мне удалось запустить после того как я изменил этот фрагмент на:
echo
"NOTE: Launching flow-capture as '$tools_path/flow-capture -S5 -V$v -z
$comp -n $rotate -e $expire -N $nest -w $path/$folder 0/$from/$port'\n";
shell_exec($tools_path . "/flow-capture -S5 -V$v -z $comp -n $rotate -e $expire -N $nest -w $path/$folder 0/$from/$port ");
То
есть необходимо было поменять местами параметры. Чей косяк — наверное
все же создателя плагина. Потому что он по сути пользуется flow-tools, а
не наоборот, потому должен чтить синтаксис.
Еще следует отметить то, что этот скрипт вам не сможет остановить процессы, а значит и перезапустить.
Все это происходит из-за строчки:
shell_exec('killall -9 ' . $tools_path . '/flow-capture');
Опять же не соблюден синтаксис. Меняем на:
shell_exec('killall -9 flow-capture');
и все работает.
Так
же мне по глазам резануло то, что скрипт запуска, который я должен
запулить в автозапуск написан на PHP. Это хороший язык, но для
запускающего скрипта можно было выбрать другой. Стоит отметить, что в
README плагина так и написано «bug: flow-capture script incomplete», так
что будем считать, что пишу я это для истории и автор очень скоро
исправится.
2) В установке по умолчанию не работает правильно
генерация отчетов. Вероятней всего опять по той же причине, что и в
первом пункте — синтаксис.
Смотрим…
Пока я тренировался с
flow-tools, я имел большие проблемы с указанием интервалов во flow-cat.
Ну что ж, видимо судьба мне с этим разобраться. После долгих исканий
выяснилось, что правильный и нужный синтаксис такой:
flow-cat -t "mm/dd/YYYY hh:mm:ss" -T "mm/dd/YYYY HH:mm:ss" /var/db/flows/r1/2013/2013-01/* | flow-print -f5 > temp
Вооружившись
знаниями смотрим и видим, что отчет «изымается» в подключаемом модуле
"%cacti%/plugins/flowview/functions.php" в функции «function
createfilter(&$sessionid='')». Если вкраце, то там сперва
генерируется строка из трех китов «flow-cat», «flow-nfilter» (ухты,
оказывается два вида фильтрации есть!) и «flow-stat».
Я нашел (да и вы можете, если интересно) место, где сформированная строка выполняется:
/* Run the command */
$output = shell_exec($flow_command);
допишем чуть ниже:
echo ($output);
echo ($flow_command);
и
видим, что $flow_command сгенерирована правильно, а вот на выходе
ничего нет. После долгих раздумий и поисков пришел к выводу, что таки
апач, а точней пользователь www не может выполнить поставленную задачу.
Окунаемся в проблему с головой и видим, что есть намек на два пути развития событий:
Apache mod_suexec — модуль Apache, который запускает нужный виртуалхост под нужным пользователем. В общем намек на песочницу.
suPHP — порт для запуска PHP с намеком на ту же самую песочницу.
Я не буду вам рассказывать, какие дикие оргии были у меня с этими двумя «решениями». Опишу только в общих чертах:
Apache
mod_suexec не совсем песочница. Может он и запускает виртуалхост в ней,
но все остальные он запустит там же. Грубо говоря с этим решением можно
заточить ваш сервер под сугубо определенную задачу, но пилить вам его
придется долго и метод сбора и компиляции весьма не тривиален для
простого админа. И в итоге вы не сможете создать еще один виртуалхост с
другим пользователем, который сможет выполнять какие то другие задачи.
Дело в том, что mod_suexec пользуется едиными параметрами, такими как
например корневой каталог. В неумелых руках вы как минимум поимеете
брешь в безопасности. (хотя она и так у вас будет)
suPHP — этот порт
можно заточить. Ключевой момент — собрать в режиме paranoid, иначе вы не
сможете указать пользователя-владельца переменной suPHP_UserGroup. В
результате кроме гемора и радикулита вы получите более менее вменяемое
подобие виртуалхоста с некоторыми правами. Это опять же чревато
проблемами безопасности. Увы, но с этим мы будем сталкиваться все время.
Итак:Если
честно я уже отчаялся, когда разобрался со всей темой. Меня не радовал
выбор: Либо я лишаю свой сервер универсальности, либо ставлю suPHP, у
которого между прочим тоже свои проблемы. В любом случае гемор я уже
поимел, а это печально, товарищи.
И тут я вспомнил про sudo...# whereis sudo
sudo: /usr/local/bin/sudo
# cd /usr/local/bin/sudo
# make install clean
echo
"www имяхоста = (flowtools) NOPASSWD: EXEC: /bin/sh -c
/usr/local/bin/flow-cat -t * | /usr/local/bin/flow-nfilter -f * |
/usr/local/bin/flow-*" >> /usr/local/etc/sudoers
также добавляем строчку в файл %cacti%/plugins/flowview/functions.php:
/* Run the command */
$flow_command = "sudo -u flowtools sh -c '" . $flow_command . "'"; //<<<----- вот эта строчка
$output = shell_exec($flow_command);
Теперь
наш плагин будет работать. Этим строчкам я посвятил несколько часов
своей жизни. Буду рад если ваши часы будут сэкономлены.
Лично у меня есть много нареканий в области безопасности:
1)
Генерация отчета занимает много ресурсов, потому я советовал бы
прикрутить капчу. Иначе радостные админы запросто могут устроить DDOS.
2)
В версии Flowview 1.1 рисовалка графиков врет и показывает показания в
10 раз больше. Судя по всему проблема в скомпилированном .swf файле. В
любом случае неприятно и ненаглядно.
3) Я хоть и постарался
ограничить sudo, но все-же проблема безопасности остается. Кстати это
стало модно «сваливать» ответственность на службы безопасности. Я вас
уверяю, это все равно что понадеяться на русский авось. Они проходят
курсы, работают, изображают из себя строгих парней, но по сути мало что
могут сделать. Кроме того sudo они точно не учат.
4) Нужен напильник. make install clean все еще недопилено.
Wheathermap — для полноты картины.
Это
модуль для рисования красивых карт вашей сети. К сожалению во многих
местах не допилена и не снабжена комментариями. Но… Почему бы не
попробовать? Мы и так далеко зашли.
# fetch http://www.network-weathermap.com/files/php-weathermap-0.97a.zip
# unzip php-weathermap-0.97a.zip
# cp weathermap %cacti%/plugins
добавляем в %cacti%/include/config.php строчку $plugins[] = 'weathermap'; (в списке плагинов).
Входим в консоль управления cacti — plugins, видим наш плагин. Включаем — появляется вкладка.
При
переходе на вкладку сразу видим ошибку «Warning: Invalid argument
supplied for foreach() in
%cacti%/plugins/weathermap/weathermap-cacti-plugin.php on line 824»
При
детальном осмотре страницы так же видим ссылочку на редактор. Если
пытаемся ей воспользоваться, выдастся предупреждение, что необходимо
поправить параметр в файле "%cacti%/plugins/weathermap/editor.php"
$ENABLED=false; => $ENABLED=true;
Пробуем обновить страничку
редактора — похоже что то заработало. Сразу же видим предупреждение, что
папка с конфигами недоступна для записи.
# chown -R www:www %cacti%/plugins/weathermap/configs
Смотрим
дальше: после создания проекта появляется страничка с ошибкой
«Deprecated: Function split() is deprecated in
%cacti%/plugins/weathermap/editor.php on line 32». Googlим и видим, что
рекоммендуют заменить split на explode. Делаем — вроде продвигается
дело. Появилось поле для рисования. Но увы на этом дело не кончается.
Нарисовать кое-что мы можем, но как выяснится скорей всего плагин не
умеет правильно устанавливаться и нам придется допиливать его ручками.
Для начала из setup.php выколупываем SQL скрипт для создания таблиц базы данных:
CREATE TABLE weathermap_maps (
id int(11) NOT NULL auto_increment,
sortorder int(11) NOT NULL default 0,
group_id int(11) NOT NULL default 1,
active set('on','off') NOT NULL default 'on',
configfile text NOT NULL,
imagefile text NOT NULL,
htmlfile text NOT NULL,
titlecache text NOT NULL,
filehash varchar (40) NOT NULL default '',
warncount int(11) NOT NULL default 0,
config text NOT NULL default '',
thumb_width int(11) NOT NULL default 0,
thumb_height int(11) NOT NULL default 0,
schedule varchar(32) NOT NULL default '*',
archiving set('on','off') NOT NULL default 'off',
PRIMARY KEY (id)
) ENGINE=MyISAM;
CREATE TABLE weathermap_auth (
userid mediumint(9) NOT NULL default '0',
mapid int(11) NOT NULL default '0'
) ENGINE=MyISAM;
CREATE TABLE weathermap_groups (
`id` INT(11) NOT NULL auto_increment,
`name` VARCHAR( 128 ) NOT NULL default '',
`sortorder` INT(11) NOT NULL default 0,
PRIMARY KEY (id)
) ENGINE=MyISAM;
INSERT INTO weathermap_groups (id,name,sortorder) VALUES (1,'Weathermaps',1);
CREATE TABLE weathermap_settings (
id int(11) NOT NULL auto_increment,
mapid int(11) NOT NULL default '0',
groupid int(11) NOT NULL default '0',
optname varchar(128) NOT NULL default '',
optvalue varchar(128) NOT NULL default '',
PRIMARY KEY (id)
) ENGINE=MyISAM;
CREATE TABLE IF NOT EXISTS weathermap_data (
id int(11) NOT NULL auto_increment,
rrdfile varchar(255) NOT NULL,
data_source_name varchar(19) NOT NULL,
last_time int(11) NOT NULL,
last_value varchar(255) NOT NULL,
last_calc varchar(255) NOT NULL,
sequence int(11) NOT NULL,
local_data_id int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (id),
KEY rrdfile (rrdfile),
KEY local_data_id (local_data_id),
KEY data_source_name (data_source_name)
) ENGINE=MyISAM;
И сохраняем его например под именем weathermap.sql
Далее скармливаем его самому MySQLу:
# mysql -p cacti < weathermap.sql
После этого на консоли пропадают ошибки (не все, но самые нехорошие). К сожалению этого все еще мало.
Выдаем права:
# chown -R cacti:www %cacti%/plugins/weathermap/output
# chmod -R 777 %cacti%/plugins/weathermap/output
Вот
теперь мы можем слегка успокоиться. Все остальные ошибки вы найдете в
Console->System Utilities->View Cacti Log File. У вас будут
проблемы с легендой. советую вот такую:
KEYPOS DEFAULT 0 0 Traffic Load
KEYTEXTCOLOR 0 0 0
KEYOUTLINECOLOR 0 0 0
KEYBGCOLOR 255 255 255
BGCOLOR 255 255 255
TITLECOLOR 0 0 0
TIMECOLOR 0 0 0
SCALE DEFAULT 0 1 255 255 255
SCALE DEFAULT 1 25 220 255 255
SCALE DEFAULT 25 60 180 255 180
SCALE DEFAULT 60 75 240 240 0
SCALE DEFAULT 75 85 255 192 0
SCALE DEFAULT 85 105 255 0 0
Выводы:
Итак.
После наших изысканий стало ясно, что некий инструментарий мы имеем и в
принципе он работоспособен. Для этого нужно не много — большой
напильник, бубен и длинная-длинная борода.
У меня такое чувство, что
FlowViewer я тоже мог бы настроить. Работоспособность плагина cacti
(именно плагина) было чисто волевым решением. Может быть в дальнейшем я
допилю и выложу статью про FlowViewer.