Mam taka wersje LMS-a -> LMS 1.1-cvs (1.307/1.41)
Mam komputery w sieci lokalnej na ipkach 192.168.1.250 do 253
Przy starcie systemu odpalam
/sbin/iptables -N RECV /sbin/iptables -N SEND /sbin/iptables -A RECV -d 192.168.1.253 -j RETURN /sbin/iptables -A SEND -s 192.168.1.253 -j RETURN /sbin/iptables -A RECV -d 192.168.1.252 -j RETURN /sbin/iptables -A SEND -s 192.168.1.252 -j RETURN /sbin/iptables -A RECV -d 192.168.1.251 -j RETURN /sbin/iptables -A SEND -s 192.168.1.251 -j RETURN /sbin/iptables -A RECV -d 192.168.1.250 -j RETURN /sbin/iptables -A SEND -s 192.168.1.250 -j RETURN /sbin/iptables -A FORWARD -j RECV /sbin/iptables -A FORWARD -j SEND
Dopisalem uzywkownikow o odpowiednim ip do bazy
W crontabie odpalam: 0-59/10 * * * * root /etc/lms/traffic_ipt.sh 59 * * * * root /etc/lms/bandlogger
Plik traffic_ipt.sh wyglada tak: <cut here> #--------Ustawienie stałych użytkownika---------------- hosty=" 1.253 1.252 1.251 1.250 " net='192.168' # sieć log='/var/log/traffic.log' # katalog ze statystyk± ipt='/sbin/iptables' #--------------------------------------------------------
# odczyt liczników firewalla i zapis do pliku. $ipt -L RECV -v -x -n > /tmp/recv.stat $ipt -L SEND -v -x -n > /tmp/send.stat
# usunięcie poprzedniego loga if [ -e $log ] then rm $log fi
# zapis aktualnych danych dla każdego IP osobno # do pliku odczytywanego przez skrypt lms-traffic # w formacie: <adres IP> <upload> <download> for host in $hosty do recv=`cat /tmp/recv.stat | grep $net.$host' ' | cut -c10-18` send=`cat /tmp/send.stat | grep $net.$host' ' | cut -c10-18` echo -e $net.$host ' ' $send ' ' $recv >> $log done
# zerowanie liczników iptables $ipt -Z
# usunięcie plików tymczasowych rm /tmp/recv.stat rm /tmp/send.stat
# $Id: traffic_ipt.sh,v 1.2 2003/09/09 19:52:40 alec Exp <cut here>
Plik bandlogger wygalda tak: <cut here> use DBI; use POSIX;
my $dbase = DBI->connect ("DBI:mysql:database=lms;host=localhost","lms","sruba200 0", { RaiseError => 1 }); my $iptbin = "/sbin/iptables"; my $year = strftime("%Y",localtime()); my $day = strftime("%d",localtime()); my $month = strftime("%m",localtime());
sub u32todotquad($) { my $p = shift @_; return sprintf "%d.%d.%d.%d", ($p>>24)&0xff,($p>>16)&0xff, ($p>>8)&0xff, $p&0xff; }
open(OUTFILE, ">/etc/rc.d/rc.stats");
print OUTFILE "#!/bin/bash\n"; print OUTFILE "$iptbin -t mangle -F\n"; print OUTFILE "$iptbin -t mangle -X\n";
my $dbq = $dbase->prepare("SELECT ipaddr, id FROM nodes");
$dbq->execute();
while (my $row = $dbq->fetchrow_hashref()) { my $id = $row->{'id'}; $id += 1000; $row->{'ipaddr'} = u32todotquad($row->{'ipaddr'}); print OUTFILE "$iptbin -t mangle -A FORWARD -i eth1 -o eth0 -d $row->{'i paddr'} -j MARK --set-mark $row->{'id'}\n"; print OUTFILE "$iptbin -t mangle -A OUTPUT -p tcp --sport 1080 - d $row-> {'ipaddr'} -j MARK --set-mark $row->{'id'}\n"; print OUTFILE "$iptbin -t mangle -A OUTPUT -p tcp --sport 8080 - d $row-> {'ipaddr'} -j MARK --set-mark $row->{'id'}\n"; print OUTFILE "$iptbin -t mangle -A OUTPUT -p tcp --sport 3128 - d $row-> {'ipaddr'} -j MARK --set-mark $row->{'id'}\n"; print OUTFILE "$iptbin -t mangle -A FORWARD -i eth0 -o eth1 -s $row->{'i paddr'} -j MARK --set-mark $id\n"; print OUTFILE "$iptbin -t mangle -A INPUT -p tcp --dport 1080 - s $row->{ 'ipaddr'} -j MARK --set-mark $id\n"; print OUTFILE "$iptbin -t mangle -A INPUT -p tcp --dport 8080 - s $row->{ 'ipaddr'} -j MARK --set-mark $id\n"; print OUTFILE "$iptbin -t mangle -A INPUT -p tcp --dport 3128 - s $row->{ 'ipaddr'} -j MARK --set-mark $id\n"; }
<cut here> close OUTFILE;
my @info = `/sbin/iptables -t mangle -L -v -n -x|grep MARK`; system("/etc/rc.d/rc.stats");
foreach my $line (@info) { $line =~ s/^[ ]+([0-9]+)[ ]+([0-9]+).* MARK set 0x([0-9a-f]+)/ \1 \2 \3/g ; my ($pkts,$bytes,$markid) = split(' ',$line); $markid = hex($markid); my $nid = $markid; $nid -= 1000 if ($markid > 1000); $dbq = $dbase->prepare("SELECT download, upload FROM traffic WHERE nodei d='$nid' AND year='$year' AND month='$month' AND day='$day'"); $dbq->execute(); my $row = $dbq->fetchrow_hashref(); my $download = $row->{'download'}; my $upload = $row->{'upload'}; $download += $bytes if ($markid < 1000); $upload += $bytes if ($markid > 1000); $dbq = $dbase->prepare("DELETE FROM traffic WHERE nodeid='$nid' AND year ='$year' AND month='$month' AND day='$day'"); $dbq->execute(); $dbq = $dbase->prepare("INSERT INTO traffic (nodeid, year, month, day, d ownload, upload) VALUES ('$nid', '$year', '$month', '$day', '$download', '$uploa d')"); $dbq->execute(); } <cut here>
Oczywiscie utworzylem w mysql tabele:
# CREATE TABLE traffic ( # year int(11) NOT NULL default '0', # month int(11) NOT NULL default '0', # day int(11) NOT NULL default '0', # nodeid int(11) NOT NULL default '0', # upload int(11) NOT NULL default '0', # download int(11) NOT NULL default '0', # PRIMARY KEY (year,month,day,nodeid) # ) TYPE=MyISAM;
Jak klikne na statystyki pokazuje mi sie tylko rok 1970 i nie moge wybrac innego co jeszcze zle zrobilem badz nie skonfigurowalem ?
w sekcja pliku lms.ini dotyaczac trafiku wyglada tak: ; ---------------------------------------------------------------------- ----- ; Konfiguracja skryptu do logowania ruchu na iptables - ; lms-traffic-logiptables ; ---------------------------------------------------------------------- -----
[traffic-logiptables]
; Plik gdzie maj± być logowane statystyki. Domy¶lnie - nieustawione. ; logfile = /var/log/traffic.log
; Plik gdzie ma być zapisany skrypt do ustawienia reguł iptables (plik ten ; zostanie wykonany zaraz po zakończeniu skryptu). Domy¶lnie - ; /etc/rc.d/rc.stats
outfile = /etc/rc.d/rc.stat
; ¦cieżka do binarki iptables, domy¶lnie: /usr/sbin/iptables
iptables_binary = /sbin/iptables
; Interfejs od strony internetu, czyli nazwa urz±dzenia sieciowego przez ; które idzie ruch do internetu. Domy¶lnie - nieustawione. Można ustawić ; kilka interfejsów oddzielaj±c ich nazwy spacjami.
wan_interfaces = eth0
; Lista portów lokalnych które mamy traktować także jako ruch do internetu, ; np. możemy logować ruch do proxy na porty 8080 i 3128. Domy¶lnie nie ; ustawione. Można wpisać kilka portów i/lub zakresów portów oddzielonych ; spacjami, na przykład:
local_ports = 3128 1080 65000-65010
; UID wła¶ciciela skryptu. Domy¶lnie: 0 (root) script_owneruid = 0
; GID wła¶ciciela skryptu. Domy¶lnie: 0 (root)
script_ownergid = 0
; Uprawnienia pliku skryptu. Domy¶lnie: 700 (rwx------) script_permission = 700
Za kazda pomoc bede wdzieczny
Pozdrawiam
Grzegorz Jakóbik