Супер-мини-биллинг на базе Linux+MySQL+ipcad
Делаем так:
1. создаём базу
mysql> create database ip_base;
2. создаём таблицу
mysql> use ip_base; CREATE TABLE `ip` ( `src_ip` int(10) unsigned, `dst_ip` int(10) unsigned, `packets` smallint(5) unsigned, `bytes` int(10) unsigned, `src_port` smallint(5) unsigned, `dst_port` smallint(5) unsigned, `proto` smallint(5) unsigned, `iface` char(6), `stime` int(15) );
3. ставим ipcad (www.spelio.net.ru/soft/) и пишем ему похожий конфиг:
### # cat /usr/local/etc/ipcad.conf capture-ports enable; interface eth1 promisc; # здесь указываем интерфейс смотрящий во внутреннюю сеть с юзерами rsh enable at localhost; rsh root@localhost admin; memory_limit = 32m; # не рекомендую ставить больше 1/8 от всей памяти dumpfile = /var/log/ipcad.dump; rsh ttl = 4; rsh timeout = 30; ###
4. кладём в каталог скажем /adm/traffic такие скрипты:
# cat ip.awk (NF==8 && length($1)>=7){ print "insert into ip values(inet_aton(\"" \ $1"\"),inet_aton(\"" \ $2"\")," \ $3"," \ $4"," \ $5"," \ $6"," \ $7",\"" \ $8"\",unix_timestamp());" } ###
# cat ipcad.sav
#!/bin/sh rsh localhost show ip acco > /var/log/ipcad.log rsh localhost clear ip acco > /dev/nul /bin/awk -f /adm/traffic/ip.awk /var/log/ipcad.log | /usr/bin/mysql -pPASSWORD ip_base #
5. Прописываем в /etc/crontab строчку
0,15,30,45 * * * * root run-parts /etc/cron.15min
не забыв создать mkdir /etc/cron.15min и перезапустить crond
service crond restart
6. делаем линк
ln -s /adm/traffic/ipcad.sav /etc/cron.15min/
7. Ждём пока база начнёт наполняться и смотрим её при помощи запросов mysql:
select sum(bytes) from ip where inet_ntoa(dst_ip)='192.168.111.222' and stime>unix_timestamp('2005-04-20 15:00:00'); -
трафик пришедший на пользователя с ip 192.168.111.222 после 15:00 20 апреля 2005 года
Далее фантазия безгранична… таблицы соответствия имен пользователй ip адресам, таблицы по классу трафика, таблицы классификаторов по портам назначения и так далее….
исходящий траффик:
mysql> select sum(bytes),INET_NTOA(src_ip) from ip where INET_NTOA(src_ip) like '1.1.1.%' and from_unixtime(stime) like '2010-03-29%' group by INET_NTOA(src_ip); +------------+-------------------+ | sum(bytes) | INET_NTOA(src_ip) | +------------+-------------------+ | 1956696 | 1.1.1.133 | | 1113006 | 1.1.1.154 | | 939274 | 1.1.1.160 | | 1131923 | 1.1.1.166 | | 376170 | 1.1.1.180 | | 547850 | 1.1.1.185 | | 629329 | 1.1.1.190 | | 235883 | 1.1.1.2 | +------------+-------------------+ 8 rows in set (0.15 sec)
входящий траффик:
mysql> select sum(bytes),INET_NTOA(dst_ip) from ip where INET_NTOA(dst_ip) like '1.1.1.%' and from_unixtime(stime) like '2010-03-29%' group by INET_NTOA(dst_ip); +------------+-------------------+ | sum(bytes) | INET_NTOA(dst_ip) | +------------+-------------------+ | 934853 | 1.1.1.133 | | 17862295 | 1.1.1.154 | | 4447158 | 1.1.1.160 | | 1647777 | 1.1.1.166 | | 3803635 | 1.1.1.180 | | 2137449 | 1.1.1.185 | | 2429854 | 1.1.1.190 | | 66221 | 1.1.1.2 | | 64162 | 1.1.1.255 | +------------+-------------------+ 9 rows in set (0.14 sec) mysql>
детальный отчет по траффику для адреса:
mysql> select sum(bytes),INET_NTOA(src_ip),INET_NTOA(dst_ip),src_port from ip where from_unixtime(stime) like '2010-03-29%' and INET_NTOA(dst_ip)='1.1.1.154' group by src_port order by sum(bytes) desc limit 10; +------------+-------------------+-------------------+----------+ | sum(bytes) | INET_NTOA(src_ip) | INET_NTOA(dst_ip) | src_port | +------------+-------------------+-------------------+----------+ | 15561316 | 205.188.83.18 | 1.1.1.154 | 80 | | 1438976 | 212.98.168.43 | 1.1.1.154 | 110 | | 551726 | 64.12.30.52 | 1.1.1.154 | 443 | | 114022 | 74.125.39.109 | 1.1.1.154 | 995 | | 66145 | 86.57.255.37 | 1.1.1.154 | 24555 | | 39980 | 1.1.1.2 | 1.1.1.154 | 53 | | 16007 | 130.88.166.196 | 1.1.1.154 | 16718 | | 12684 | 81.25.41.194 | 1.1.1.154 | 26140 | | 10231 | 93.84.1.120 | 1.1.1.154 | 21419 | | 7889 | 87.247.22.203 | 1.1.1.154 | 15405 | +------------+-------------------+-------------------+----------+ 10 rows in set (0.11 sec)