Биллинговая система NoDeny. Настройка учета трафика с netflow-коллекторов


Для сбора статистики по netflow необходимо 2 узла: сенсор и коллектор. Сенсор собирает статистику трафика и отправляет в коллектор. Коллекторы netflow устанавливаются не на удаленных маршрутизаторах (как в ipcad), а на сервере с ядром NoDeny. Таким образом, вся статистика сливается на центральный сервер. Это имеет и преимущества и недостатки - например, коллектор ipcad агрегирует информацию перед тем как она будет забрана с удаленного маршрутизатора.

К преимуществам netflow также относится то, что многие устройства поддерживают экспорт статистики по этой технологии, в отличие от ipcad, который на данный момент распростаняется только в unix-системах, т.е его использование ограничено «софтовыми» роутерами.

Начнем установку с пакета flow-tools, в состав которого входит netflow-коллектор flow-capture. На сервере с ядром NoDeny:

Команда bash
cd /usr/ports/net-mgmt/flow-tools && make install clean

Хотя в /usr/local/etc/rc.d/ будет установлен скрипт для запуска flow-capture, тем не менее, мы запустим с командной строки:

Команда bash
/usr/local/bin/flow-capture -R /usr/local/nodeny/netflow_8888.pl \
    -p /var/run/flow-capture/flow-capture.pid -w /var/db/flows \
    -n1 -N0 0.0.0.0/0.0.0.0/8888

Здесь:


Заливаем на сервер с ядром файл netflow.pl в папку /usr/local/nodeny.

Команда bash
chmod 700 /usr/local/nodeny/netflow.pl

Внимание! Не переименовывайте файл в netflow_8888.pl - он создается автоматически.


Теперь необходимо настроить экспорт netflow-статистики от сенсора к коллектору. Здесь NoDeny предусматривает 2 различных варианта:

1) «Классический» - на маршрутизатор устанавливается netflow-сенсор, который регистрирует входящий трафик со всех интерфейсов. Обратите внимание, важно: входящий трафик со всех интерфейсов.

2) Вариант с использованием ng_netflow, когда в коллектор из фаервола посылаются строго те пакеты, которые нам необходимы. Эта схема похожа на использование ipcad в режиме divert.

Причина использования второго способа заключается в том, что при регистрации входящего трафика на интерфейсе, заблокированный фаерволом трафик попадет в коллектор. Например, клиент в заблокированном состоянии включает компьютер, запускаются skype, icq и т.д. Естественно, пакеты будут заблокированы, однако клиенту будет насчитан исходящий трафик. В политике большинства сетей такой трафик не должен засчитываться клиенту. На самом деле, это классическое противоречие: для администратора весь трафик должен регистрироваться, с этим условием и возникла концепция netflow учитывать только входящий трафик, но обязательно на всех интерфейсах. К сожалению, это входит в противоречие с методами тарификации провайдеров, работающих с частными абонентами.

Поступим так: для «железных» решений (Микротик, Cisco и т.д) будем применять 1й метод, для «софтовых» - 2й.

По первому методу настраивать проще, с него и начнем. На маршрутизаторе, на котором необходимо регистрировать трафик, настраиваем экспорт netflow-статистики на сервер с ядром NoDeny на порт 8888. Напоминаем, вы должны настроить регистрацию только входящего трафика со всех интерфейсов. Не забывайте, что входящий на «внешний» интерфейс трафик - входящий для клиента, если не регистрировать на этом интерфейсе, то у нас будут данных только по исходящиму трафику клиента. Например, для mikrotik-а:

Команды в консоли mikrotik
/ip traffic-flow target add address=10.20.30.40:8888 version=5
/ip traffic-flow set enabled=yes cache-entries=4k active-flow-timeout=00:01:00 inactive-flow-timeout=00:00:05 interfaces=all
В веб-админке «Операции» → «Настройки» → «Коллекторы трафика» указываем параметры коллектора: в первой колонке вводим «8888», во второй - «netflow: коллектор сервера xx.xx.xx.xx».

8888 - это номер порта netflow-коллектора, на который будут идти данные от netflow сенсоров. Номер порта придумывается админом. Фактически номер порта - это идентификатор netflow-коллектора, которых может быть несколько, каждый привязан к своему порту. Комментарий к коллектору (2й столбец в настройках) обязательно должен начинаться со строки «netflow:».

После рестарта ядра, ждем минуту - дожидаемся пока ядро не запросит статистику. Смотрим, появился ли файл netflow_8888.pl:

Команда bash
ls /usr/local/nodeny/netflow_8888.pl

Данный файл создается автоматически. Когда ядро начинает опрашивать коллекторы, оно запускает скрипт /usr/local/nodeny/netflow.pl и передает ему параметры: номер порта (в данном случае, 8888) и имя файла, в который должна быть записана статистика (например, /usr/local/nodeny/sql/1-1229522476). netflow.pl создает файл netflow_8888.pl и «вписывает» в него переданные параметры. Такой механизм приходится использовать из-за того, что коллектор flow-capture с точки зрения управления не дает нам никаких средств кроме посылки сигнала -HUP, т.о. у нас нет средств передать ему какие-либо параметры. Передавать параметры иными средствами тоже имеют недостатки, которые для экономии места здесь не освещаются.

После создания файла netflow_8888.pl, netflow.pl посылает сигнал -HUP коллектору flow-capture, который формирует файл со статистикой в папке /var/db/flows, запускает netflow_8888.pl и передает в качестве параметра полное название файла со статистикой. netflow_8888.pl подгоняет статистику под нужный ядру вид и записывает в файл, имя которого было указано ядром.

На самом деле, статистика netflow и ipcad практически ничем не отличается. Отличия только в том, что в netflow есть очень нужные для NoDeny параметры, такие как: интерфейс роутера, на который пришел пакет и интерфейс роутера, через который пакет покинет систему. Почему они нам важны будет разъяснено чуть ниже, а при данной настройке мы их пока не задействуем.

В веб-админке проверяем учитывается ли трафик - сначала смотрим страницу мониторинга на предмет не сообщает ли ядро о неудаче в получении статистики.

Если не получается настроить, то пойдем последовательно. Проверим, что статистика регистрируется коллектором:

Команды bash
rm /var/db/flows/ft*
kill -HUP `cat /var/run/flow-capture/flow-capture.pid.8888`
ls /var/db/flows/

Если будет отображен файл, начинающийся с «ft» - коллектор реагирует на сигналы. Посмотрим, что он насобирал:

bash# flow-print < /var/db/flows/ft-v05.2008-12-17.141129+0000

Если вывод не содержит информации о трафике, а он реально регистрировался на удаленном роутере - проверяем не заблокировали мы в фаерволе udp-порт 8888, запускаем:

Команда bash
tcpdump -iem0 -p -n udp port 8888




Способ настройки netflow посредством ng_netflow.

Компилируем ядро с опциями:
options		NETGRAPH
options		NETGRAPH_SOCKET
options		NETGRAPH_IPFW
options		NETGRAPH_NETFLOW
options		NETGRAPH_KSOCKET
либо подгружаем в виде модулей:
kldload netgraph
kldload ng_socket
kldload ng_ipfw
kldload ng_netflow
kldload ng_ksocket

echo ng_netflow_load=\"YES\" >> /boot/loader.conf
echo ng_socket_load=\"YES\" >> /boot/loader.conf
echo ng_ksocket_load=\"YES\" >> /boot/loader.conf
echo ng_ipfw_load=\"YES\" >> /boot/loader.conf
Команда bash
/usr/sbin/ngctl -f- <<-NODENY
   mkpeer ipfw: netflow 100 iface0
   name ipfw:100 netflow
   msg netflow: setdlt { iface = 0 dlt = 12 }
   mkpeer netflow: ksocket export inet/dgram/udp
   msg netflow:export connect inet/127.0.0.1:8888
NODENY

Вкратце. Используя netgraph-утилиту ngctl, создали ноду netflow и «соединили» ее с ipfw через куки с номером 100. Установили регистрацию ip (dlt = 12), связали с нодой ksocket, которая будет экспортировать данные на коллектор по адресу 127.0.0.1 порт 8888.

Теперь возьмем фаервол, использующий divert ipcad, и изменением всего нескольких строк, получим:

#!/bin/sh -
f='/sbin/ipfw'

ifOut='em0'

# Сети, в/из которых трафик блокируем
${f} table 120 flush
${f} table 120 add 224.0.0.0/4
${f} table 120 add 192.168.0.0/16
${f} table 120 add 172.16.0.0/12

${f} -f flush

${f} add 50 allow tcp from any to me 22
${f} add 51 allow tcp from me 22 to any

${f} add 100 deny tcp from any to any 445

${f} add 110 allow ip from any to any via lo0
${f} add 120 skipto 1000 ip from me to any
${f} add 130 deny icmp from any to any in icmptype 5,9,13,14,15,16,17
${f} add 140 deny ip from any to "table(120)"
${f} add 150 deny ip from "table(120)" to any
${f} add 160 skipto 2000 ip from any to me

${f} add 200 skipto 500 ip from any to any via ${ifOut}

${f} add 300 skipto 4500 ip from any to any in

${f} add 400 ngtee 100 ip from any to any
${f} add 490 allow ip from any to any

${f} add 500 skipto 32500 ip from any to any in
${f} add 510 ngtee 100 ip from any to any
${f} add 540 allow ip from any to any


${f} add 1000 allow udp from any 53,7723 to any
${f} add 1010 allow tcp from any to any setup keep-state
${f} add 1020 allow udp from any to any keep-state
${f} add 1100 allow ip from any to any

${f} add 2000 check-state
${f} add 2010 allow icmp from any to any
${f} add 2020 allow tcp from any to any 80,443
${f} add 2050 deny ip from any to any via ${ifOut}
${f} add 2060 allow udp from any to any 53,7723


${f} add 2100 deny ip from any to any


В веб-адмике, в настройках коллекторов вместо порта «8888» укажите «8888:1», где 1 - порядковый номер внешнего интерфейса при выводе ifconfig (нумерация с единицы). Благодаря указанию внешнего интерфейса, у вас получится универсальная схема, при которой вы можете задействовать любое количество маршрутизаторов и при этом корректно регистрировать локальный трафик. Если внешних интерфейсов несколько, то их необходимо перечислить через запятую, например: «8888:1,3». Во втором столбце обязательно укажите комментарий начинающийся с «netflow:»!


Автозапуск.

Команда bash
ee /usr/local/etc/rc.d/ngnetflow.sh

#!/bin/sh
. /etc/rc.subr

name="ngnetflow"
rcvar=`set_rcvar`

load_rc_config $name
: ${ngnetflow_enable="YES"}

start_cmd="ngnetflow_start"
stop_cmd="ngnetflow_stop"

ngnetflow_start() {

/usr/sbin/ngctl -f /usr/local/nodeny/netflow.txt

}

ngnetflow_stop() {
/usr/sbin/ngctl -f- <<-NODENY
shutdown netflow:
NODENY
}

run_rc_command "$1"

Команды bash
chmod 700 /usr/local/etc/rc.d/ngnetflow.sh
echo ngnetflow_enable=\"YES\" >> /etc/rc.conf