Yellow leaf - статті - облік трафіку локальної мережі за допомогою fprobe і flow-tools

Дуже часто у системних адміністраторів виникає завдання обліку трафіку локальної мережі. Нижче буде показано як можна вирішити цю задачу використовуючи flow-сенсор fprobe і утиліти з пакета flow-tools.







Озвучимо початкові умови:

Насамперед встановимо fprobe на сервер:

На питання з якого інтерфейсу знімати трафік потрібно відповісти "eth1", а на питання куди відсилати логи - "192.168.2.10:9999". Порт можна вибрати довільно - головне щоб на сервері моніторингу він був вільний. Власне на цьому настройка інтернет-шлюзу закінчується, переходимо до сервера моніторингу.

Далі наводимо файл /etc/flow-tools/flow-capture.conf до виду:

Створимо директорію для логів:

І перезапустити flow-колектор:

Про всяк випадок переконуємося що колектор слухає потрібний порт:

У разі якщо все добре - висновок буде виглядати приблизно ось так:

Якщо ж колектор не запуститься - уважно перевірте його налаштування.

Через деякий час у вказаній директорії почнуть збиратися логи. Залишається тільки написати скрипти для генерації звітів на основі цих логів. Створимо директорію / root / flows, всі подальші дії ми будемо виробляти в ній:

Створимо файл flow.acl, в якому опишемо необхідні нам списки доступу, цей файл потім буде використовуватися утилітою flow-filter:

Так само непотрібно забувати що при вказівці мереж в цьому файлі потрібно використовувати інверсні маски. Якщо ви не дуже вільно працюєте з такими масками - скористайтеся IP-калькулятором.

Наступним кроком створимо файл report.conf, який буде використовуватися утилітою flow-report:

На цьому написання конфігураційних файлів закінчується і можна переходити до написання скриптів. Спочатку створимо скрипт для генерації щодобових звітів і збережемо під ім'ям stat_daily.sh. Ось його лістинг:

Робимо скрипт виконуваним і додаємо його запуск в cron:

Після цього кожен день в директорії / var / www / flow-reports / daily будуть складатися звіти про трафік за попередній день. Звіт буде виглядати приблизно ось так:

я наводив вище як я пхаю.
повторюся ще раз ..
тож дано що
1. flow у нас пишеться в / var / log / flow /
2. Фільтри лежать в /home/log/filter.acl
3. База в м'язі виду

CREATE TABLE IF NOT EXISTS `raw` (
`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',
`Flag` tinyint (1) unsigned NOT NULL default '0',
PRIMARY KEY ( `unix_secs`,` srcaddr`, `dstaddr`,` srcport`, `dstport`)
) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

далі пишемо шеловскій файл і пхає його в крон, в файлі вказуємо яке у файлів (від поточного мінус 30 хвилин в моєму прикладі) за часом відбираємо.
в базу пхається саме / usr / bin / flow-export

for i in $ (/ usr / bin / find / var / log / flow / -name ft * -mmin -30); do / usr / bin / flow-cat $ i | / Usr / bin / flow-nfilter -Foutputtraff -f /home/log/filter.acl | / Usr / bin / flow-export -f3 -mUNIX_SECS, DOCTETS, FIRST, LAST, SRCADDR, DSTADDR, SRCPORT, DSTPORT, PROT -u "user: password: host: port: base: table"; done

що відбувається, крон можна запускати хоч 1 раз в хвилину, дублі не потрапляють, тому що кожен запис виходить унікальна.
а інтерфейси я розрулювати
по ключовому полю input ()
там 1 і 2-й інтерфейси. я думаю що дослідним шляхом можна подивитися який інтерфейс. )

Так якщо кидати в шеловском файлі НЕ через цикл, то в базу лізуть ліві значення (типу timestamp 00000000), навіть не знаю чому, на початку була така конструкція find. flow-cat <> /;
потім помітив і переписав через цикл, поки все в нормі!

Зрозуміло :) Буду знати :)

Відповідь ось у цьому рядку:

Воно у тебе куди логи валить? Судячи з тексту помилки логів у тебе немає, там де скрипт очікує їх побачити

Я наводив приклад для своїх каталогів, відповідно, якщо ви кладете логи в інший каталог, то треба поправити. )

> Для доступу до звітів можна підняти веб-сервер
Підкажіть який веб-сервер найзручніше налаштувати для роботи з логами flow?


Підкажіть який веб-сервер найзручніше налаштувати для роботи з логами flow?

Думаю що і тут його буде цілком достатньо.

Виник зараз тільки 1 питання: схоже, що статистика вважається тільки по вхідному трафіку. Чи є можливість вважати так само і вихідний без особливих танців з бубнами?

в моєму пості все ж є. ви просто не уважно дивіться! )))

ось це і пхає в базу
for i in $ (/ usr / bin / find / var / log / flow / -name ft * -mmin -30); do / usr / bin / flow-cat $ i | / Usr / bin / flow-nfilter -Foutputtraff -f /home/log/filter.acl | / Usr / bin / flow-export -f3 -mUNIX_SECS, DOCTETS, FIRST, LAST, SRCADDR, DSTADDR, SRCPORT, DSTPORT, PROT -u "user: password: host: port: base: table"; done


з приводу простої веб морди сенсу немає. имхо. або вже писати все типу самопісний білінг або нафіг треба. ідеї звичайно є з цим. але часу катастрофічно не вистачає)

Хе. Так у тебе все клієнти до одного і того ж лінку в результаті підключені? Тоді просто впиши їх в ACL для flow-filter. За ідеєю допоможе


Чесно кажучи не знаю. Дуже хочеться подивитися на те що там вийшло в репорт. Не впевнений що за таким балці ті ж sarg або webalizer щось виразне зможуть згенерувати. Вобщем треба подивитися :)

3 Давно вже читаю, я тобі як то яндекс.моней кинув, давно це було. Величезне спасибі що відповів.


Спасибо :) А відповідати я намагаюся всім хто цікаві і адекватні питання задає. Сам з цього для себе користь витягаю у вигляді нових знань, отриманих в результаті обговорень.

Дуже зручна на мій погляд, показує хто куди скільки.
Від fprobe потрібно передати в скрипті такі параметри як час / обсяг / ip клієнта / ip ресурсу.

У тебе є skype.

Вдумливе читання man-сторінки flow-report допоможе тобі. Просто треба задати правильний формат репорт.