Настройка серверов и сайтов на Linux/Unix под "ключ". Услуги системного администратора. Всегда онлайн в телеграм.

Регистрация Войти
Вход на сайт
Качественные бесплатные шаблоны dle скачать с сайта
» » » Учёт трафика с помощью softflowd и flow-tools на шлюзе под управлением FreeBSD

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

07-01-2011
Автор: synergix
Просмотров: 14 890
Комментариев: 0
Версия для печати
Зачастую возникает необходимость в подсчете трафика в локальной сети, проходящим через гейт на FreeBSD. Если трафик сугубо web, то подсчет через логи squid обычно не представляет никаких проблем. В случае же если и/или используется NAT, то подсчет немного усложняется.

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

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


Следующим шагом настроим генерацию ежемесячных отчётов и так же архивацию старых логов. Это будет делать скрипт 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-страниц вполне разумно для доступа к ним развернуть веб-сервер. Поскольку нам нужно отдавать совсем небольшое количество статических страничек мы используем просто и лёгкий thttpsd. Установим его:

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


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

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


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

thttpsd_enable="YES"


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

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


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

На этом всё. Приятной работы!
Рейтинг статьи:
  • 0
Нашли ошибку?   
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.