А может лучше ipcad? он еще проще. по rsh получать значения счетчиков netflow. По netflow ежели что можно их куда-то отдавать.<br><br><div><span class="gmail_quote">2007/11/24, Grigory Batalov <<a href="mailto:bga@altlinux.org">
bga@altlinux.org</a>>:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> Здравствуйте!<br><br> Мне нужно написать модуль альтератора для учёта трафика в рамках
<br>Office Server. Оцените идею, кто в теме.<br><br> Наиболее простым кажется использовать ulogd и sqlite, поскольку это<br>самодостаточные пакеты, и между ними не требуется прослойки. Так что<br>я добавил правила:<br><br>
# iptables --insert INPUT -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "icount"<br># iptables --insert OUTPUT -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "ocount"
<br># iptables --insert FORWARD -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "fcount"<br><br>и настроил ulogd-sqlite3 на /var/lib/ulogd/sqlite3.db<br><br> Всё бы хорошо, но пакетов приходит много, база растёт, а потенциальные
<br>пользователи Office Server вряд ли будут за ней следить и чистить.<br>Поэтому я внёс дополнения в схему базы (cм. ниже).<br><br> При вставке (INSERT) новой строки длина пакета триггером добавляется<br>к суточному счётчику (в соответствии с протоколом, IP, портами и пр.), а
<br>строка тут же удаляется. Счётчик сначала пытается вставиться (INSERT OR<br>IGNORE - если уже есть, молча идём дальше) в суточную таблицу (ulog_daily),<br>а затем увеличивается на длину пакета UPDATE-ом.<br><br> Поскольку в альтераторе не будет подробных сведений, время округляется
<br>до суток. По ulog_daily строится индекс для скорейшего поиска. Входной/выходной<br>интерфейсы, порты tcp/udp при вставке в ulog_daily складываются, поскольку<br>одновременно используется только один из пары.<br><br> Ввод такой схемы даёт 16-кратную экономию места, при том, что скорость
<br>падает примерно в 4 раза: дамп на 360 тысяч строк залился чуть больше,<br>чем за минуту (на Athlon 64 X2 3600) против 15 секунд по старой схеме.<br>Мне кажется, это приемлимо.<br><br> Покритикуйте, если я что-нибудь упустил.
<br><br>--- >8 ---<br>CREATE TABLE ulog (<br> raw_mac VARCHAR(80),<br> oob_time_sec INT UNSIGNED,<br> oob_time_usec INT UNSIGNED,<br> oob_prefix VARCHAR(32),
<br> oob_in VARCHAR(32),<br> oob_out VARCHAR(32),<br> ip_saddr VARCHAR(16),<br> ip_daddr VARCHAR(16),
<br> ip_protocol TINYINT UNSIGNED,<br> ip_totlen SMALLINT UNSIGNED,<br> tcp_sport SMALLINT UNSIGNED,<br> tcp_dport SMALLINT UNSIGNED,
<br> udp_sport SMALLINT UNSIGNED,<br> udp_dport SMALLINT UNSIGNED,<br> udp_len SMALLINT UNSIGNED,<br> icmp_type TINYINT UNSIGNED,
<br> icmp_code TINYINT UNSIGNED,<br> icmp_echoid SMALLINT UNSIGNED,<br> icmp_echoseq SMALLINT UNSIGNED,<br> icmp_gateway INT UNSIGNED,
<br> icmp_fragmtu SMALLINT UNSIGNED<br> );<br>CREATE TABLE ulog_daily (<br> time INT UNSIGNED,<br> prefix VARCHAR(32),
<br> iface VARCHAR(32),<br> saddr VARCHAR(16),<br> daddr VARCHAR(16),<br> protocol TINYINT UNSIGNED,
<br> sport SMALLINT UNSIGNED,<br> dport SMALLINT UNSIGNED,<br> bytes INTEGER<br> );<br>CREATE UNIQUE INDEX ulog_daily_idx ON ulog_daily
<br> (time, prefix, iface, saddr, daddr, protocol, sport, dport);<br>CREATE TRIGGER aggregate AFTER INSERT ON ulog<br>BEGIN<br> INSERT OR IGNORE INTO ulog_daily (<br> time,<br> prefix,
<br> iface,<br> saddr,<br> daddr,<br> protocol,<br> sport,<br> dport,<br> bytes<br> ) values (<br>
NEW.oob_time_sec/86400*86400,<br> NEW.oob_prefix,<br> NEW.oob_in || NEW.oob_out,<br> NEW.ip_saddr,<br> NEW.ip_daddr,<br> NEW.ip_protocol,<br> ifnull (
NEW.tcp_sport, 0) + ifnull (NEW.udp_sport, 0),<br> ifnull (NEW.tcp_dport, 0) + ifnull (NEW.udp_dport, 0),<br> 0<br> );<br> UPDATE ulog_daily<br> SET<br> bytes = bytes +
NEW.ip_totlen<br> WHERE<br> time = NEW.oob_time_sec/86400*86400 AND<br> prefix = NEW.oob_prefix AND<br> iface = NEW.oob_in || NEW.oob_out AND<br> saddr =
NEW.ip_saddr AND<br> daddr = NEW.ip_daddr AND<br> protocol = NEW.ip_protocol AND<br> sport = ifnull (NEW.tcp_sport, 0) + ifnull (NEW.udp_sport, 0) AND<br> dport = ifnull (
NEW.tcp_dport, 0) + ifnull (NEW.udp_dport, 0);<br> DELETE from ulog WHERE ROWID = NEW.ROWID;<br>END;<br><br>--<br> Grigory Batalov,<br> ALT Linux Team<br><br>_______________________________________________<br>Devel mailing list
<br><a href="mailto:Devel@lists.altlinux.org">Devel@lists.altlinux.org</a><br><a href="https://lists.altlinux.org/mailman/listinfo/devel">https://lists.altlinux.org/mailman/listinfo/devel</a><br><br></blockquote></div><br>