В предыдущей статье было показано как можно быстро и легко развернуть простой шлюз на 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
|
Следующим шагом настроим генерацию ежемесячных отчётов и так же архивацию старых логов. Это будет делать скрипт 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 (это адрес нашего шлюза).
На этом всё. Приятной работы!
Anonymous 2015-09-06 21:51:51 (#)