Магазин / аукцион / FPR / donate / услуги / RSS / распечатать / вход 
Мой мир
Вконтакте
Одноклассники
Google+

[23 мая 2018 | 29 мая 2018 | 30 мая 2018]

Raspberry Pi в качестве NetFlow коллектора

Еще один пост про моё занудство с NetFlow. Появилась задача собирать информацию о трафике с удалённой точки. Доступ на удалённой точке осуществляется через спутник, по этому траффик там по цене золота. А так же там много молодых и горячих ребят, которым очень скучно на вахте и они хотят иметь доступ в социальные сети, смотреть фильмы и всеми возможными способами получают доступ в интернет. Как минимум главная роль в данном случае за человеческим фактором. Начиная от несанкционированного подключения кабелем ноутбука в прорабке и заканчивая выклянчиванием пароля от WiFi у руководства.

Так как подключение к сети осуществляется через роутер Cisco, у нас имеется хороший механизм подсчёта трафика, называется он NetFlow. Для минимальной статистики можно сделать подсчёт с помощью top-talkers. В данном случае необходимо хранить данные за продолжительный срок жизни оборудования, так как во время разборок люди могли затребовать время когда закончился траффик на данной точке. Как минимум нужно хранить информацию за три месяца. Для продолжительного хранения и анализа данных желательно использовать компьютер с установленным коллектором. Например, можно использовать зарекомендовавший себя NetFlow Analyzer.

Но, главная особенность удалённых точек заключается в том, что на этих местах проблематично получить стабильное электропитание. Так же невозможно соблюсти нормативы по температурно-влажностному режиму. По этому поставить серьёзный сервер на данных точках невозможно. Даже простой стационарный компьютер не выживает в столь суровых условиях и часто выходит из строя. Тут мало помогают ИБП, так как они даже не успевают восполнить потерю заряда. Анализ трафика на месте производить не требуется, по этому задача упрощается тем, что достаточно собирать и хранить NetFlow, а в качестве хранилища и коллектора может выступать простейший одноплатник типа Raspberry Pi, достаточно даже второй версии.

Включить NetFlow на Cisco

Приступим к настройке оборудования. Для начала включим сбор статистики и её передачу на коллектор.

configure terminal
ip flow-export version 5
ip flow-export destination 192.168.30.50 9996
ip flow-export source FastEthernet0/1
interface FastEthernet0/1
 ip flow ingress 
 ip flow egress 
 end
write

Здесь необходимо указать адрес коллектора, порт и включить на необходимом порту сбор статистики. К выбору порта необходимо отнестись серьёзно. Если включить несколько портов которые передают между собой траффик, то он задублируется. В идеале надо мониторить порт который подключен в локальную сеть. Тогда даже при использовании нескольких провайдеров вы сможете корректно считать потребленный траффик. И второе. Мы будем использовать flow-tools который поддерживает работу NetFlow пятой версии. Если вы будете отправлять информацию с использованием девятой версии, то коллектор просто не поймёт и отбросит непонятные данные.

Установка flow-tools на Raspberry Pi

На Raspbian — это делается довольно легко. Запускаем установку и соглашаемся с тем, что будет скачано сколько-то там трафика.

apt-get install flow-tools

Далее создадим каталог в который будет складироваться информация о трафике. Тут тоже надо немного подумать. Так как выключение электричества непредсказуемы, то пользуемся правилом, чем чаще сохраняем, тем больше шансов, что все данные будут зафиксированы. Редактируем файл настроек.

sudo nano /etc/flow-tools/flow-capture.conf

Комментируем все строчки и одну приводим к такому виду:

-w /var/log/flow/router -n 275 0/192.168.30.1/9996

Что говорит эта настройка. Мы будем складировать данные в каталог /var/log/flow/router. Предварительно не забудьте его создать. Далее: -n 275 означает, что сутки будут разрезаны на 275 файлов, то есть будут записываться каждые пять минут. Следом идёт информация с какого адреса будет приниматься NetFlow и какой порт следует прослушивать. Можно создать несколько правил и логировать информацию от разных устройств в разные каталоги (для удобства разделения). Но не забывайте, что для каждой такой записи необходимо использовать свой уникальный порт.

Перезапускаем сервис.

service flow-capture restart

Если всё настроено правильно, то в каталоге /var/log/flow/router будут созданы каталоги и в них начнёт копиться информация. Через определённое время в каталоге с логами будет наблюдаться вот такая ситуация.

Raspberry Pi NetFlow.

В общем этого мне было бы достаточно. Так как потом в любое время можно было бы сформировать результат за любой день или любой месяц. Для этого можно воспользоваться программами из набора flow-tools. Если интересно я могу об этом рассказать. Но меня интересует возможность выгрузки результатов в базу данных для последующей обработки.

Экспорт NetFlow в MySQL

Для экспорта в базу данных MySQL, необходимо создать таблицу. Я приведу модель таблицы для полной выгрузки всех сырых данных которые копятся в NetFlow коллекторе.

CREATE TABLE `full` (
  `unix_secs` int(11) unsigned NOT NULL default '0',
  `unix_nsecs` int(11) unsigned NOT NULL default '0',
  `sysuptime` int(11) unsigned NOT NULL default '0',
  `exaddr` varchar(45) NOT NULL default '0',
  `dflows` int(11) unsigned NOT NULL default '0',
  `dpkts` int(11) unsigned NOT NULL default '0',
  `doctets` int(11) unsigned NOT NULL default '0',
  `first` int(11) unsigned NOT NULL default '0',
  `last` int(11) unsigned NOT NULL default '0',
  `engine_type` tinyint(3) unsigned NOT NULL default '0',
  `engine_id` tinyint(3) unsigned NOT NULL default '0',
  `srcaddr` varchar(45) NOT NULL default '0',
  `dstaddr` varchar(45) NOT NULL default '0',
  `nexthop` varchar(45) NOT NULL default '0',
  `input` smallint(5) unsigned NOT NULL default '0',
  `output` smallint(5) unsigned NOT NULL default '0',
  `srcport` smallint(5) unsigned NOT NULL default '0',
  `dstport` smallint(5) unsigned NOT NULL default '0',
  `prot` tinyint(3) unsigned NOT NULL default '0',
  `tos` tinyint(3) unsigned NOT NULL default '0',
  `tcp_flags` tinyint(3) unsigned NOT NULL default '0',
  `src_mask` tinyint(3) unsigned NOT NULL default '0',
  `dst_mask` tinyint(3) unsigned NOT NULL default '0'
) TYPE=MyISAM;

Есть расширенный вариант не допускающий дублирования кортежей в таблице. Уникальность кортежей строится на том, что не записываются данные поступившие в одну и ту же секунду, с одинаковыми адресами источника и приёмника, а так же с одинаковыми портами источника и приёмника.

CREATE TABLE IF NOT EXISTS `full` (
`unix_secs` int(11) unsigned NOT NULL default '0',
`unix_nsecs` int(11) unsigned NOT NULL default '0',
`sysuptime` int(11) unsigned NOT NULL default '0',
`exaddr` varchar(45) collate utf8_unicode_ci NOT NULL default '0',
`dflows` int(11) unsigned NOT NULL default '0',
`dpkts` int(11) unsigned NOT NULL default '0',
`doctets` int(11) unsigned NOT NULL default '0',
`first` int(11) unsigned NOT NULL default '0',
`last` int(11) unsigned NOT NULL default '0',
`engine_type` tinyint(3) unsigned NOT NULL default '0',
`engine_id` tinyint(3) unsigned NOT NULL default '0',
`srcaddr` varchar(45) collate utf8_unicode_ci NOT NULL default '0',
`dstaddr` varchar(45) collate utf8_unicode_ci NOT NULL default '0',
`nexthop` varchar(45) collate utf8_unicode_ci NOT NULL default '0',
`input` smallint(5) unsigned NOT NULL default '0',
`output` smallint(5) unsigned NOT NULL default '0',
`srcport` smallint(5) unsigned NOT NULL default '0',
`dstport` smallint(5) unsigned NOT NULL default '0',
`prot` tinyint(3) unsigned NOT NULL default '0',
`tos` tinyint(3) unsigned NOT NULL default '0',
`tcp_flags` tinyint(3) unsigned NOT NULL default '0',
`src_mask` tinyint(3) unsigned NOT NULL default '0',
`dst_mask` tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (`unix_secs`,`srcaddr`,`dstaddr`,`srcport`,`dstport`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Для того, чтобы записать данные в таблицу необходимо дать команду приблизительно следующего вида:

flow-cat /var/log/flow/router/2018/2018-05/2018-05-29|flow-export -f3 -mUNIX_SECS,UNIX_NSECS,SYSUPTIME,EXADDR,DFLOWS,DPKTS,DOCTETS,FIRST,LAST,ENGINE_TYPE,ENGINE_ID,SRCADDR,DSTADDR,NEXTHOP,INPUT,OUTPUT,SRCPORT,DSTPORT,PROT,TOS,TCP_FLAGS,SRC_MASK,DST_MASK -u "user:password:192.168.30.100:3306:flow-router:full"

Команда flow-cat собирает все файлы с FlowNet в указанном каталоге и передает на конвеер. А flow-export экспортирует в базу данных flow-router, в таблицу flow-full, на сервер 192.168.30.100, с именем пользователя user и паролем password.

Во время очередного сеанса можно передать информацию за нужный день, месяц или за нужное количество часов.

В принципе нет необходимости выгружать все данные. Для средней статистики достаточно выгружать небольшой объём данных:

Имея подобные данные можно писать свою программу для формирования статистики. Остальные поля либо дублируются, либо мало информативны. Конечно, интересно было бы поднять на Raspberry Pi не только коллектор, но и анализатор. Но для этого потребуется поднимать базу данных прямо на этом одноплатнике и его загрузка может не позволить эффективно выполнять роль коллектора.

• Перейти в архив


Комментарии

Включите JavaScript для комментирования.


Сообщайте нам о замеченных ошибках на: web@orcinus.ru. Все пожелания и советы будут учтены при дальнейшем проектировании сайта... Мы готовы сотрудничать со всеми желающими. Мнение авторов может не совпадать с точкой зрения редакции сайта www.orcinus.ru. В некоторых случаях, мнение автора может не совпадать с мнением автора! Phone: +7-902-924-70-49.

Рейтинг@Mail.ru LiveInternet Rambler's Top100 Яндекс.Метрика