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-адрес получателя.
Соответственно, если посмотреть на эту таблицу, то видно, что все нули появляются если принимающий 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"
Теперь осталось сформировать скрипты которые сделают выборку нужных данных и превратят их в удобочитаемые данные.
Отредактировано:2020-09-07 06:51:22