Iptables to program sterujący filtrem pakietów (głównie używanym jako zapora sieciowa bądź NAT) opracowany dla systemu operacyjnego Linux. Autor Rusty Russell napisał pierwszą wersję w 1998 roku w języku C. Program może być używany jako filtr pakietów, bądź tzw. stanowa zapora dla systemów Linux z jądrem począwszy od serii 2.4.x, kontrolujący połączenia wchodzące i wychodzące do sieci komputerowej lub stacji roboczej. Wymaga jądra skompilowanego z modułem ip_tables. [Wikipedia...]
Wydając polecenie:
iptables -L
Możemy dowiedzieć się, jakie reguły zostały wprowadzone do systemu.
Na zrzucie poniżej przedstawiono wynik działania polecenia.
Jak widać żadnych reguł jeszcze nie wprowadzono. Wykonamy prostą konfigurację, dzięki której możliwy będzie routing na konfigurowanym serwerze. Dodatkowo dodamy przekierowania dla konkretnych adresów IP i domen oraz zezwolimy/zabronimy dostępu do konkretnych usług zainstalowanych na serwerze.
Przykłady wpisów IPTABLES można znaleźć na stronie: www.iptables.pl
W celu prostej konfiguracji i rozbudowy skryptów utworzymy plik:
/etc/router
w którym wpiszemy kolejne reguły dla poszczególnych usług. Wpisane reguły obowiązują tak długo, jak długo uruchomiony jest serwer, lub do czasu ich wyczyszczenia z tablicy. Z tego powodu pierwszą regułą w pliku /etc/router powinno być wyczyszczenie wszystkich reguł. Wyczyszczenie reguł następuje poprzez podanie parametru -F.
iptables -F
iptables -t nat -F
powyższe instrukcje wyczyszczą reguły z tabel filter (tabela domyślna) oraz nat. Umieszczenie powyższych poleceń na początku pliku /etc/router da nam pewność, że tablica zostaną wyczyszczone przed dodaniem nowych wpisów. Dobrym zwyczajem jest dodanie na początku również wpisów blokujących całkowicie ruch wchodzący, wychodzący oraz routing. Dzięki takiemu rozwiązaniu będziemy mogli udostępnić wyłącznie te usługi, które chcemy – reszta zostanie zablokowana. Zablokowanie dostępu dla wszystkich pakietów uzyskamy wpisując:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
W tym momencie wszystkie pakiety przychodzące na serwer zostaną odrzucone (łańcuch INPUT), wszystkie pakiety wychodzące z serwera (łańcuch OUTPUT) zostaną odrzucone oraz wszystkie pakiety, które powinny być routowane zostaną odrzucone (łańcuch FORWARD). W tym momencie mamy przygotowany grunt do utworzenia niezbędnych regułek. Sprawdzimy, czy rzeczywiście ograniczyliśmy dostęp do serwera. Z pozycji Windows 7 wykonamy „pingowanie”.
Ping 192.168.14.1
W efekcie powinniśmy otrzymać komunikat, że upłynął limit czasu żądania. Na poniższym zrzucie pokazano efekt działania polecenia ping z systemu Windows 7.
Jak widać nasz serwer nie odpowiada na komunikaty echa (ICMP), ponieważ w regułach wpisaliśmy, że wszystkie pakiety ma odrzucać. Dodamy wpisy reguł, które umożliwią odpowiadanie na pingi.
iptables -A INPUT -p ICMP -j ACCEPT
iptables -A OUTPUT -p ICMP -j ACCEPT
Komunikaty echa, to pakiety, które trzeba odebrać i odesłać, dlatego należy dodać wpis zarówno do łańcucha wejściowego jak również do łańcucha wyjściowego. Poszczególne fragmenty wpisów oznaczają:
-A INPUT – dodanie wpisu do łańcucha wejściowego (może być OUTPUT, FORWARD),
-p ICMP – protokół, którego dotyczy wpis (może być TCP, UDP),
-j ACCEPT – co zrobić z pakietem (zaakceptować, DROP odrzucić, REJECT odrzucić z powiadomieniem nadawcy).
Poniżej potwierdzenie prawidłowego działania reguł ICMP:
W analogiczny sposób skonfigurujemy dostęp do serwera HTTP zainstalowanego na serwerze.
iptables -A INPUT -p TCP –dport http -j ACCEPT
W tym momencie pojawia się problem... Dodanie analogicznego wpisu dla strumienia wyjściowego nie spowoduje prawidłowego funkcjonowania usługi. Związane jest to z faktem, że serwer nasłuchuje na porcie 80, ale transmisja odbywa się z wykorzystaniem innego uzgodnionego portu. Ta sama sytuacja dotyczy innych usług. Najprostszym rozwiązaniem jest umożliwienie ruchu wyjściowego dla wszystkich portów i zablokowanie tylko wybranych. Należy zmienić wpis:
iptables -P OUTPUT DROP
na
iptables -P OUTPUT ACCEPT
Po tej modyfikacji serwer będzie odpowiadał na zapytania HTTP. Dodamy jeszcze jeden analogiczny wpis dla protokołu SSH:
iptables -A INPUT -p TCP –dport ssh -j ACCEPT
Cały gotowy skrypt będzie wyglądał w sposób następujący:
iptables -F
iptables -t nat -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -p ICMP -j ACCEPT
iptables -A OUTPUT -p ICMP -j ACCEPT //w zasadzie nie potrzebne
iptables -A INPUT -p TCP –dport http -j ACCEPT
iptables -A INPUT -p TCP –dport ssh -j ACCEPT
Następnym krokiem w konfiguracji serwera będzie dodanie reguł dla ruchu przechodzącego (FORWARD). Umożliwi to dostęp maszynom klienckim do sieci Internet. Najprostszym sposobem na konfigurację dostępu do sieci jest dokonanie dwóch wpisów w łańcuchu FORWARD:
iptables -A FORWARD -s 192.168.14.0/24 -j ACCEPT
iptables -A FORWARD -d 192.168.14.0/24 -j ACCEPT
Aby reguły łańcucha FORWARD zadziałały należy włączyć w jądrze moduł odpowiedzialny za przekazywanie pakietów:
echo 1 > /proc/sys/net/ipv4/ip_forward
oraz
iptables -t nat -A POSTROUTING -j MASQUERADE
Po wykonaniu powyższych czynności komputer kliencki będzie miał dostęp do sieci Internet (pod warunkiem, że serwer ma dostęp do Internetu).
Powyższy zrzut pokazuje trasę pakietu z komputera klienckiego do serwera interia.pl.
W następnym kroku zablokujemy dostęp do witryny internetowej o podanej nazwie. Zablokowanie całego ruchu do domeny uzyskamy wpisując:
iptables -I FORWARD -d wp.pl -j DROP
Ostatnim testowanym elementem będzie przekierowanie całego ruchu na serwer wewnętrzny. Składnia polecenia iptables została podana poniżej:
iptables -A PREROUTING -t nat -s 192.168.14.0/24 -p tcp
- -dport 1:65535 -j DNAT - -to- 192.168.14.1:8001
Powyższe polecenie przekierowuje cały ruch TCP na serwer lokalny na port 8001. W podobny sposób można przekierować ruch z konkretnego hosta, lub na konkretny port.
Przykład działania przekierowania pokazano na zrzucie:
Pakiet iptables ma bardzo duże możliwości konfiguracyjne. Przykładowe wpisy IPTABLES znnajdują się na stronie iptables.pl