[devel] Учёт трафика (ulogd + sqlite)
Anton Farygin
=?iso-8859-1?q?rider_=CE=C1_altlinux=2Ecom?=
Вс Ноя 25 04:01:22 MSK 2007
Григорий! Спасибо за поднятую тему.
Первое, что хотелось бы сказать: независимо от итогового решения,
давайте попробуем сделать то, что нужно сейчас, максимально расширяемым.
Для этого мы попробуем добавить следующие прослойки:
1) коллектор трафика - модуль сбора. Динамически-подгружаемый so модуль,
собирающий данные об трафике с различных источников (netflow, ulog... и
т.д.)
2) калькулятор - модуль, позволяющий согласно настройкам - правилам,
вносить подсчитываемые значения в базу данных
3) Реализатор - модуль, позволяющий согласно настройкам и правилам
блокировать пользователя.
4) Визуализатор - видимо это на данном этапе альтератор, общающийся с
системой учёта через cmdline интерфейс (в этом случае не придётся ваять
библиотеки, хотя они явно не помешали бы)
Соответственно хотелось бы изначально спроектировать систему таким
образом, что бы по мере необходимости можно было без серьёзных изменений
добавлять функционал. Конечная цель - полноценный биллинг (который
актуален как всегда).
Видимо стоит посмотреть на существующие решения - Katrin (молодой
проект, но как говорят - работает), netams (масса болезней, как мне
показалось) и т.д.
netams, кстати, умеет ulog, но я столкнулся с проблемой падения netams.
Допускаю ошибки в настройке iptables, но в случае падения netams сервер
становился недоступен по сети.
Grigory Batalov пишет:
> Здравствуйте!
>
> Мне нужно написать модуль альтератора для учёта трафика в рамках
> Office Server. Оцените идею, кто в теме.
>
> Наиболее простым кажется использовать ulogd и sqlite, поскольку это
> самодостаточные пакеты, и между ними не требуется прослойки. Так что
> я добавил правила:
>
> # iptables --insert INPUT -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "icount"
> # iptables --insert OUTPUT -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "ocount"
> # iptables --insert FORWARD -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "fcount"
>
> и настроил ulogd-sqlite3 на /var/lib/ulogd/sqlite3.db
>
> Всё бы хорошо, но пакетов приходит много, база растёт, а потенциальные
> пользователи Office Server вряд ли будут за ней следить и чистить.
> Поэтому я внёс дополнения в схему базы (cм. ниже).
>
> При вставке (INSERT) новой строки длина пакета триггером добавляется
> к суточному счётчику (в соответствии с протоколом, IP, портами и пр.), а
> строка тут же удаляется. Счётчик сначала пытается вставиться (INSERT OR
> IGNORE - если уже есть, молча идём дальше) в суточную таблицу (ulog_daily),
> а затем увеличивается на длину пакета UPDATE-ом.
>
> Поскольку в альтераторе не будет подробных сведений, время округляется
> до суток. По ulog_daily строится индекс для скорейшего поиска. Входной/выходной
> интерфейсы, порты tcp/udp при вставке в ulog_daily складываются, поскольку
> одновременно используется только один из пары.
>
> Ввод такой схемы даёт 16-кратную экономию места, при том, что скорость
> падает примерно в 4 раза: дамп на 360 тысяч строк залился чуть больше,
> чем за минуту (на Athlon 64 X2 3600) против 15 секунд по старой схеме.
> Мне кажется, это приемлимо.
>
> Покритикуйте, если я что-нибудь упустил.
>
> --- >8 ---
> CREATE TABLE ulog (
> raw_mac VARCHAR(80),
> oob_time_sec INT UNSIGNED,
> oob_time_usec INT UNSIGNED,
> oob_prefix VARCHAR(32),
> oob_in VARCHAR(32),
> oob_out VARCHAR(32),
> ip_saddr VARCHAR(16),
> ip_daddr VARCHAR(16),
> ip_protocol TINYINT UNSIGNED,
> ip_totlen SMALLINT UNSIGNED,
> tcp_sport SMALLINT UNSIGNED,
> tcp_dport SMALLINT UNSIGNED,
> udp_sport SMALLINT UNSIGNED,
> udp_dport SMALLINT UNSIGNED,
> udp_len SMALLINT UNSIGNED,
> icmp_type TINYINT UNSIGNED,
> icmp_code TINYINT UNSIGNED,
> icmp_echoid SMALLINT UNSIGNED,
> icmp_echoseq SMALLINT UNSIGNED,
> icmp_gateway INT UNSIGNED,
> icmp_fragmtu SMALLINT UNSIGNED
> );
> CREATE TABLE ulog_daily (
> time INT UNSIGNED,
> prefix VARCHAR(32),
> iface VARCHAR(32),
> saddr VARCHAR(16),
> daddr VARCHAR(16),
> protocol TINYINT UNSIGNED,
> sport SMALLINT UNSIGNED,
> dport SMALLINT UNSIGNED,
> bytes INTEGER
> );
> CREATE UNIQUE INDEX ulog_daily_idx ON ulog_daily
> (time, prefix, iface, saddr, daddr, protocol, sport, dport);
> CREATE TRIGGER aggregate AFTER INSERT ON ulog
> BEGIN
> INSERT OR IGNORE INTO ulog_daily (
> time,
> prefix,
> iface,
> saddr,
> daddr,
> protocol,
> sport,
> dport,
> bytes
> ) values (
> NEW.oob_time_sec/86400*86400,
> NEW.oob_prefix,
> NEW.oob_in || NEW.oob_out,
> NEW.ip_saddr,
> NEW.ip_daddr,
> NEW.ip_protocol,
> ifnull (NEW.tcp_sport, 0) + ifnull (NEW.udp_sport, 0),
> ifnull (NEW.tcp_dport, 0) + ifnull (NEW.udp_dport, 0),
> 0
> );
> UPDATE ulog_daily
> SET
> bytes = bytes + NEW.ip_totlen
> WHERE
> time = NEW.oob_time_sec/86400*86400 AND
> prefix = NEW.oob_prefix AND
> iface = NEW.oob_in || NEW.oob_out AND
> saddr = NEW.ip_saddr AND
> daddr = NEW.ip_daddr AND
> protocol = NEW.ip_protocol AND
> sport = ifnull (NEW.tcp_sport, 0) + ifnull (NEW.udp_sport, 0) AND
> dport = ifnull (NEW.tcp_dport, 0) + ifnull (NEW.udp_dport, 0);
> DELETE from ulog WHERE ROWID = NEW.ROWID;
> END;
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Devel mailing list
> Devel на lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/devel
Подробная информация о списке рассылки Devel