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 :)