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)
Wprowadzenie
Blokowanie adresu IP
Blokowanie serwisów
Blokowanie selektywne
Kolejność zasad
Pakiety SYN
Taktyka łańcucha
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