Linux: iptables + ulogd + ?
Добавлено: Чт янв 10, 2008 1:11 pm
Для снятия статистики по трафику лично я использую iptables. Тоись трафик, который нужно считать я заворачиваю иптейблами в ULOG. На мой взгляд это гораздо удобнее и эффективнее, чем снимать статистику с интерфейсов (те, кто хорошо знают иптейблс, меня поймут). На сегодняшний день я вынужден использовать следующую цепочку: iptables -j ULOG + ipcad interface ulog + flow-capture + traffic2sql и она мне активно не нравится. По многим причинам, не буду углубляться. Слишком уж коряво и громоздко. Хотя в линухе есть прекрасный демон ulogd, который собсно и предназначен для снятия статистики с улога и передачи куда-нить в юзерспейс. Там и плагин для мускл есть. То есть, с помощью улогд можно можно формировать статистику в таблице мускла. Вот такого формата:
В этой таблице не обязательно должны присутствовать все поля - достаточно тех, что нужны, лишь бы имена совпадали. Улогд определяет динамически при установлении связи с мусклом.
У меня уже давно руки чешутся прикрутить ulogd к абиллсу (или наоборот
). И тут есть 2 пути:
1. Идеальный. Написать плагин для улогд, заточенный под абиллс и возложить на него... да собсно всё, что делает traffic2sql. И мы имеем биллинг, действительно работающий в реальном времени.
2. С извращениями, но простой в реализации (из серии на безрыбье и ворона раком станет). Юзается улогд со своим мускловым плагином и формирует вышеописанную таблицу. Ну а traffic2sql просто "научить" забирать данные оттуда (не забывая при этом удалять обработанные записи). Собсно всё.
Я думаю, что Автор мог бы реализовать вариант 2... ну, скажем, за полчаса (эх, не промахнуться бы, скажешь меньше - подумает ваще офигел, скажешь больше - обидится
). Со своей стороны могу предложить отладку и тестирование. То есть настройка иптейблс, улогд, формирование таблицы и заполнение корректными данными - это мой геморрой...
Ну что, сделаем?
Кстати вот здесь агрегация именно на уровне абиллса просто необходима, т. к. каждая запись таблицы ulog - это информация о каждом пакете, прошедшем через ядро, и завёрнутом в улог. Но для начала можно и без неё.
Код: Выделить всё
CREATE TABLE ulog ( id INT UNSIGNED AUTO_INCREMENT UNIQUE,
raw_mac VARCHAR(80),
oob_time_sec INT UNSIGNED,
oob_time_usec INT UNSIGNED,
oob_prefix VARCHAR(32),
oob_mark INT UNSIGNED,
oob_in VARCHAR(32),
oob_out VARCHAR(32),
ip_saddr INT UNSIGNED,
ip_daddr INT UNSIGNED,
ip_protocol TINYINT UNSIGNED,
ip_tos TINYINT UNSIGNED,
ip_ttl TINYINT UNSIGNED,
ip_totlen SMALLINT UNSIGNED,
ip_ihl TINYINT UNSIGNED,
ip_csum SMALLINT UNSIGNED,
ip_id SMALLINT UNSIGNED,
ip_fragoff SMALLINT UNSIGNED,
tcp_sport SMALLINT UNSIGNED,
tcp_dport SMALLINT UNSIGNED,
tcp_seq INT UNSIGNED,
tcp_ackseq INT UNSIGNED,
tcp_window SMALLINT UNSIGNED,
tcp_urg TINYINT,
tcp_urgp SMALLINT UNSIGNED,
tcp_ack TINYINT,
tcp_psh TINYINT,
tcp_rst TINYINT,
tcp_syn TINYINT,
tcp_fin TINYINT,
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,
pwsniff_user VARCHAR(30),
pwsniff_pass VARCHAR(30),
ahesp_spi INT UNSIGNED,
KEY index_id (id)
);
У меня уже давно руки чешутся прикрутить ulogd к абиллсу (или наоборот

1. Идеальный. Написать плагин для улогд, заточенный под абиллс и возложить на него... да собсно всё, что делает traffic2sql. И мы имеем биллинг, действительно работающий в реальном времени.
2. С извращениями, но простой в реализации (из серии на безрыбье и ворона раком станет). Юзается улогд со своим мускловым плагином и формирует вышеописанную таблицу. Ну а traffic2sql просто "научить" забирать данные оттуда (не забывая при этом удалять обработанные записи). Собсно всё.
Я думаю, что Автор мог бы реализовать вариант 2... ну, скажем, за полчаса (эх, не промахнуться бы, скажешь меньше - подумает ваще офигел, скажешь больше - обидится

Ну что, сделаем?

Кстати вот здесь агрегация именно на уровне абиллса просто необходима, т. к. каждая запись таблицы ulog - это информация о каждом пакете, прошедшем через ядро, и завёрнутом в улог. Но для начала можно и без неё.