LINUX
Ipchains - reguły ściany ogniowej

 

Ogólnie można powiedzieć, iż ściana ogniowa (firewall) to system, który ma za zadanie chronić sieć lokalną przed siecią globalną. Przez firewall przechodzi cały ruch sieciowy, zanim wejdzie do sieci lokalnej. Może mieć on postać routera, który filtruje przychodzące i wychodzące pakiety danych, bądź w bardziej złożonej postaci - jest to cała sieć routerów i serwerów, których zadaniem jest zapewnienie bezpieczeństwa poprzez eliminację niepożądanego ruchu sieciowego. Utworzenie routera filtrującego w systemie Linux możliwe jest dzięki doskonałemu narzędziu, jakim jest ipchains.
Generalnie jądro systemu dzieli ruch firewalla na trzy kategorie i do każdej z nich stosuje inny filtr. Wchodzący ruch, zanim zostanie zaakceptowany, jest testowany według zasad wchodzącej ściany ogniowej. Wychodzący ruch przed wysłaniem jest testowany zgodnie z regułami wychodzącej ściany ogniowej natomiast ruch, który jest przekazywany poprzez system, jest testowany zgodnie z regułami dla przekazującej ściany ogniowej. Oprócz tych trzech standardowych kategorii, czyli: wchodząca ściana ogniowa (input), wychodząca ściana ogniowa (output) oraz przekazująca ściana ogniowa (forward) użytkownik może definiować także własne kategorie. Jądro dla każdej z kategorii utrzymuje listę reguł nazywanych łańcuchami.
W celu utworzenia, usunięcia bądź dokonania innej operacji na łańcuchu, można korzystać z następujących opcji polecenia ipchains:

-A - dodaje regułę na koniec łańcucha

-C - sprawdza pakiet zgodnie z regułami w łańcuchu (używany do testowania definiowanych łańcuchów)

-D - usuwa wybraną regułę z łańcucha

-F - usuwa wszystkie reguły z łańcucha

-I - wstawia regułę do łańcucha

-L - wypisuje listę wszystkich reguł w łańcuchu

-M - definiuje parametry maskowania adresu lub wypisuje aktualne ustawienia

-N - tworzy zdefiniowany przez użytkownika łańcuch o określonej nazwie

-P - ustawia domyślną zasadę postępowania dla łańcucha

-R - zastępuje regułę w łańcuchu

-S - ustawia wartość czasu oczekiwania dla maskowania IP

-X - usuwa określony łańcuch

-Z - we wszystkich łańcuchach zeruje liczniki pakietów i bajtów

Reguły ściany ogniowej składają się z filtra, do którego dopasowywane są pakiety. Gdy pakiet zostanie dopasowany, podejmowane jest działanie, które może być albo standardową zasadą, albo może wskazywać na zdefiniowany przez użytkownika łańcuch reguł, w celu dalszego przetworzenia. Standardowe zasady postępowania, to:

accept - zezwala na przejście pakietu

reject - odrzuca pakiet zwracając do nadawcy komunikat o błędzie

deny - odrzuca pakiet, a do nadawcy nie jest wysyłany żaden komunikat

masq - maskuje pakiety w ten sposób, iż wyglądają, jakby pochodziły z lokalnego hosta

redirect - bez względu na przeznaczenie, pakiet jest dostarczany do portu w lokalnym hoście

return - powrót do łańcucha, który wywołał ten łańcuch. Mówiąc prościej, oznacza to wyjście z łańcucha i użycie domyślnych zasad postępowania dla danego łańcucha.

Do konstruowania filtrów możemy użyć także parametrów polecenia ipchains:

-p protokól - definiuje protokół. Może mieć wartość numeryczną (taką, jak w pliku /etc/protocols) lub może występować, jako słowo kluczowe, np. tcp, udp, icmp lub all.

-s adres [/maska] [port[:port]] - definiuje źródło pakietu. Adres może być nazwą hosta, nazwą sieciową lub numerem IP z opcjonalną maską adresową. Port może być nazwą lub numerem z pliku /etc/services. Zakres portów może być określony jako port:port. Jeśli wartość port nie jest określona, reguła dotyczy wszystkich portów.

-d adres [/maska] [port[:port]] - definiuje adres przeznaczenia pakietu.

-j cel - określa standardowe zasady postępowania lub zdefiniowany przez użytkownika łańcuch, do którego powinna być przekazana kontrola

-i nazwa - określa nazwę interfejsu. Może użyć częściowej nazwy, np. eth+, czyli dana reguła ma zastosowanie do wszystkich interfejsów Ethernet, rozpoczynających się od eth

-b - wskazuje regułę pasującą do danego pakietu IP w obu kierunkach.

Nie są to wszystkie parametry polecenia ipchains, jednak już znajomość tych, które wymieniłem, z powodzeniem wystarcza, by skonstruować odpowiednie reguły. A oto konkretne przykłady:

ipchains -A input -d 192.168.1.2 25 -j accept

Na podstawie tej reguły akceptowane będą pakiety, jeżeli adres docelowy i port są prawidłowe. W powyższym przykładzie na port 25 (SMTP) będzie przyjmowany pakiet od lokalnego hosta o numerze IP 192.168.1.2, natomiast reguła:

ipchains -A input -p tcp -s 0/0 -d 212.160.100.10 139 -j DENY -i eth0

wskazuje, iż pakiety w protokole tcp pochodzące z każdego źródła i jakiegokolwiek portu skierowane na port nr 139 maszyny o nr IP 212.160.100.10 będą odrzucane i reguła ta dotyczy interfejsu eth0.
Warto skonstruować sobie plik zawierający potrzebne reguły i umieścić jego wywołanie w pliku startowym maszyny (np. /etc/rc.d/rc.local lub w innym, zależnie od dystrybucji). W początkowej części takiego pliku powinieneś umieścić linie:

ipchains -F input
ipchains -F output
ipchains -F forward
ipchains -P input ACCEPT
ipchains -P output ACCEPT
ipchains -P forward DENY

A w następnej kolejności należy zablokować wszystko (zarówno w filtrze input, jak i output) poprzez np. taki wpis:

ipchains -A input -s 0/0 -d 212.160.100.10 -j DENY -i eth0
ipchains -A output -s 0/0 -d 212.160.100.10 -j DENY -i eth0

Zakładając, iż adres 212.160.100.10 jest nr IP naszego serwera, to poprzez dodanie powyższej reguły zablokowaliśmy dostęp do naszej maszyny, jak i wyjście przez interfejs eth0. Kolejnymi regułami w pliku powinny być reguły umożliwiające korzystanie przez określone hosty z określonych usług, np.:

ipchains -I input -p tcp -s 0/0 -d 212.160.100.10 22 -j ACCEPT -i eth0
ipchains -I input -p tcp -s 0/0 -d 212.160.100.10 113 -j ACCEPT -i eth0

Jak zapewne zauważyłeś, proponuję tutaj zastosowanie podobnych metod, jak przy kontroli dostępu w plikach hosts.deny i hosts.allow: najpierw zabronić wszystkim korzystania z jakichkolwiek usług, a następnie otwierać poszczególne porty umożliwiając tym samym na dostęp do serwera. Jeżeli natomiast chodzi o filtr forward, to właśnie w nim określasz reguły, dzięki którym Twoja sieć wewnętrzna może korzystać poprzez serwer z dostępu do sieci zewnętrznej. Dzieje się to dzięki opcji maskowania adresów. Jeżeli chcesz, by Twój serwer stał się routerem udostępniającym poszczególnym komputerom w sieci wewnętrznej połączenie z siecią zewnętrzną, to wystarczy dodać np. taką regułę:

ipchains -A forward -s 192.168.1.2 -d 0/0 -j MASQ -i eth0

Zakładając, iż interfejs eth0 serwera jest wyjściem na świat, to umożliwiłeś w ten sposób korzystanie z zasobów globalnej sieci użytkownikowi komputera 192.168.1.2 w Twojej sieci lokalnej! A resztę potrzebnych reguł napisz sobie już sam.
I jeszcze jedno: możliwość maskowania adresów jest również ściśle związana z pewnymi opcjami, które powinny być zaznaczone podczas kompilacji samego jądra. Standardowe jądro dystrybucji Red Hat 6x umożliwia korzystanie z maskowania adresów, pamiętaj jednak o włączeniu właściwej opcji w plikach /etc/sysconfig/network (lub /etc/sysctl.conf, jeśli używasz dstrybucji Red Hat 6.2 lub nowszej).

 

<<< powrót do strony głównej

 

Copyright (C) 2000-2002 by Grzegorz Lewandowski
All rights reserved