
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).
Copyright
(C) 2000-2002 by Grzegorz Lewandowski
All rights reserved