...
...
...

использование ipcad, sqlite и Python-сриптов для учета трафика

дано

Шлюз на базе FreeBSD 4.11. Настроенный файрволл ipfw, используется natd (divert правила в файерволе). Правила файрволла - в /etc/firewall.conf.

цель

Необходимо замерять трафик на шлюзе. Нагрузка на шлюз, по возможности, должна быть минимальной. Файлы не должны занимать много места на диске.

мотивация

Аппаратная платформа шлюза слабая. Задачу предпочтительно решать так, чтобы на шлюзе не требовалось ставить никаких сложных СУБД, биллингов и т.п. Отчеты предполагается хранить на другой машине во внутренней сети.

решение

Первоначально автором задача решалась с использованием связки ipcad+qbe1t (http://sf.net/projects/qbe1t) + скрипты. Однако, хранение данных о трафике, собранных коллектором ipcad, в текстовом виде и последующий их анализ утилитой qbe1t оказался процессом долгим и не очень гибким. Было решено собранную информацию о трафике все-таки хранить в неком бинарном виде, тогда запросы будут производиться гораздо быстрее. Кроме того, бинарный формат займет на диске меньше места.

Можно было бы написать свои программы для работы с таким простым бинарным форматом, однако было решено использовать имеющийся софт. Запросы подразумевали агрегацию, группировку данных, наложение сложных условий, поэтому требовалась поддержка простого и лаконичного языка запросов, на сегодня это пока еще SQL.

Установка СУБД для поддержки SQL была крайне нежелательной. В качестве альтернативы был выбран продукт sqlite.

Для написания своих скриптов используется язык Python. Для доступа к файлу данных sqlite из скриптов Python требуется библиотека (bind) pyslite. Отчеты было решено хранить на выделенном сервере, а на шлюзе хранить информацию с коллектора (ipcad) в сжатом виде ограниченный срок, по истечении которого удалять ее (при необходимости можно информацию с коллектора также сбрасывать на выделенный сервер, однако будет необходимо там следить за ней, то есть организовать ротацию или сброс резервной долгосрочной копии).

Таким образом, схема работы выстроилась такая:

1. Коллектор ipcad собирает информацию.

2. Раз в N минут собираем эту информацию в одном файле (ipcad.db).

3. Раз в месяц по собранной информации за месяц строим отчеты и отсылаем их по FTP на выделенный сервер, информацию с коллектора компрессируем и храним указанное число дней, после чего удаляем эти файлы.

дополнительное ПО

Итак, для решения задачи требуется добавить в базовую систему некоторое программное обеспечение:

- empty с http://empty.sourceforge.net - утилита для запуска и иммитации интерактивного взаимодействия с программами, которые требуют от пользователя ввода каких-либо команд;

- ipcad (http://lionet.info/ipcad) - коллектор трафика;

- интерпретатор языка Python;

- sqlite (http://www.sqlite.org);

- библиотеку для работы с простой однофайловой БД через SQL;

- pysqlite (http://initd.org/tracker/pysqlite);

- bind для sqlite-библиотеки к языку Python.

схема БД

Файл БД будет называться /var/log/ipcad/ipcad.db. В нем будут созданы две таблицы: stat и dump. В таблице stat будет храниться общая информация (счетчики ipfw для входного/выходного трафика и т.п.), в таблице dump – вся информация, собранная по трафику коллектором ipcad.

#sqlite3 /var/log/ipcad/ipcad.db
SQLite version 3.3.7
Enter ".help" for instructions

sqlite> .schema stat
CREATE TABLE stat(ipfw_in_p int,ipfw_in_b int,ipfw_out_p int,ipfw_out_b int,ipcad_stat text, date int);

sqlite> .schema dump
CREATE TABLE dump(src text,dst text,packets int,bytes int,srcport int,dstport int,proto int, if text,date int);


Как видно, используются только два типа данных: text и int. Адреса хранятся как текст в виде, например: 192.168.1.1. Дата - это момент времени, когда был сброс информации, таким образом, у всех пакетов, прошедших за N минут (дискретизация сброса данных в ipcad.db) будет одно время. Оно имеет тип int и хранится в виде 150915, что значит 15-ое число 09:15. Месяц не записывается, так как:

1) дискретизация сброса общей статистики = 1 месяц;

2) Сброшенная статистика содержит в имени файла (в виде суффикса) месяц и год.

Остальные поля тривиальны:

- ipfw_in_p - счетчик пакетов на входящем (divert) правиле ipfw;

- ipfw_in_b - счетчик байт на входящем (divert) правиле ipfw;

- ipfw_out_p, ipfw_out_b – аналогично;

- ipcad_stat - текст, выдаваемый ipcad-ом при вводе “rsh 127.0.0.1 stat”.

Поля таблицы dump - это колонки вывода ipcad-а при “rsh 127.0.0.1 sh ip acco”.

описание работы

Собственно оно уже вырисовывается. Раз в 7 минут по cron происходит сброс данных с коллектора ipcad в /var/log/ipcad/ipcad.db (каталог должен быть создан самостоятельно!) при помощи скрипта traffl.sh, вызывающего программу trafstfl.py. Раз в месяц происходит (опять же по cron) вызов скрипта trafst.sh, который вызывает программу m4 для генерации по шаблону файла-отчета в HTML-формате.

Запросы исполняет программа trafstq.py, которая выводит результаты запросов в виде HTML-таблиц. В качестве приятного бонуса она умеет выводить результаты любых запросов в виде HTML-таблиц в HTML-документе либо просто в виде текстового файла. Файл-отчет - это HTML-документ, который имеет вид traf.08.2006.html (месяц, год). После своего формирования он отправляется на выделенный сервер по FTP при помощи утилиты empty. Трафик (ipcad.db) зажимается, имя зажатого файла также включает суффикс с датой; создается новый ipcad.db.

скрипты

Скрипты лежат на http://laja.hotbox.ru/trafst/trafst.tgz.

Все необходимое находится в каталогах:

- ./usr - что нужно скопировать в /usr;

- ./etc – соответственно, что нужно скопировать в /etc;

- crontab - это содержимое crontab-файла, для автоматизации исполнения в нужное время нужных скриптов;

- trafst.sh и known_hosts нужно подправить по своему усмотрению.

вывод

Установка данного софта крайне проста и не требует много времени.

Конфигурация также максимально проста. Скорость работы высока, устанавливаемый дополнительный софт занимает крайне мало дискового пространства. Пожалуй, это очень экономичное решение поставленной задачи. Данное решение применимо только в SOHO.

Запуск происходит из-под cron, который запускает главные скрипты, написанные на shell. Далее, они используют в качестве инструментария скрипты, написанные на Python. Такая схема позволяет легко добавить параллельный анализ статистики через, например, NetFlow: для этого нужно лишь дополнить Shell-скрипт trafst.st, который помимо основной своей работы должен сбросить по NetFlow очередную порцию информации с коллектора ipcad на какую-нибудь машину с установленной биллинговой системой. Последняя может, в конце концов, даже взаимодействовать с используемой у вас 1С.

благодарности

Всем авторам используемого софта. Персонально Льву Валкину за оказанную помощь в правильной настройке ipcad.

licensed

GNU LGPL - на всякий случай ;)



Laja aka GNU


© Сетевые решения