Страница 1 из 1
Тест на правильность подсчета трафика
Добавлено: 2008-07-10 23:09:17
Demiurg
Обкурив вот это
http://www.opennet.ru/base/net/ng_billi ... r.txt.html и это
http://www.lissyara.su/?id=1010 дело, написал скрипт (sh), который сливает инфу по трафику:
Код: Выделить всё
ng_ipacct=# select * from traffic LIMIT 3;
id | ifaces_id | date_in | ip_from | s_port | ip_to | d_port | proto | packets | bytes | date_packet
-----+-----------+----------------------------+---------------+--------+---------------+--------+-------+---------+-------+---------------------
457 | 1 | 2008-07-10 23:46:38.211667 | 87.230.97.237 | 80 | 192.168.1.2 | 53363 | 6 | 7 | 1254 | 2008-07-10 23:46:30
458 | 1 | 2008-07-10 23:46:38.211667 | 192.168.1.2 | 64607 | 87.230.97.237 | 80 | 6 | 6 | 1040 | 2008-07-10 23:46:30
459 | 1 | 2008-07-10 23:46:38.211667 | 192.168.1.2 | 58905 | 85.95.164.60 | 53 | 17 | 1 | 59 | 2008-07-10 23:46:30
(3 rows)
ng_ipacct=#
из ng_ipacct в базу (PostgreSQL). Вопрос такой: какие тесты можно провести и с помощью каких утилит, чтобы подтвердить/опровергнуть правильность подсчета трафика?
Re: Тест на правильность подсчета трафика
Добавлено: 2008-07-11 7:15:09
alex3
ну элементарно... смотришь траффик, потом откуда нибудь сливаешь файл и смотришь траф опять... погрешность в пределах 10%
Re: Тест на правильность подсчета трафика
Добавлено: 2008-07-11 7:24:27
dikens3
alex3 писал(а):ну элементарно... смотришь траффик, потом откуда нибудь сливаешь файл и смотришь траф опять... погрешность в пределах 10%
С нормальным провайдером сходство с его данными до 4-го знака после запятой (У меня провайдер больше не считает вобщем). Учёт 100% и никакого расхождения.
Demiurg писал(а):Вопрос такой: какие тесты можно провести и с помощью каких утилит, чтобы подтвердить/опровергнуть правильность подсчета трафика?
Посмотри статистику у провайдера.
Re: Тест на правильность подсчета трафика
Добавлено: 2008-07-11 7:30:50
alex3
упс... не заметил деления на входящий и исходящий траф... тогда да - погрешности не должно быть.
Re: Тест на правильность подсчета трафика
Добавлено: 2008-07-11 8:55:34
hizel
1. счетчики фаервола
2. счетчики snmp
3. ваша база
все в postgresql и пару sql запросов для сличения
Re: Тест на правильность подсчета трафика
Добавлено: 2008-07-11 12:10:10
Demiurg
Я не силен в модели OSI (я больше программер чем админ), как отличить локальный трафик от внешнего? Топология сети: на шлюзе - 192.168.0.1 (xl0) смотрит в локалку, 192.168.1.2 (sk0) смотрит на модем (192.168.1.1), 192.168.2.1 (xl1) смотрит на локальную точку доступа...
Re: Тест на правильность подсчета трафика
Добавлено: 2008-07-11 12:49:12
hizel
Код: Выделить всё
if ip_from in (192.168.0.0/16) and ip_to not in (192.168.0.0/16):
traf_out += bytes
elif ip_from not in (192.168.0.0/16) and ip_to in (192.168.0.0/16):
traf_in += bytes
else:
traf_local +=bytes
осталось вам найти скрипдег вхождения ip в подсеть
Re: Тест на правильность подсчета трафика
Добавлено: 2008-07-11 15:34:15
Demiurg
2hizel
...часа два репу ломал... ничего лучше так и не придумал...
Код: Выделить всё
CREATE OR REPLACE VIEW traffic_out AS SELECT ip_from, ip_to, date_packet::date, sum(bytes) AS bytes
FROM traffic
WHERE ip_from << '192.168.0.0/16' AND ip_to NOT IN (SELECT ip_to FROM traffic WHERE ip_to << '192.168.0.0/16')
GROUP BY ip_from, ip_to, date_packet::date
ORDER BY date_packet ASC, ip_from, ip_to;
CREATE OR REPLACE VIEW traffic_in AS SELECT ip_from, ip_to, date_packet::date, sum(bytes) AS bytes
FROM traffic
WHERE ip_to << '192.168.0.0/16' AND ip_from NOT IN (SELECT ip_from FROM traffic WHERE ip_from << '192.168.0.0/16')
GROUP BY ip_from, ip_to, date_packet::date
ORDER BY date_packet ASC, ip_from, ip_to;
CREATE OR REPLACE VIEW traffic_local AS SELECT ip_from, ip_to, date_packet::date, sum(bytes) AS bytes
FROM traffic
WHERE ip_to << '192.168.0.0/16' AND ip_from << '192.168.0.0/16'
GROUP BY ip_from, ip_to, date_packet::date
ORDER BY date_packet ASC, ip_from, ip_to;
...если в августе с провайдером сойдется, буду стряпать web-морду...
Re: Тест на правильность подсчета трафика
Добавлено: 2008-07-11 16:54:23
hizel
спасибо, вечерком помедитирую

Re: Тест на правильность подсчета трафика
Добавлено: 2008-07-11 17:14:10
Demiurg
Может еще кто скрипт импорта потестит? ...а то у меня наверно не так много трафика, что б он хоть как-то ощутимо продолжительно работал...
checkpoint.sh
Код: Выделить всё
#!/bin/sh
[ -z "$1" ] && exit 1
ipacctctl $1_ip_acct:$1 checkpoint
echo "CREATE TEMPORARY TABLE traffic_tmp (
date_in timestamp NOT NULL DEFAULT now(),
ip_from inet NOT NULL,
s_port int NOT NULL,
ip_to inet NOT NULL,
d_port int NOT NULL,
proto int NOT NULL,
packets int NOT NULL,
bytes int NOT NULL,
unixtime int NOT NULL
);
COPY traffic_tmp (ip_from, s_port, ip_to, d_port, proto, packets, bytes, unixtime) FROM stdin;" >> $1.log
ipacctctl $1_ip_acct:$1 show >> $1.log
echo "\.
SELECT add_traffic('$1');" >> $1.log
psql -f $1.log ng_ipacct -U pgsql 2>/dev/null
ipacctctl $1_ip_acct:$1 clear
cat /dev/null > $1.log
base.sql
Код: Выделить всё
CREATE TABLE ifaces ( -- таблица с интерфейсами
id serial,
title varchar(16) NOT NULL, -- название интерфейса
CONSTRAINT ifaces_pk PRIMARY KEY (id),
CONSTRAINT ifaces_u1 UNIQUE (title)
);
CREATE TABLE traffic ( -- траффик по интерфейсам
id serial,
ifaces_id int NOT NULL,
ip_from inet NOT NULL,
s_port int NOT NULL,
ip_to inet NOT NULL,
d_port int NOT NULL,
proto int NOT NULL,
packets int NOT NULL, -- количество прошедших пакетов
bytes int NOT NULL, -- количество прошедших байт
date_packet timestamp NOT NULL, -- время прохождеия пакетов
CONSTRAINT traffic_pk PRIMARY KEY (id),
CONSTRAINT traffic_f1 FOREIGN KEY (ifaces_id) REFERENCES ifaces (id)
);
CREATE OR REPLACE FUNCTION add_traffic(ifaces.title%TYPE) RETURNS int AS $_$
DECLARE
titleIN ALIAS FOR $1;
ifacesID ifaces.id%TYPE;
BEGIN
SELECT id INTO ifacesID FROM ifaces WHERE title = titleIN;
INSERT INTO traffic (ifaces_id, ip_from, s_port, ip_to, d_port, proto, date_packet, packets, bytes)
SELECT ifacesID AS ifaces_id, ip_from, s_port, ip_to, d_port, proto, abstime(unixtime), sum(packets) AS packets, sum(bytes) AS bytes
FROM traffic_tmp
GROUP BY ip_from, s_port, ip_to, d_port, proto, unixtime;
RETURN 0;
END;
$_$ LANGUAGE plpgsql;