IPTABLES - początek
From WikiDoc
Tekst oryginalny napisany przez: Prince_Kenshi
Jestem pewny, że wielu z Was zastanawiało się jak używać IPTABLES by ustawić podstawowego firewall'a. Również się nad tym zastanawiałem przez długi czas. Postaram się wytłumaczyć podstawy żeby chociaż zacząć.
Po pierwsze musisz wiedzieć jak firewall traktuje pakiety wychodzące, wchodzące czy przechodzące przez Twój komputer. Zwyczajnie jest stosowany „łańcuch” dla każdej z nich. Każdy pakiet wchodzący do twojego komputera idzie przez „łańcuch” o nazwie INPUT, zaś każdy pakiet jaki twój komputer wysyła w świat idzie przez „łańcuch” o nazwie OUTPUT. Pakiety które są pobrane z jednej sieci i wysłane do drugiej przechodzą przez „łańcuch” o nazwie FORWARD. „Łańcuchy” są połową logiki ukrytej pod IPTABLES. Pora na sposób w jaki IPTABLES pracuje jest to w jaki sposób ustawisz podstawowe zasady dla każdego z tych „łańcuchów”, dalej zadecyduje co stanie się pakietom danych przepuszczanych przez nie. Dla przykładu, jeśli twój komputer wysłał do www.google.pl zapytanie o stronę HTML'ową, to najpierw przejdzie przez „łańcuch” OUTPUT. Kernel przejrzy listę reguł w tym „łańcuchu” i sprawdzi, czy jakakolwiek pasuje. Pierwsza z brzegu pasująca zadecyduje, czy dany pakiet przejdzie. Jeśli nie będzie określonej reguły, wówczas zadziałają ograniczenia dla całości „łańcucha”. Później cokolwiek prześle Google w odpowiedzi będzie musiało przejść przez „łańcuch” INPUT. Żadnych innych komplikacji.
Teraz kiedy mamy już podstawy, możemy zacząć pracę nad przełożeniem ich na praktykę. Jest wiele różnych artykułów traktujących tą tematykę. Zacznijmy od manipulacji konkretnych adresów IP. Załóżmy, że chcemy zablokować wszelkie pakiety przychodzące z adresu 200.200.200.1. Po pierwsze, przełącznik -s jest używany by określić „źródło” - albo IP albo nazwę DNS'ową. Więc, by sprawdzić/określić ruch pochodzący z tego adresu użyjemy:
iptables -s 200.200.200.1
Jednak to nie mówi co zrobić z takimi pakietami. Przełącznik -j używamy by określić co się stanie z tymi pakietami. Podstawowymi trzema są zdarzenia ACCEPT (przyjmij), DENY (odmów) oraz DROP (porzuć). Teraz już prawdopodobnie rozumiesz co ACCEPT zrobi i że nie tego chcieliśmy. Podanie informacji DENY jako zwrotnej spowoduje że nasz komputer nie zaakceptuje połączenia. Zaś DROP spowoduje zupełnie zignorowanie pakietu. Jeśli jesteśmy naprawdę podejrzliwi co do tego adresu IP, raczej wybierzemy DROP niż DENY. Tak więc oto nasza komenda:
iptables -s 200.200.200.1 -j DROP
Jednak komputer nadal tego nie zrozumie. Jeszcze jedna rzecz pozostaje żeby to zadziałało. Trzeba użyć przełącznika -A, który to po prostu doda/dołoży nową regułę na koniec wybranego „łańcucha”. Ponieważ chcemy aby komputer nie mógł „rozmawiać” do nas, wstawimy to do „łańcucha” INPUT. Oto nasza komenda:
iptables -A INPUT -s 200.200.200.1 -j DROP
Ta prosta komenda zignoruje wszystko pochodzące z 200.200.200.1 (z pewnymi wyjątkami o których później). Kolejność przełączników nie ma znaczenia, czyli -j DROP może być wpisane przed -s 200.200.200.1. Skoro już znamy możliwość ignorowania wybranych komputerów w sieci, możemy zablokować możliwość rozmowy naszego komputera z innym, przez prostą zmianę INPUT na OUTPUT oraz zmianę przełączników z -s na -d (docelowa). Prawda, ze nie trudne?
No a co jeśli chcemy tylko ignorować zapytania telnetowe z naszego komputera. To również nie jest trudne. Pewnie wiesz, że port 23 jest dla telnetu, chociaż możesz zwyczajnie użyć słowo telnet jeśli chcesz. Występują co najmniej 3 protokoły, jakie należy rozróżnić: TCP, UDP i ICMP. Telnet podobnie jak większość usług działa na TCP. Przełącznik -p określa protokół. Jednak TCP nie mówi wszystkiego; telnet jest tylko specyficznym protokołem używanym przez większy protokół TCP. Kiedy określimy że protokołem jest TCP, możemy użyć --destination-port by wskazać port po którym będą próbować z nami rozmawiać. Upewnij się, że nie mieszasz portów źródłowych z docelowymi. Pamiętaj, że klient może występować na jakimkolwiek porcie, a jedynie serwer będzie występował na konkretnym porcie 23. W każdej chwili chcąc zablokować na wyjściu wybraną usługę, używasz --destination-port. Przeciwstawne jest --source-port. Teraz poskładajmy to razem. Oto komenda określająca co chcieliśmy:
iptables -A INPUT -s 200.200.200.1 -p tcp --destination-port telnet -j DROP
Natomiast jeśli chcesz określić zakres adresów IP, możesz użyć 200.200.200.0/24. Będzie to oznaczało IP z zakresu 200.200.200.*. Pora na coś większego. Powiedzmy, że podobnie jak ja masz sieć lokalną oraz łączysz się z internetem. Dodajmy, że LAN jest przypięty na karcie eth0, podczas gdy internet wykonany jest na ppp0. Przypuśćmy, że chcemy, aby telent mógł być wykonany w sieci lokalnej ale nie na niezabezpieczonym internecie. Jest na to prosty sposób. Możemy użyć przełącznika -i dla wejściowego interfejsu oraz -o dla wyjściowego interfejsu. Zawsze możesz zablokować to na „łańcuchu” OUTPUT, ale nie chcemy blokować tego na „łańcuchu” INPUT po to aby deamon telnetu nawet nie widział zapytania. Tu zastosujemy -i. Tak powinno ustawić się tą regułę:
iptables -A INPUT -p tcp --destination-port telnet -i ppp0 -j DROP
Tak więc to powinno zamknąć port dla każdego z internetu pozostawiając otwarte dla LANu. Zanim przejdziemy do bardziej wymyślnych rzeczy, chciałbym wyjaśnić inne sposoby ustalania reguł. Przełącznik -A dołącza regułę na koniec listy, to znaczy każda pasująca reguła przed podawaną. Jeśli chcemy umieścić regułę przed ostatnią w „łańcuchu”, użyjemy przełącznika -I by wstawiać. Wstawi to regułę w numeryczną lokalizację „łańcucha”. Na przykład, jeśli chcemy wstawić regułę na początek „łańcucha” INPUT, użyjemy „-I INPUT 1” przed resztą rozkazu. Zmień 1 na inną liczbę by ustalić pozycję reguły. Jeśli chcemy zamienić stosujemy stosujemy o tej samej składni -R a jeśli skasować -D. Jeśli chcemy sprawdzić listę reguł używamy -L. Jeśli chcemy wyczścić cały „łańcuch” używamy -F. Jeśli nie określimy „łańcucha” zostaną wyczyszczone wszystkie.
Teraz bardziej zaawansowane. Wiemy, że te pakiety używają określonego protokołu, a jeśli to TCP, wtedy również używa konkretnego portu. Możesz być zmuszony by zamknąć wszystkie porty ruchu przychodzącego, ale pamiętaj, jeśli twój komputer rozmawia z innym, ten komputer musi mu odpowiadać. Jeśli zamkniesz wszystkie przychodzące porty, wymodelujesz wyłączenie połączenia. Zaś dla większości nie-usługowych programów, nie możesz przewidzieć który port będą wykorzystywać do komunikacji. Jednak wciąż jest sposób. Kiedy dwa komputery rozmawiają po TCP, to połączenie musi zostać zainicjowane. To jest zadanie pakietu SYN. Pakiet SYN po prostu mówi innemu komputerowi, że jest gotowy do rozmawiania. Teraz tylko komputer proszący usługę wysyła pakiet SYN. Więc jeśli chcesz blokować tylko przychodzące pakiety SYN, wtedy zatrzyma inne komputery przed otwarciem usługi na twoim komputerze, ale nie zabroni tobie komunikować się z nim. Mówiąc wprost sprawi to, że twój komputer zignoruje wszystko, czego sam nie zaczął jako pierwszy. Służy do tego przełącznik --syn . By wykonać regułę blokującą cały przychodzący ruch tylko z internetu:
iptables -A INPUT -i ppp0 -p tcp --syn -j DROP
To jest ulubiona reguła jaką będziesz używać, chyba że chcesz pozwolić dla jakiegoś portu zostać otwartym, jak np. 80 (HTTP), jest na to prosty sposób. Jak wiele języków programowania, znak wykrzyknika ! Oznacza negację/wykluczenie. Dla przykładu, jeśli chcesz zablokować wszystkie pakiety SYN na wszystkich portach poza portem 80, powinno to wyglądać tak:
iptables -A INPUT -i ppp0 -p tcp --syn --destination-port ! 80 -j DROP
Jest to odrobinę zagmatwane, ale nie aż tak trudne. Pozostaje jeszcze jedna rzecz jaką należy wspomnieć, a która zmienia politykę „łańcucha”. „Łańcuchy” INPUT oraz OUTPUT są przeważnie ustawiane na ACCEPT domyślnie, zaś FORWARD jest ustawiany na DENY. Więc jeśli chcesz używąc komputera jako routera, będziesz musiał ustawić regułkę na ACCEPT. Jak to zrobić zapytasz? To naprawdę bardzo proste. Wszystko co potrzebne, to przełącznik -P, poprzedzający nazwę „łańcucha” oraz nową regułę jaką chcesz wykonać. By zmienić „łańcuch” FORWARD na przyjmowanie ACCEPT:
iptables -P FORWARD ACCEPT
To są jedynie podstawy IPTABLES. Powinno pomóc ustawić określony firewall. Pomimo iż jest to dość nowy standard, powinien wkrótce bardziej się spopularyzować. Powodzenia !

