[devel] Учёт трафика (ulogd + sqlite)

Yury A.Romanov =?iso-8859-1?q?damned_=CE=C1_altlinux=2Eru?=
Сб Ноя 24 17:33:59 MSK 2007


А может лучше ipcad? он еще проще. по rsh получать значения счетчиков
netflow. По netflow ежели что можно их куда-то отдавать.

2007/11/24, Grigory Batalov <bga на altlinux.org>:
>
>   Здравствуйте!
>
>   Мне нужно написать модуль альтератора для учёта трафика в рамках
> 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;
>
> --
> Grigory Batalov,
> ALT Linux Team
>
> _______________________________________________
> Devel mailing list
> Devel на lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/devel
>
>
----------- следующая часть -----------
Вложение в формате HTML было удалено...
URL: <http://lists.altlinux.org/pipermail/devel/attachments/20071124/17c848da/attachment-0002.html>


Подробная информация о списке рассылки Devel