From: Vlad Halilow <vlad@ccs.ru>
Subject: [CISCO] Настройка Netfltools для учёта трафика посредством netflow
Настройка Netfltools для учёта трафика посредством netflow
----------------------------------------------------------
Со времени написания текста по настройке NeTraMet прошло уже довольно много времени. Письма
на эту тему, поступают не только из матушки Руси, но и из-за бугра. Казалось-бы чего
еще может непонятного, постарался расписать всё шаги от и до - но вопросы всё равно возникают.
Поэтому сегодня в нашем шоу новый гость. [1] netfltools обойдённая вниманием в интернете. Линк
на неё есть только в списке рассылки inet-admins, более я его нигде не видел. А между тем, для
тех кому трудно разобраться с нетраметом - программа настоящая находка. Из ТТХ отмечу малый расход
ресурсов, в т.ч. памяти выделяемой по мере необходимости. Широкие возможности конфигурирования.
Возможно меньше чем в нетрамете, но настройка куда проще, и что немаловажно для
начинающих - результат сразу, что называется на лицо. Текст не претендует на полноту описания, но
даст возможность почуствовать свою силу, и не даст сбежать назад к accounting'у :)
Итак, вы скопировали себе дистрибутив. После компиляции, вы получаете три основных бинарника:
netfld - сам коллектор; netflcon - консоль управления; netflget - дампер базы flows.
первым делом необходимо сообразить конфиг для коллектора:
-----netfld.cfg-----
connect_port = 5000 // порт управления
receive_buffer_size = 131072
data_queue_size = 100000
log_file = netflow.log
autosave_interval = 3600 //периодичность в секундах, с которой демон будет дампить конфигурацию
on_add_filter = /home/vlad/netflow/mysql_add_filter //программы, запускаемые на изменение конфигурации
on_modify_filter = /home/vlad/netflow/mysql_modify_filter
on_delete_filter = /home/vlad/netflow/mysql_delete_filter
on_add_description = /home/vlad/netflow/mysql_add_description
on_modify_description = /home/vlad/netflow/mysql_modify_description
on_delete_description = /home/vlad/netflow/mysql_delete_description
router one = x.x.x.x 9997 //адреса роутров, и порты на которые они будут отправлять свои flows
router two = y.y.y.y 9996
----------------------
Вот и всё. Затем запускаем демон:
host#netfld -config netfld.cfg
Рулить демоном, можно и через конфигурационный файл, но проще и приятней делать это через netflcon.
host#netflcon -host host -port 5000
Теперь можно приступить к конфигурации. Все директивы конфигурирования рассмотрены в документации,
я лишь покажу их использование на практике. Есть три основных обьекта. Это фильтры (filter),
алиас (alias) и слайс (slice). Фильтр, это некоторое выражение. например:
netflcon>add filter test router == x.x.x.x
Задаёт условие, под которое попадают только flows (т.е. информация о трафике) пришедшие с роутера
one. Add - комманда на добавление, filter - что добавляем, test - имя, всё что дальше - условие.
На этот фильтр можно повесить еще один фильтр (сабфильтр), след. образом:
netflcon>add filter test:ip_in dst_addr in 192.168.0.0/20
После двоеточия, идёт имя подфильтра а затем условие. Знак равно '==' можно применять только при
строгом соответствии, например src_addr == 192.168.1.1 . если нам необходимо, чтобы под условие
попадал блок адресов, то надо использовать тэг 'in'. Что бы можно было увидеть величину трафика,
попадающего под фильтр, необходимо добавить на него счётчик:
netflcon>add collector test:ip_in
И теперь можно воспользоватся коммандой show, что-бы посмотреть как там у нас дела.
netflcon>show collector test:ip_in
выдаст что-то вроде следующего:
packets : octets : pkts/s : octets/s : total time : nflows
1323 : 698858 : 661.50 : 349429.00 : 1486 : 93
Т.е. искомые объём трафика, ушедшего на наш блок адресов. Если у нас одна и та-же величина, или
условие используется в нескольких фильтрах, то в случае изменения например нашей сетки, придётся
переписывать несколько фильтров. Дабы избежать такого расклада, можно воспользоватся алиасами.
Наш пример можно переписать следующим образом:
netflcon>add alias home_net 192.168.0.0/20 //home_net имя фильтра.
netflcon>add filter test router == x.x.x.x
netflcon>add filter test:ip_in dst_addr in [home_net]
могу поспорить, что после комманды add filter test router == x.x.x.x консоль выругалась, что
такой фильтр уже есть ;) если вы его не удаляли коммандой delete (delete filter test) то в
дальнейших изысканиях можете её опустить. впрочем при разборе каждого примера, лучше удаляйте
ваши изыски что бы не запутаться. список всех фильтров можно получить коммандой list filters,
аналогично и с алиасами list aliases. кстате содержание фильтра смотрится коммандой show (show
filter test), для алиасов аналогично.
при удалении фильтра верхнего уровня, автоматически убиваются все навешеные сабфильтры и
коллекторы к ним привязанные.
Возвращаясь к примеру, если слово заключено в квадратные скобки, то на это место
подставляется алиас, и фильтр работает в том-же режиме. в качестве алиасов, безусловно можно
задавать произвольные, синтаксически верные выражения, например:
netflcon>add alias home_net_in dst_addr in 192.168.0.0/20 || dst_addr in 192.169.0.0/20
Двойная вертикальная черта, это условие 'ИЛИ', тогда последняя комманда урежется до:
netflcon>add filter test:ip_in [home_net_in]
программа поддерживает все атрибуты, какие только могут понадобится, т.е. только адресами дело
не ограничивается. Например посчитаем трафик с интерфейса с индекcом 1 на интерфейс с индексом 2:
необходимо помнить, что флов даёт информацию о трафике в одну сторону(это верно и для адресов,
и для автономок итд), т.е. мы посчитали только то, что ушло с интерфейса 1 на интерфейс 2.
Для учёта обратного трафика, сделаем следующее:
netflcon>add filter testu src_intf == 2 && dst_intf == 1
netflcon>add collector testu
Теперь на фильтре test:in оседает трафик в одну сторону, а на testu в другую.
переходя к слайсам, представим ситацию, что у нас 20 интерфейсов, и нужно считать трафик в обе
стороны по всем. количество фильтров немалое. и дело это неблагодарное. нас спасут слайсы.
Слайс - это атрибут, по которому трафик будет разбиватся на отдельные элементы. если например
в качестве слайса поставить ip адрес, то трафик проходящий на эту сеть, будет биться по отдельным
адресам. Т.е. полностью выглядеть будет так:
netflcon>add alias home_net 192.168.0.0/20
netflcon>add filter test router == x.x.x.x
netflcon>add filter test:ip_in dst_addr in [home_net]
netflcon>add slices1 test:ip dst_addr
Теперь если мы дадим комманду:
netflcon>show slices1 test:ip dst_addr
Получим раскладку трафика в сеть, по всем входящим в неё адресам.
можно применить тэг slices2, в этом случае можно задавать в качестве разбиваемых параметров уже
два параметра:
netflcon>add filter test router == x.x.x.x
netflcon>add filter test:ip_in dst_addr in 192.168.0.0/20
netflcon>add filter test:ip_ou src_addr in 192.168.0.0/20
netflcon>add slices2 test:ip_in dst_addr src_addr
netflcon>add slices2 test:ip_ou src_addr dst_addr
получим таблицу, где в качестве одного параметра будут адреса нашей сети, а в качестве другого -
адреса с которыми шёл обмен трафиком. ну или как вариант, можно сделать следующий финт ушами:
netflcon>add slices2 test:ip_in dst_addr src_port
netflcon>add slices2 test:ip_ou src_addr dst_addr
тогда просмотр слайсов, даст раскладку о том, на какие порты с наших адресов ходил трафик.
помимо комманд add и delete, можно модифицировать уже существующие фильтры (и алиасы), например
что-бы не терять значения счётчика коллектора. синтаксис аналогичный добавлению:
netflcon>add filter test router == x.x.x.x
netflcon>modify filter test router == y.y.y.y
заменит в фильтре test адрес роутера с x.x.x.x на y.y.y.y .
базовое представление о управлении мы получили. теперь рассмотрим методы сьёма информации.
с консоли это комманды show и get. show мы уже видели в работе, get отличается только тем, что
после снятия нформации счётчики обнуляются. зачем, обьяснять думаю не надо.
для получения дампов прокачанного трафика, служит утилита netflget.
конфиг для неё, применительно к примеру со slices2 будет выглядеть так:
----------netflget.cfg--------------
host 217.76.32.82 //адрес хоста с коллектором
port 5000 // порт управления
get test:ip_in dst_addr src_port /комманда на снятие информации
get test:ip_ou src_addr dst_port
------------------------------------
запуск программы
host#netflget -config netflget.cfg выдаст на stdout дамп текущего состояния слайсов.
обратите внимание, что синтаксис комманды get (show) для netflget отличается от консольной.
не надо указывать обьект (slice1;slices2;collector), только имена.
Далее следует письмо от разработчика, которое другими словами описывает основы конфигурирования. Возможно
оно кому-то будет полезно.
-------------------------------------
Если, скажем, юзверя крупные, то на них можно и фильтры поставить - у нас
в дереве порядка 1000 фильтров и проблем нет. Только делать лучше так
Таким образом фильтры организуются в виде дерева: скажем, фильтр
верхнего уровня отсекает трафик, относящийся к данному юзеру, а подфильтры
уже считают его трафик на соответствующих интерфейсах.
Другой вариант - использовать slices. Делается, например, так:
после этого если сказать, скажем,
show slices1 dst_addr
то на экран вылезет раскладка трафика попадающего в фильтр
src_1 по destination IP-адресам. Вообще, установка slices
на фильтр позволяет получить раскладку трафика по произвольному
параметру (или двум параметрам). Т.е. можно получить раскладку
по адресам, портам, ASкам и т.д. На каждый фильтр может быть навешено
произвольное количество slices по разным параметрам.
-------------------------------
Вот вобщем-то и всё. Хотелось-бы выразить благодарность Andrey Slepuhin, за написание
столь полезной программы и оказанную помощь в настройке, а так же Andy Igoshin за линк на неё,
и ответы на мои вопросы.