LinuxStat potrafi analizować pakiety protokołu IP. W tym
celu korzysta z regułek ipchains lub iptables. Te
narzędzia służą do konfigurowania filtrów pakietów IP.
Każdy z pakietów przepływających przez jądro Linuksa może
opisany za pomocą adresu źródłowego i docelowego, użytego
protokołu, portu źródłowego i przeznaczenia oraz innych,
specjalnych flag. Regułki pozwalają określić, co należy zrobić z
pakietem, który spełnia określone warunki. Pełen opis
działania i konstruowania reguł filtrowania pakietów można
znaleźć pod adresem http://mr0vka.eu.org/tlumaczenia/index.html
iptables jest narzędziem przeznaczonym dla jąder 2.4.X, a
ipchains obsługuje jądra od 2.2.X wzwyż.
Oprócz
funkcji filtrowania programy te potrafią nadać każdemu pakietowi
specjalny numer identyfikacyjny (mark), który jest
rozpoznawalny przez jądro i współpracujące z nim narzędzia. Tą
właściwość może wykorzystywać LinuxStat do zbierania
informacji o liczbie pakietów (i bajtów), które
spełniają określone warunki i mają odpowiedni numer. Innym sposobem
powiązania regułek ipchains lub iptables jest ich identyfikacja za
pomocą nazwy łańcucha (chain) i jej kolejnego numeru.
LinuxStat musi wiedzieć z której regułki korzystać. Za pomocą specjalnego narzędzia show_ filters można zobaczyć jakie identyfikatory są przypisane poszczególnym regułkom. Po uruchomieniu tego narzędzia (domyślnie znajduje się ono w katalogu /usr/local/lstat/bin ) można zobaczyć poszczególne regułki oddzielone od siebie przerywanymi liniami. Jeżeli jest ich dużo, to warto uruchomić ten program z filtrem more np.
./show_filters | more
Kolorem czerwonym wyświetlane są
etykiety regułek składające się z nazwy łańcucha i numeru regułki.
Kolorem niebieskim oznaczone są nazwy
numerów nadanych pakietom w tej regułce.
Identyfikacja za
pomocą etykiet jest przydatna zarówno dla systemów z
ipchains jaki i z iptables. Warto przy tym zauważyć, że zmiana
kolejności regułek w łańcuchu spowoduje zmianę etykiety i w
konsekwencji pobieranie danych z innego źródła. Wady tej nie
posiada identyfikacja za pomocą numerów pakietów. Jest
ona szczególnie polecana dla ipchains. Dla iptables jej
zastosowanie jest czasami niewygodne.
Czas na przykłady:
Spróbujemy utworzyć wykres, który będzie
przedstawiał jakie pasmo łącza wykorzystuje nasz lokalny serwer WWW i
korzystające z niego osoby.
Serwer WWW do komunikacji wykorzystuje
protokół http, który opiera się na protokole TCP
z portem 80 (zobacz /etc/services) .
Może
się okazać, że w przykładach przedstawionych poniżej, do użytych
poleceń ipchanis lub iptables należy dodać ich scieżkę dostępu.
Za pomocą ipchains stworzymy regułki opisujące ruch do naszego
serwera:
dla danych przychodzących
ipchains -A input -p tcp --dport 80 -m 1
dla danych wychodzących:
ipchains -A output -p tcp --sport 80 -m 2
Opcja -m dla ipchains nadaje wszystkim pakietom
spełniającym tą regułkę odpowiedni numer identyfikacyjny (w naszym
przykładzie liczby 1 i 2)
Dla iptables te regułki wyglądałyby
następująco:
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1 iptables -t mangle -A OUTPUT -p tcp --sport 80 -j MARK --set-mark 2
Można tu także użyć metody z etykietami, wtedy te regułki dla iptables mogłyby być prostsze np:
iptables -A INPUT -p tcp --dport 80 iptables -A OUTPUT -p tcp --sport 80
Teraz czas na sprawdzenie naszych regułek. Najlepiej można to
zaobserwować wywołując polecenie:
watch -d ./show_filters -b
W tym czasie należy pobrać parę stron z serwera WWW. Liczby pakietów
i bajtów w liniach odpowiednich regułek powinny się
zmieniać.
Gdy regułki działają poprawnie, można je "podłączyć"
do wykresu. W tym celu tworzymy nowy wykres typu Statystyki
pakietów IP. Można to zrobić naciskając przycisk
Ustawienia na pasku lewego menu, a potem Nowy wykres. W
sekcji zaawansowanych właściwości
należy dodać dwa nowe elementy. Będą to linie (lub słupki) pokazujące
ruch wejściowy i wyjściowy. Dla wejścia w polu Filtr danych
należy wpisać wyrażenie m1, a dla wyjścia m2. Są to te
same numery, które nadaliśmy podczas tworzenia regułek.
Dziesiętną liczbę z regułek należy poprzedzić literą m. Takie
zmienne można ze sobą dodawać lub odejmować. Np. możemy utworzyć
trzecią linię wykresu, opisującą sumę danych wejściowych i
wyjściowych. W polu filtr danych należy wówczas wpisać m1+m2.
Dla wersji z etykietami należałoby wpisać nazwy INPUT1
i OUTPUT1 lub inne, pokazane przez
show_filters
Po dodaniu opisów i ustawieniu
pozostałych opcji należy zapisać zmiany. Tak utworzony wykres
najlepiej testować korzystając z obserwacji na
bieżąco. Dzięki niej już po kilkunastu sekundach możemy się
przekonać jak "pracują" nasze regułki.
Po pomyślnym zakończeniu tej konfiguracji należy zadbać, aby po ponownym uruchomieniu systemu regułki zostały uaktywnione. W tym celu należy je zintegrować z używanymi skryptami startowymi. W RedHacie można do tego użyć poleceń:
/etc/rc.d/init.d/ipchanis save
lub dla iptables
/etc/rc.d/init.d/iptables save
które zapisują używane regułki do pliku i odtwarzają je po starcie. W takim przypadku nie należy zapomnieć o uaktywnieniu odpowiedniej usługi (polecenie setup)
Mała sieć korzysta z maskarady zrealizowanej na routerze linuksowym, współpracującym z modemem (SDI, ADSL). Jesteśmy ciekawi jaką przepustowość połączenia z Internetem wykorzystuje każdy z komputerów sieci lokalnej. Ruch skierowany tylko do routera chcemy pominąć. Komputery mają adresy HOST1, HOST2, HOST3 i są podłączone do interfejsu eth0 routera. Wyjście na świat jest poprzez interfejs ppp0.
#!/bin/sh IPCHAINS=/sbin/ipchains #local adresses LOCALNET=192.168.0.0/24 #external IP address EXT_IP=217.96.156.181 INT_IP=192.168.0.1 INT_INTERFACE=eth0 #IP hosts to monitor HOST1=192.168.0.2 HOST2=192.168.0.3 HOST3=192.168.0.4 #accept packets direct to external IP $IPCHAINS -A forward -s $LOCALNET -d $EXT_IP -j ACCEPT #mark & masq packets form monitoring hosts to Internet $IPCHAINS -A forward -s $HOST1 -j MASQ -m 2 $IPCHAINS -A forward -s $HOST2 -j MASQ -m 3 $IPCHAINS -A forward -s $HOST3 -j MASQ -m 4 #masq another hosts form localnet $IPCHAINS -A forward -s $LOCALNET -j MASQ #not count pakcets form routers interfaces $IPCHAINS -A output -s $INT_IP -d $LOCALNET -i $INT_INTERFACE -j ACCEPT $IPCHAINS -A output -s $EXT_IP -d $LOCALNET -i $INT_INTERFACE -j ACCEPT #output for monitoring hosts $IPCHAINS -A output -d $HOST1 -i $INT_INTERFACE -j ACCEPT -m 102 $IPCHAINS -A output -d $HOST2 -i $INT_INTERFACE -j ACCEPT -m 103 $IPCHAINS -A output -d $HOST3 -i $INT_INTERFACE -j ACCEPT -m 104
Po przetestowaniu tych regułek (zob. przykład wyżej) należy utworzyć
wykres (lub 3, dla każdego oddzielnie). Jako wyrażenia Filtrów
danych należy użyć:
dla HOST1 - (m2
- wyjście m102-wejście)
dla HOST2 -
(m3 - wyjście m103
- wejście)
dla HOST3 - ( m4 - wyjście
m104-wejście)
Dalsze kroki analogicznie jak w przykładzie wyżej.
Dla iptables należy użyć identyfikacji regułki za pomocą nazwy łańcucha i kolejnego numeru. Aby zapobiec zmianie kolejności regułek, zostanie użyty nowy łańcuch, przeznaczony wyłącznie do statystyk. Przykładowy skrypt ustawiający regułki mógłby wyglądać tak:
#!/bin/sh IPTABLES=/sbin/iptables #local adresses LOCALNET=192.168.0.0/24 #external IP address EXT_IP=217.96.156.181 EXT_INTERFACE=ppp0 INT_IP=192.168.0.1 INT_INTERFACE=eth0 #IP hosts to monitor HOST1=192.168.0.2 HOST2=192.168.0.3 HOST3=192.168.0.4 #set masq for outgoing packets (may require load some modules) $IPTABLES -t nat -A POSTROUTING -o $EXT_INTERFACE -j SNAT --to-source $EXT_IP #create chain for statistic $IPTABLES -N lstat #add rules for host1 $IPTABLES -A lstat -i $INT_INTERFACE -s $HOST1 -j ACCEPT $IPTABLES -A lstat -m state --state ESTABLISHED,RELATED -d $HOST1 -j ACCEPT #add rules for host2 $IPTABLES -A lstat -i $INT_INTERFACE -s $HOST2 -j ACCEPT $IPTABLES -A lstat -m state --state ESTABLISHED,RELATED -d $HOST2 -j ACCEPT #add rules for host3 $IPTABLES -A lstat -i $INT_INTERFACE -s $HOST3 -j ACCEPT $IPTABLES -A lstat -m state --state ESTABLISHED,RELATED -d $HOST3 -j ACCEPT #set rules for forward #first try statistic chains $IPTABLES -A FORWARD -j lstat #for others hosts $IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT #default DROP packets $IPTABLES -P FORWARD DROP
Po przetestowaniu tych regułek należy utworzyć wykres (lub 3, dla
każdego oddzielnie). Jako wyrażenia Filtrów danych
należy użyć:
dla HOST1 - (lstat1 -
wyjście lstat2 - wejście)
dla HOST2 -
(lstat3 - wyjście lstat4
- wejście)
dla HOST3 - ( lstat5 -
wyjście lstat6 - wejście)
Uwaga
Przedstawione powyżej
regułki są tylko przykładem i nie należy ich traktować
dosłownie. Służą one do przedstawienia idei i nie muszą działać w
Twoim systemie. Należy wybrać ich odpowiedni fragment i przystosować
do własnego systemu.