Monitorowanie uzytkowników za pomocą IPTABLES

Opiszę tutaj tylko fragmenty firewalla odpowiedzialne za zliczanie ruchu. Opis ten wymaga posiadania działającego firewalla i odpowiedniej wiedzy jak to wszystko połączyć razem. Poniższe programy można napisać lepiej, ale nie to jest celem w tym opisie.

Na początek fragment skryptu firewalla zliczajacy ruch:

# interfejsy
GW="ppp0"
IPGW="1.2.3.4" 		# nasz routowalny adres IP
IF="eth0"
IFIP="10.0.0.1"

# tu definiujejmy hosty ktorych adresy maskujemy
NATED_HOSTS="host1 host2 host3"

# sciezka do IPTABLES
IPT="/usr/local/bin/iptables"

# definiujemy lancuchy do zliczania ruchu, in przychodzacy, out wychodzacy
$IPT -N in_counter
$IPT -N out_counter
$IPT -N proxy_in_counter
$IPT -N proxy_out_counter

# najpierw kierujemy caly liczony ruch przez nasze lancuchy
# ruch wejsciowy ppp0 (inet > serwer)
$IPT -A FORWARD -i $GW -d ! $IPGW -j in_counter
# ruch wyjsciowy ppp0 (serwer > inet)
$IPT -A FORWARD -o $GW -d ! $IPGW -j out_counter
# Zapytania proxy (pc > proxy)
$IPT -A INPUT -i $IF -p tcp -d $IPIF --dport 8080 -j proxy_out_counter
# Odpowiedzi proxy (proxy > pc)
$IPT -A OUTPUT -o $IF -p tcp -s $IPIF --sport 8080 -j proxy_in_counter

for HOST in $NATED_HOSTS; do
    $IPT -A proxy_in_counter -d $HOST
    $IPT -A proxy_out_counter -s $HOST
    $IPT -A in_counter -d $HOST
    $IPT -A out_counter -s $HOST
done

# powyzsze linie _musza_ znajdowac sie na poczatku firewalla, czyli przed pozostalymi regulami!!!

# a to juz maskarada, gdzies w środku naszego firewalla
for HOST in $NATED_HOSTS; do
    $IPT -t nat -A POSTROUTING -o $GW -s $HOST -j MASQUERADE
done

Działa to w ten sposób, że cały ruch FORWARD (czyli maskowany) i mający port źródłowy lub docelowy 8080 (proxy) przekazujemy do naszych nowych łancuchów. Następnie w każdym z tych łańcuchów dodajemy reguły dla poszczególnych hostów. Ilość danych jest zliczana, a następnie pakiety wracają do odpowiednich łańcuchów (INPUT, OUTPUT i FORWARD), gdzie możemy je już normalnie filtrować naszym firewallem. Z tego schematu wynika, że zliczanie ruchu robimy przed regułami naszego firewala.

Po tych zabiegach, możemy wyświetlić liczniki pakietów dla poszczególnych hostów:

#iptables -L in_counter -v -x
Chain in_counter (1 references)
    pkts      bytes target     prot opt in     out     source               destination         
     120     4352            all  --  any    any     anywhere             host1             
       0        0            all  --  any    any     anywhere             host2                
     232    11460            all  --  any    any     anywhere             host3

Teraz możemy napisać prosty skrypt wyświetlający cały ruch (tylko ilości danych, bez ilości pakietów), oto przykład:

#!/usr/bin/perl
	use strict;
	my @a;
	my @b;
	my @c;
	my @d;

	open A, "iptables -L in_counter -vx| grep any|";
	open B, "iptables -L out_counter -vx| grep any|";
	open C, "iptables -L proxy_in_counter -vx| grep any|";
	open D, "iptables -L proxy_out_counter -vx| grep any|";

	while () {
		@a = split " ", $_, 9;
		@b = split " ", <B>, 9;
		@c = split " ", <C>, 9;
		@d = split " ", <D>, 9;
		print @a[7]."\t masq in: ".@a[1]."\t masq out:".@b[1]."\t Proxy in:".@c[1]."\t Proxy out: ".@d[1]."\n";
	}

Wyświtla on wynik:

host1	masq in: 0     	masq out:0      Proxy in:1421237	Proxy out: 104887
host2	masq in: 0    	masq out:0      Proxy in:6861984	Proxy out: 280621
host3	masq in: 12589	masq out:15482  Proxy in:350		Proxy out: 503

Teraz czas na skrypt dla mrtg do rysowania wykresików (suma ruchu proxy i masq):

#!/usr/bin/perl
	use strict;
	my @a;
	my @b;
	my @c;
	my @d;
	open A, "iptables -L in_counter -vx| grep host1|";
	open B, "iptables -L out_counter -vx| grep host1|";
	open C, "iptables -L proxy_in_counter -vx| grep host1|";
	open D, "iptables -L proxy_out_counter -vx| grep host1|";
	@a = split " ", <A>, 9;
	@b = split " ", <B>, 9;
	@c = split " ", <C>, 9;
	@d = split " ", <D>, 9;
	my $in = @a[1] + @c[1];
	my $out = @b[1] + @d[1];
	print $in."\n".$out."\n\n".@a[7]."\n";

Napisanie skryptów dla innych wariantów pozastawiam Tobie :).

MRTG oczekuje w pliku czterech wartosci w kolejnych liniach. Pierwsze dwie, to wartości numeryczne, które mają być przedstawiane na wykresie, trzecia linia to uptime (nie istotne), czwarta to nazwa hosta (też mało istotne).

Fragment pliku dla MRTG:

Target[host1]: '/sciezka/do/pliku/opisanego/wyzej/plik'
MaxBytes[host1]: 12500
Options[host1]: nolegend, nobanner, noinfo
Title[host1]: Wykres ruchu generowanego na łączu przez host1
PageTop[host1]: <H1>Wykres ruchu generowanego na łączu przez host1</H1>

I to na razie wszystko, opis jest krótki, ale i problem bardzo prosty :)

Copyright 2001 Sako. Kopiowanie tylko za zgodą autora.