Firewalls; IPtables i zasady

autor David LeCount    2001, Czerwiec, Środa 13-tego

Tłumaczenie:  30.09.2001
        Tom Breza via  Tom.B@PCService-NET.co.uk irc: #debian.pl (siaraX)
        Grzegorz Szurkało szurek@hoth.amu.edu.pl #debian.pl (GrZeNiU)


Dokument opisuje podstawy użytkowania IPtables bez zagłębiania się w bardziej zaawansowane opcje filtra. Napisany został w standardzie iso-8859-2.
Oryginalne pochodzenie tłumaczenia dokumentu: http://hoth.amu.edu.pl/~szurek

Wprowadzenie
Blokowanie adresu IP
Blokowanie serwisów
Blokowanie selektywne
Kolejność zasad
Pakiety SYN
Taktyka łańcucha


Wprowadzenie up

    Jestem pewny, że wielu z was zastanawiało się jak użyć IPtables, żeby zbudować prosty Firewall. Ja zastanawiałem się nad tym samym przez długi czas, dopóki ostatnio nie wywnioskowałem jak to zrobić.  Spróbuje wyjaśnić podstawy, żebyś mógł wystartować.

    Najpierw musisz wiedzieć, jak Firewall traktuje pakiety wchodzące, wychodzące oraz przekazywane  przez Twój komputer.
W zasadzie, dla każdej z tych dróg jest łańcuch . Każdy pakiet wchodzący do Twojego komputera przechodzi przez łańcuch INPUT.
Każdy pakiet, który Twój komputer wysyła przez sieć, przechodzi przez łańcuch OUTPUT. Każdy pakiet, który przechodzi przez twój komputer i jest przekazywany dalej do sieci (LAN), przechodzi przez łańcuch FORWARD. Zrozumienie łańcuchów to połowa sukcesu.

    Sposób działania IPtables opiera się na ustalaniu pewnych zasad dla każdego łańcucha, które kontrolują wszystko, co się dzieje z pakietem danych przechodzącym przez nie. Dla przykładu, jeżeli Twój komputer wyśle pakiet do www.yahoo.com prosząc o stronę HTML, pakiet musi najpierw przejść przez łańcuch OUTPUT. Jądro systemu może sprawdzić zasady w łańcuchu i zobaczyć, czy któraś z nich pasuje. Pierwsza, która będzie pasować, decyduje o wyjściu pakietu. Jeżeli żadna z zasad nie będzie pasować, wtedy domyślna polityka łańcucha zadecyduje o losie danego pakietu. Następnie odpowiedź nadchodząca z Yhoo musi przejść przez łańcuch INPUT. To jest cala filozofia IPtables....


Blokowanie adresu IP up

    Teraz, jak już rozumiemy podstawy, możemy zacząć używać tego w praktyce. Jest dużo rożnych liter do zapamiętania kiedy używasz IPtables, i prawdopodobnie będziesz musiał rzucić okiem na stronę podręcznika, żeby sobie przypomnieć jakąś konkretną. Spróbujmy  manipulacji z konkretnym adresem IP. Załóżmy, że chcesz zablokować wszystkie pakiety przychodzące z 200.200.200.1 Na początku jest -s użyte do wyspecyfikowania źródłowego IP (source) albo nazwa DNS:  

iptables -s 200.200.200.1

    To jednak nie powie jądru systemu, co zrobić z tymi pakietami. Opcja -j jest używana żeby wyspecyfikować, co się stanie z pakietem.
Najpopularniejsze trzy opcje to ACCEPT (akceptacja) REJECT (wyprzeć się) i DROP (odrzucić) W tym momencie pewnie wywnioskowałeś, że ACCEPT nie jest tym co my chcemy. REJECT wysyła wiadomość z powrotem do nadawcy, że nie akceptuje połączenia. DROP totalnie olewa pakiet. Jeżeli jesteśmy naprawdę podejrzliwi wobec tego konkretnego adresu IP, prawdopodobnie wybierzemy DROP zamiast REJECT. Oto nasza komenda :

iptables -s 200.200.200.1 -j DROP

    Ta pojedyncza komenda może poinstruować naszą maszynę, żeby ignorowała wszystko co przychodzi z 200.200.200.1 ( z wyjątkami, ale o tym powiemy później) Układ nie ma znaczenia opcja -j DROP może być przed -s 200.200.200.1 . Ja po prostu lubię wyjście (cel)  zasady mieć na końcu komendy. W tym momencie jesteśmy w stanie ignorować konkretny komputer w sieci. Jeżeli chcesz, aby Twój komputer nie "rozmawiał" z jakimś komputerem w sieci, porostu zmień zasadę z INPUT do OUTPUT i zamiast -s wstaw -d dla destination. Nie jest to zbyt trudne, prawda??

Blokowanie serwisów up

    A co, jeśli chcemy ignorować tylko żądania połączenia telnetowego od  zdalnego komputera? To również nie jest trudne. Można określić port 23 lub użyć słowa telnet.
Są tutaj  przynajmniej trzy protokoły, jakie możesz wyspecyfikować: TCP, UDP, ICMP. Telnet, jak większość serwisów, używa TCP wiec musimy to określić. Opcja -p wybiera protokół. TCP jednak nie powie komputerowi wszystkiego; telnet jest tylko specyficznym protokołem użytym na większym protokole z TCP. Po tym, jak wyszczególniliśmy, że używamy TCP, możemy użyć --destination-port (--dport jest aliasem), aby oznaczyć port, na którym próbują się z nami połączyć. Upewnij się, że nie pomyliłeś source i destination (źródłowy i docelowy) port. Zapamiętaj, że klient telneta może być uruchomiony na każdym porcie, ale serwer, który jest uruchomimy będzie nasłuchiwać na porcie 23 ( od tłumacza: o ile nie zastosujemy przekierowania portów ;) ) Każdorazowo, aby zablokować konkretny serwis, będziesz używać --destination-port. Przeciwne jest --source-port (alias to: --sport).
 Złóżmy więc to wszystko razem:

iptables -A INPUT -s 200.200.200.1 -p tcp --destination-port telnet -j DROP

No i mamy. Jeżeli będziesz chciał wyspecyfikować grupę adresów IP, możesz użyć 200.200.200.0/24. To wyselekcjonuje każdy IP, który będzie pasować do maski 200.200.200.*

Blokowanie selektywne up

    Teraz jest czas, aby złapać większą rybę. Powiedzmy, że masz, tak jak ja, sieć lokalną oraz połączenie do Internetu. Założymy również, że połączenie z LAN-em jest przez eth0, a połączenie z Internetem przez ppp0. Chcemy na przykład, aby usługa telnetu była dostępna tylko w LAN'ie. Jest na to łatwe rozwiązanie. Możemy użyć -i dla wejściowego interfejsu, i -o dla wyjściowego. Mógłbyś zawsze zablokować to na łańcuchu OUTPUT, ale raczej zablokujemy to na łańcuchu INPUT, przez co serwer telneta nie zobaczy nawet zapytania. Dlatego użyjemy -i.
Tak powinna wyglądać nasza zasada:

iptables -A INPUT -p tcp --destination-port telnet -i ppp0 -j DROP

To powinno zamknąć  port dla wszystkich połączeń z Internetu, oraz pozostawić otwarty po stronie  LAN'u.


Kolejność zasad up

    Zanim pójdziemy robić bardziej poważne rzeczy, chciałbym wyjaśnić pobieżnie inne sposoby manipulacji zasadami. Opcja "-A" dodaje zasadę do końca listy, czyli oznacza to ze wszystkie zasady zostaną sprawdzone zanim dojdzie to tej. Jeśli chcemy wstawić zasadę przed końcem łańcucha, użyjemy "-I" dla wstaw (insert) To wstawi zasadę w numerycznej kolejności w łańcuchu (od tłumacza - domyślnie na początku łańcucha).
Dla przykładu: jeśli chcemy wstawić ją na początku łańcucha INPUT, użyjemy " -i INPUT 1 " . Wystarczy zmienić "1" na inne miejsce, w którym ma się znaleźć zasada. Teraz powiedzmy, że chcemy zastąpić daną zasadę. Aby tego dokonać użyjemy "-R" (replace). Jest taka sama składania jak w "-I" i działa tak samo, tyle że starą zasadę zastępuje nową. Jeżeli chcemy skasować zasadę użyjemy "-D". To również ma bardzo podobną składnię jak poprzednie. Możesz użyć zarówno numerów wierszy jak też wpisać całą zasadę. Metoda z numerami jest zazwyczaj optymalnym wyjściem. Opcja "-L" wylistuje wszystkie zasady jakie ustawiliśmy do tej pory. Opcja "-F" (flush - wyczyść zasady) czyści konkretny łańcuch. Jeżeli nie określisz, który łańcuch ma być wyczyszczony, zostaną wyczyszczone wszystkie.


Pakiety SYN up

    Wiemy, że pakiety używają pewnych protokołów. Jeżeli użytym protokołem jest TCP, wtedy określa się konkretny port. Teraz może doszedłeś do wniosku, żeby zamknąć po prostu wszystkie porty z przychodzącymi połączeniami. Zapamiętaj  jednak, że w momencie, kiedy Twój komputer zacznie nawiązywać połączenie z innym komputerem, tamten komputer musi mieć możliwość odsyłania danych kanałem zwrotnym. Jeżeli zamkniesz wszystkie porty, sprawisz,  że połączenia zwrotne przychodzące z innych maszyn będą odrzucane. Dla większości  bez-serwisowych programów nie możesz przewidzieć przez jaki port będą się one komunikować. Jest sposób, aby to poprawnie skonfigurować. Kiedy Twój komputer nawiązuje połączenie przez TCP, połączenie takie musi być zainicjalizowane. To jest zadanie pakietu SYN. Pakiet SYN mówi drugiemu komputerowi, że wysyłająca go maszyna jest gotowa nawiązać połączenie. Teraz  komputer żądający połączenia z danym serwisem wysyła pakiet SYN. Jeśli blokujesz tylko przychodzące pakiety SYN, wstrzymujesz inne komputery od otworzenia serwisu na Twoim komputerze, ale nie wstrzymujesz Twojego komputera do komunikacji z nimi. Opcja używana do tego to "--syn". Wpisuje się ją po tym jak wyselekcjonowałeś protokół TCP. Żeby więc stworzyć zasadę, która będzie blokować wszystkie przychodzące połączenia z Internetu wpisz:

iptables -A INPUT -i ppp0 -p tcp --syn -j DROP


Taktyka łańcucha up

Ostatnia rzecz, która chciałbym opisać to  zmiana taktyki dla łańcucha. Łańcuchy INPUT i OUTPUT domyślnie ustawione są na ACCEPT, a łańcuch FORWARD jest ustawiony na REJECT. Jeżeli chcesz użyć swój komputer jako ruter, będziesz musiał ustawić łańcuch FORWARD na ACCEPT. Jak? Wszystko, co musisz zrobić to użyć opcji "-P". Tylko podaj za nią nazwę łańcucha i masz zrobione. Żeby zmienić politykę łańcucha FORWARD na ACCEPT wpisz:

iptables -P FORWARD ACCEPT

Nic trudnego, co? W tym artykule tak naprawdę przedstawiłem tylko podstawy IPtables. Informacje zamieszczone tutaj powinny pomóc w ustawieniu prostego Firewalla. Możesz studiować na stronę podręcznika "man iptables", żeby nauczyć się więcej (albo odświeżyć pamięć kiedy zapomnisz). Możesz także znaleźć bardziej treściwe dokumenty, jeżeli chcesz nauczyć się trochę bardziej zaawansowanych cech z IPtables. W momencie kiedy to pisałem, dokumenty o IPtables były mało dostępne, ponieważ technologia jest nowa. Powinno jednak wkrótce pokazać się więcej opracowań dla IPtables .
Powodzenia.



Oryginał znajduje się tutaj