Учёт трафика с помощью softflowd и flow-tools на шлюзе под управлением FreeBSD

()

В предыдущей статье было показано как можно быстро и легко развернуть простой шлюз на FreeBSD для доступа в интернет небольшой сети. После того как суматоха от развёртывания новой сети уляжется можно задуматься и об учёте трафика.

Далее будет показано как можно относительно легко организовать учёт трафика используя утилиты из комплекта flow-tools и netflow-сенсор softflowd.

Сразу оговоримся что описываемое решение имеет смысл только если IP-адреса пользователей в локальной сети постоянны. То есть либо в настройках DHCP-сервера все IP-адреса привязаны к MAC-адресам клиентов (как это сделать уже было показано ранее), либо нужно вообще отказаться от DHCP-сервера в локальной сети.

Большая часть описываемого тут решения повторяет предыдущее решение. Для начала установим flow-коллектор:

cd /usr/ports/net-mgmt/flow-tools && make install clean

Логи мы будем копить в директории /usr/home/flows. Создадим её:

mkdir -p /usr/home/flows

Затем добавим в файл /etc/rc.conf строки:

flow_capture_enable="YES"
flow_capture_datadir="/usr/home/flows"
flow_capture_localip="127.0.0.1"
flow_capture_remoteip="127.0.0.1"
flow_capture_port="9999"
flow_capture_flags="-n 275"

Здесь мы описываем запуск утилиты flow-capture (netflow-коллектора) на локальном интерфейсе на порту 9999 для сбора статистики с localhost и складирования логов в /usr/home/flows. Запустим коллектор:

/usr/local/etc/rc.d/flow_capture start

Теперь нам нужен netflow-сенсор, который будет отправлять в наш коллектор статистику с сетевого интерфейса. Мы используем простой в настройке softflowd. Установим его:

cd /usr/ports/net-mgmt/softflowd && make install clean

Для автоматического запуска сенсора нужно создать скрипт /usr/local/etc/rc.d/softflowd.sh следующего содержания:

#!/bin/sh

/usr/local/sbin/softflowd -i em0 -n 127.0.0.1:9999

Запускаем сенсор:

chmod +x /usr/local/etc/rc.d/softflowd.sh && /usr/local/etc/rc.d/softflowd.sh

Теперь в директорр /usr/home/flows будут собираться логи netflow. Остаётся только начать генерировать на их основе статистику. Для этого создадим директорю /usr/local/scripts и перейдём в неё:

mkdir -p /usr/local/scripts && cd /usr/local/scripts

Для начала создадим файл stat-flow.acl в котором опишем адресные пространства интернета и нашей локальной сети:

ip access-list standard localnet permit 172.31.255.0 0.0.0.255
ip access-list standard localnet deny any

ip access-list standard internet deny 172.31.255.0 0.0.0.255
ip access-list standard internet permit any

Затем создадим файл stat-report.conf, в котором опишем конфигурацию для утилиты flow-reports:

stat-report localnet
    type ip-destination-address
    output
	format ascii
	options +header,+xheader,+totals
	fields -flows,-packets,-duration

stat-definition localnet
    report localnet

Отчёты мы будем складывать в директорию /usr/local/www/flow-reports. Создадим скрипт stat_daily.sh, который будет запускаться раз в сутки и генерировать отчёты за предыдущий день. Вот его содержание:

#!/bin/sh

# Получаем вчерашнюю дату
RPT_Y=`/bin/date -v-1d +%Y`
RPT_M=`/bin/date -v-1d +%m`
RPT_D=`/bin/date -v-1d +%d`

# Путь для хранения отчётов
RPT_DIR="/usr/local/www/flow-reports/daily"

# Дата отчёта
RPT_DATE=${RPT_Y}-${RPT_M}-${RPT_D}

# Файл с отчётом
RPT_NAME=${RPT_DIR}/${RPT_DATE}.html

# Директория с логами
FLOW_DIR="/usr/home/flows"

# Если вдруг директория для отчётов не существует - она будет создана
mkdir -p ${RPT_DIR}

# Создаём шапку отчёта
echo -e "<HTML>\n<HEAD>\n<TITLE>${RPT_DATE}</TITLE>\n</HEAD>\n<BODY>\n<H1>${RPT_DATE}</H1>\n" > ${RPT_NAME}

# Создаём отчёт
#
# Утилита flow-cat "выбрасывает" на стандартный вывод данные из логов
#
# утилита flow-filter выделяет из логов определённые данные.
# С помощью ключа -f указывается файл со списками доступа
# С помощью ключа -S указывается список, описывающий источник трафика
# С помощью ключа -D указывается список, описывающий получателя трафика (нашу локальную сеть)
#
# Утилита flow-report создаёт отчёт, используя один из предопределённых отчётов.
# Файл со список отчётов задаётся с помощью ключа -s, а конкретный отчёт - с помощью ключа -S
#
# Утилита flow-rptfmt форматирует отчёт, полученный с помощью flow-report.
# Ключ -f задаёт формат, а ключ -H отключает вывод заголовка со служебной информацией
/usr/local/bin/flow-cat ${FLOW_DIR}/${RPT_Y}/${RPT_Y}-${RPT_M}/${RPT_Y}-${RPT_M}-${RPT_D} \
|/usr/local/bin/flow-filter -f/usr/local/scripts/stat-flow.acl -Sinternet -Dlocalnet \
|/usr/local/bin/flow-report -s /usr/local/scripts/stat-report.conf -S localnet \
| /usr/local/bin/flow-rptfmt -f html -H >> ${RPT_NAME}

# Закрываем HTML-тэги в отчёте
echo -e "</BODY>\n</HTML>\n" >> ${RPT_NAME}

Для автоматической генерации отчётов каждый день нужно добавить в /etc/crontab строку:

10	0	*	*	*	root	/usr/local/scripts/stat_daily.sh

Получаемые отчёты будут выглядеть примерно вот так:

2010-06-27

ip-destination-address octets
172.31.255.100 1619973024
172.31.255.101 1954758

Следующим шагом настроим генерацию ежемесячных отчётов и так же архивацию старых логов. Это будет делать скрипт stat_monthly.sh:

#!/bin/sh

# Будем генерировать отчёт за предыдущий месяц
RPT_Y=`/bin/date -v-1m +%Y`
RPT_M=`/bin/date -v-1m +%m`

# Здесь всё практически тоже, что и в предыдущем скрипте
RPT_DIR="/usr/local/www/flow-reports/monthly"

RPT_DATE=${RPT_Y}-${RPT_M}

RPT_NAME=${RPT_DIR}/${RPT_DATE}.html

FLOW_DIR="/usr/home/flows"

# Дополнительная переменная - сюда будем архивировать старые логи
FLOW_DIR_OLD=${FLOW_DIR}/old

# Как и в предыдущем скрипте генерируем отчёт
mkdir -p ${RPT_DIR}

echo -e "<HTML>\n<HEAD>\n<TITLE>${RPT_DATE}</TITLE>\n</HEAD>\n<BODY>\n<H1>${RPT_DATE}</H1>\n" > ${RPT_NAME}

/usr/local/bin/flow-cat ${FLOW_DIR}/${RPT_Y}/${RPT_Y}-${RPT_M} \
|/usr/local/bin/flow-filter -f/usr/local/scripts/stat-flow.acl -Sinternet -Dlocalnet \
|/usr/local/bin/flow-report -s /usr/local/scripts/stat-report.conf -S localnet \
| /usr/local/bin/flow-rptfmt -f html -H >> ${RPT_NAME}

echo -e "</BODY>\n</HTML>\n" >> ${RPT_NAME}

# Переходим к удалению старых логов
# На всякий случай пересоздаём хранилище этих логов
mkdir -p ${FLOW_DIR_OLD}

# Пеерходим в директорию с логами за прошлый месяц
cd ${FLOW_DIR}/${RPT_Y}/${RPT_Y}-${RPT_M}

# Архивируем логи
/usr/bin/tar -cjf ${FLOW_DIR_OLD}/${RPT_Y}-${RPT_M}.tar.bz2 ./

# Удаляем старые логи
cd ${FLOW_DIR}/${RPT_Y}
rm -rf ${FLOW_DIR}/${RPT_Y}/${RPT_Y}-${RPT_M}

Для автоматической генерации отчётов каждый день нужно добавить в /etc/crontab строку:


10	1	1	*	*	root	/usr/local/scripts/stat_monthly.sh

Поскольку отчёты генерируются в виде HTML-страниц вполне разумно для доступа к ним развернуть веб-сервер. Поскольку нам нужно отдавать совсем небольшое количество статических страничек мы используем просто и лёгкий thttpd. Установим его:

cd /usr/ports/www/thttpd && make install clean

Затем нужно сконфигурировать thttpd, для этого необходимо создать файл /usr/local/etc/thttpd.conf следующего содержания:

user=www
dir=/usr/local/www/flow-reports
chroot
cgipat=*.cgi
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid

Следующим шагом включим автоматический запуск веб-сервера при загрузке системы добавив в файл /etc/rc.conf строку:

thttpd_enable="YES"

И наконец запустим веб-сервер:

/usr/local/etc/rc.d/thttpd start

Просматривать отчёты по трафику можно открывая из локальной сети в браузере адрес http://172.31.255.1 (это адрес нашего шлюза).

На этом всё. Приятной работы!

Ключевые слова: softflowd, flow-tools, netflow, freebsd, статистика, thttpd.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

Комментарии:

Anonymous 2015-09-06 21:51:51 (#)

Только входячий меряет?

MooSE 2015-09-07 00:28:15 (#)

Только входячий меряет?
Переписываешь конфиги flow-filter и flow-report и смотришь на исходящий. Но обычно платят за входящий.

Anonymous 2015-09-08 17:50:27 (#)

Как лучше сделать, чтобы смотреть оба:
stat-report localnet
type ip-destination-address
output
input
или 2 секции stat-report localnet на output и input

MooSE 2015-09-09 16:38:35 (#)

По идее две секции. И генерировать два промежуточных отчёта, которые потом сводить в один.

Если кто-то сможет придумать более красивый способ - welcome :)
Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности