Spis treści Wstecz Dalej

Filtry danych IP

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://lukasz.bromirski.net/docs/translations.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:

Przykład

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ń ipchains 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/ipchains 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)

Inne przykłady regułek

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 $INT_INTERFACE -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.


Spis treści Wstecz Dalej