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

[29 мая 2018 | 30 мая 2018 | 2 июля 2018]

Raspberry Pi в качестве NetFlow коллектора, размышления

После поверхностного анализа того, что пишется в базу NetFlow оказалось, что действительно можно сократить несколько полей, которые не являются информативными или дублируются.

О том как экспортировать данные из NetFlow в MySQL я уже писал вчера. Сегодня я хочу написать о том какие поля за, что отвечают и почему их можно игнорировать. И так, поехали. Напомню имеющуюся структуру.

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;

unix_secs — это время в формате Unix time. Считается количество секунд, которые прошли с полуночи 1 января 1970 года до настоящего времени. В каком-то роде с ним сложно оперировать так как оно наглядно не отображает время и по этому его желательно приводить к какому-то нормализованному виду. Тем более, что после обработки информация будет аккумулироваться за более крупные единицы времени, например, поминутно.

unix_nsecs и sysuptime можно упразднить, так как это разное время отсчёта и они абсолютно коррелируют с unix_secs.

exaddr — это адрес с которого пришли данные. Если сбор NetFlow происходит с одного физического роутера, то хранить информацию об источнике не имеет смысла. Как минимум информацию из разных источников можно хранить в разных таблицах.

dflows — это количество пакетов NetFlow. Для статистики потребления трафика данная характеристика не интересна.

dpkts — это количество пакетов в которых передавались данные. Если для статистики необходимо посчитать количество прошедших пакетов через интерфейс, то данное поле может пригодиться.

doctets — это для нас обязательное поле. В нём хранится количество байт переданных между компьютерами.

first и last — это время когда пришел пакет и когда завершилась передача. Эту информацию можно использовать для рассчета скорости работы интерфейса. Но это сильно специфично. По этому проще и эффективней будет использовать количество реально переданных байт в еденицу времени.

engine_type и engine_id — во всех пакетах сие поле принимает значение ноль. По этому нет смысла хранить заранее предсказуемую информацию.

srcaddr и dstaddr — это адрес источника и адрес приёмника трафика. Это тоже основные данные которые нам потребуются для работы нашей статистики.

nexthop — в этом поле пишется либо 0.0.0.0, либо IP-адрес получателя.

Raspberry Pi NetFlow.

Соответственно, если посмотреть на эту таблицу, то видно, что все нули появляются если принимающий IP-адрес равен IP-адресу шлюза. По этому данное поле предсказуемо. А значит его можно не учитывать.

input и output — это номера интерфейсов через которые проходит трафик. Входящий и исходящий интерфейсы. Это довольно интересная информация для статистики. Она не обязательная, но она позволит проанализировать пропускную способность интерфейса в комплексе. Так, что я бы оставил сбор подобной информации.

srcport и dstport — это исходящий и входящий порт соединения. По портам можно проанализировать тип проходящего трафика и приложение которое его использует. По этому их необходимо учитывать.

prot — протокол инкапсулируемый в IP. По нему можно узнать проходил UDP (17), TCP пакет (6) или ICMP (1).

tos — это Type of Service. Такой себе параметр, в разное время использовался под разные цели. Реального значения для сбора статистики не имеет.

tcp_flags — флаги в пакете, которые имеют значение при передаче пакетов и их приоритезации, но в сборе статистики не имеют какого-то значения.

src_mask и dst_mask — маска сети входящего и исходяжего потока. Параметр интересный, но проще строить анализ по своим, заранее заданным маскам подсетей.

В итоге, я решил использовать вот такую структуру для сбора сырых данных.

CREATE TABLE IF NOT EXISTS `full` (
`unix_secs` int(11) unsigned NOT NULL default '0',
`exaddr` varchar(45) collate utf8_unicode_ci NOT NULL default '0',
`dpkts` int(11) unsigned NOT NULL default '0',
`doctets` int(11) 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',
`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',
PRIMARY KEY (`unix_secs`,`doctets`,`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,EXADDR,DPKTS,DOCTETS,SRCADDR,DSTADDR,INPUT,OUTPUT,SRCPORT,DSTPORT,PROT -u "user:password:192.168.30.100:3306:flow-router:full"

Теперь осталось сформировать скрипты которые сделают выборку нужных данных и превратят их в удобочитаемые данные.

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


Комментарии

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


Этот сайт использует файлы cookies, чтобы упростить вашу навигацию по сайту, предлагать только интересную информацию и упростить заполнение форм. Я предполагаю, что, если вы продолжаете использовать мой сайт, то вы согласны с использованием мной файлов cookies. Вы в любое время можете удалить и/или запретить их использование изменив настройки своего интернет-браузера.

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

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