Протокол NetFlow – поток пакетов – на контроль

О системах подсчета трафика написано много. Но cnupm, trafd и прочие «считалки» – это сугубо утилитарные приложения, подходящие лишь для конкретных случаев. А что если подсчет трафика и представление его в красивой форме (например, на web-странице) не самоцель? Что если надо просто иметь возможность контролировать трафик, да еще приходящий с нескольких маршрутизаторов? В этом нам поможет протокол NetFlow.

NetFlow– это проприетарный, но открытый протокол, изначально разработанный компанией Cisco для своего железа с целью централизованного сбора информации о сетевом трафике. Однако технология получилась настолько удачной, что ее применение можно встретить где угодно: начиная от железок других производителей и заканчивая программными маршрутизаторами под *nix. Архитектура NetFlow состоит из трех основных компонентов:

  1. сенсор;
  2. коллектор;
  3. обработчик данных, визуализатор.

Сенсоры устанавливаются на всех хостах (роутерах) сети, через которые проходит исследуемый трафик. Сенсоры собирают информацию о потоках трафика (flows) и отправляют ее по протоколу UDP на централизованное место сбора – коллектор. Коллектор сохраняет данные в базе в бинарном netflow-формате. Далее эти данные могут быть прочитаны и представлены в читаемом виде специальными утилитами-обработчиками, сохранены в реляционной базе данных, визуализированы в виде графиков и отчетов на web-странице и т.п.
Информация о потоке трафика (flow) – это информация об одном сеансе сетевого соединения, содержащая сведения об IP-адресах участвующих в сетевом взаимодействии машин, их портах (источника и получателя) и типе IP-протокола. Таким образом, роутер, через который проходят потоки сетевых соединений, передает информацию об этих соединениях (flows) на коллектор.

Запись о каждом сетевом соединении (flow record) содержит такую информацию, как время начала и окончания соединения, количество переданных байт и пакетов, IP-адреса источника и получателя, порты и тип IP-протокола. Этими записями удобно манипулировать: подсчитывать трафик, генерировать отчеты и т.п.

NetFlow? Да!

Итак, мы будем считать трафик при помощи NetFlow. Точнее, не считать, а собирать информацию, ведь NetFlow именно собирает информацию о трафике, которую в дальнейшем можно обрабатывать. Подсчет трафика – это всего лишь одна прикладная задача. Так что будем строить систему контроля или учета трафика. Имея такую систему, администратор всегда может дать оперативный ответ на вопросы вроде: «Сколько трафика потребил каждый хост за произвольный промежуток времени?», «С какими хостами был проведен самый интенсивный обмен трафиком?», «Кто сегодня превысил лимит в 100 Мб входящего трафика?», «Кто, когда и откуда вытянул 20 гигов, за которые вышестоящий провайдер выставил нам счет?» и т.п.
Сначала мы настроим сенсоры на машинах в сети, затем сконфигурируем коллектор, в который сенсоры будут отправлять информацию о трафике. Потом рассмотрим примеры того, как с помощью NetFlow-данных, специальных утилит для работы с ними и базовых знаний в области shell-скриптинга ответить на вопросы типа упомянутых выше. Задача эффектной визуализации полученных данных выходит за рамки этой статьи и будет решена в следующих номерах журнала.
Существует множество программных реализаций компонентов NetFlow под *nix-подобные системы. Мы остановимся на следующих:

  • softflowd(www.mindrot.org/projects/softflowd) в качестве NetFlow-сенсора;
  • flow-tools(www.splintered.net/sw/flow-tools) в качестве утилит для сбора информации о трафике и работы с ней.

Выбор этих программ обусловлен их популярностью и возможностями работы под множеством вариаций *nix-систем. Существуют также программы, заточенные под какую-либо конкретную операционку. Например, в случае OpenBSD в качестве сенсора рекомендуется использовать pfflowd(www.mindrot.org/projects/pfflowd), работающий в связке с пакетным фильтром PF. Тот же разработчик предлагает flowd(www.mindrot.org/projects/flowd) – маленький, быстрый и безопасный NetFlow-коллектор, к которому прилагается набор утилит flowrrd для отображений NetFlow-данных в rrd-базе (для дальнейшей обработки их с помощью RRDtool).

В качестве коллектора будем использовать машину под управлением FreeBSD 6. Сенсор поставим на шлюз под управлением OpenBSD 4.1.

Установка и настройка

Установку flow-tools на FreeBSD будем производить штатно, из портов:

В результате будет установлена масса утилит для работы с NetFlow. Подробную информацию о том, что же поставлено из порта, можно получить, например, с помощью команды:

Сейчас нас интересует только одна программа из набора – flow-capture. Это и есть тот самый коллектор, который собирает информацию с сенсоров. Аргументы запуска следующие:

Здесь /var/log/netflows – каталог, в котором собираются NetFlow-данные; -N 3 – уровень вложенности каталогов в этой папке. Данные пишутся в формате YYYY/YYYY-MM/YYYY-MM-DD/flow-file. Запись «192.168.76.146/192.168.76.147/8818» имеет форму «localip/remoteip/port», где localip – локальный адрес коллектора, на котором flow-capture слушать входящие соединения от сенсоров; remoteip – адрес сенсора (при такой настройке flow-capture будет принимать соединения только с определенного хоста); port – порт, на котором слушает коллектор. Если сенсоров несколько, можно выставить remoteip в 0 (принимать соединения со всех хостов), а доступ разграничить пакетным фильтром.

В результате нашей настройки коллектор будет слушать на хосту 192.168.76.146 (порт 8818/udp) и принимать соединения с коллектора на машине 192.168.76.147. Осталось только прописать коллектор в автозапуск. К сожалению, порт flow-tools не содержит rc-скрипт для запуска коллектора в FreeBSD-стиле, поэтому мы сами создадим flowd.sh следующего содержания:

Не забываем добавить запись «flowd_enable=”YES”» в /etc/rc.conf.
Благодаря изумительным pkg_tools установка сенсора на OpenBSD необременительна. При прописанной PKG_PATH набираем:

И дело в шляпе. Прописать демон в автостарт «по-опенковскому» также не представляет проблем. В /etc/rc.local добавляем:

Здесьfxp0- интерфейс, через который проходит трафик и который будет слушать сенсор; 192.168.76.146:8818 – хост и порт коллектора, на который сенсор будет отправлять данные о потоках трафика.

Управляем!

Если все запущено и работает корректно, то на сенсоре мы увидим примерно следующую информацию по текущим netflow-потокам:

А в каталоге /var/log/netflows должны появиться собранные данные:

Теперь начинается самое интересное – то, ради чего мы все затеяли. Вооружившись утилитами из набора flow-tools и минимальными знаниями shell-скриптинга, мы будем манипулировать информацией о трафике, ставя ее под всесторонний учет!

Нам понадобятся следующие утилиты:

  • flow-cat для конкатенации нескольких netflow-файлов;
  • flow-stat для генерации отчетов по netflow-файлам;
  • flow-print для вывода информации о netflow-потоках в текстовом виде.

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

  • Уведомление администратора о превышении какой-либо машиной дневного лимита трафика в N Мб с возможностью блокировки этой машины пакетным фильтром «до выяснения обстоятельств».
  • Уведомление администратора о превышении каким-либо сервером месячного лимита трафика в N Гб. Информативно и полезно для самоконтроля, например, в ситуации, когда в конторе имеются серверы, а оплата интернета производится по трафику с оплаченным лимитом.
  • Детальная, отсортированная netflow-информация по трафику за любой день, месяц, год. Удобна для выяснения вопросов вроде: «А кто и откуда у нас пятого числа качнул 800 мегабайт?».
  • Архивация старых netflow-данных (месячной давности).

Пример обработки записей с помощью flow-cat и flow-stat:

Результатом будет таблица из пяти колонок: src ip, dst ip, number of flows, number of bytes, number of packets. Выяснить, кто же превысил лимит, можно, например, так:

В этом случае пользователю toxa высылается уведомление о том, что определенная машина выкачала более 100 Мб трафика, и ее адрес заносится в таблицу /etc/pf.blockedusers. В конфиге пакетного фильтра /etc/pf.conf имеем:

Разумеется, все примеры разумно разнести по соответствующим скриптам и выполнять их с помощью cron(8) с определенной периодичностью.

INFO

Отмечу три интересные программы в наборе flow-tools(1):

  • flow-dscan– анализирует netflow-потоки на предмет попыток сканирования портов и наличия некорректно сформированных пакетов;
  • flow-gen– генерирует тестовые netflow-потоки, полезно для отладки;
  • flow-rptfmt– позволяет выводить netflow-данные в HTML.
Рейтинг материала
[Голосов: 0 Рейтинг: 0]
25 декабря 2015, 14:05

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *