Iptables – zapora sieciowa systemu Linux [MINI PORADNIK]
-
- 06.09.2022, godz. 15:00
Każdy komputer podłączony do sieci wymaga dobrych zabezpieczeń chroniących przed niepowołanym dostępem. Dla systemu Linux stworzono w tym celu firewall pod nazwą iptables.
Iptables to niezwykle elastyczna zapora sieciowa (firewall) stworzona dla systemów operacyjnych Linux. Niezależnie od tego, czy jesteś początkującym fanem Linuksa, czy administratorem systemu, prawdopodobnie powinieneś z niej korzystać. W tym poradniku piszemy o tym, jak skonfigurować kilka podstawowych reguł iptables.
Iptables to działający w wierszu poleceń firewall, który do zarządzania ruchem sieciowym wykorzystuje tak zwane "łańcuchy reguł". Kiedy jakiś program próbuje ustanowić połączenie w Twoim systemie, iptables szuka na swojej liście reguły, aby ją dopasować do żądania. Jeśli jej nie znajdzie, skorzysta z akcji domyślnej.
Zobacz również:
iptables jest preinstalowany w prawie każdej dystrybucji Linuksa. Aby go zaktualizować/zainstalować, po prostu wpisz w terminalu to polecenie:
sudo apt-get install iptables
Istnieją alternatywy dla iptables z interfejsem graficznym, takie jak Firestarter, ale tekstowe iptables nie jest zbyt trudne w podstawowych zastosowaniach. Podczas konfigurowania reguł należy jednak zachować wyjątkową ostrożność, szczególnie jeśli korzystasz z SSH na zdalnym serwerze, ponieważ jedno błędne polecenie może trwale zablokować Ci dostęp. Żeby go przywrócić, będziesz musiał skonfigurować lub wyłączyć firewall lokalnie, bo dostęp sieciowy do maszyny będzie nieodwołalnie wyłączony.
Rodzaje łańcuchów reguł iptables
Iptables używa trzech różnych łańcuchów zasad dopuszczania ruchu sieciowego: input, forward i output.
Dane wejściowe (input) – ten łańcuch służy do kontrolowania połączeń przychodzących. Na przykład: jeśli użytkownik spróbuje nawiązać połączenie SSH z Twoim komputerem/serwerem, iptables spróbuje dopasować adres IP i port do reguły w łańcuchu wejściowym.
Przekaż (forward) – ten łańcuch jest używany do połączeń przychodzących, które nie są przeznaczone dla lokalnej maszyny. Komputer czasem działa jak router — wtedy dane są zawsze do niego wysyłane, ale rzadko dla niego przeznaczone; router najczęściej tylko przekazuje dane do celu. Jeśli nie robisz w swoim systemie jakiegoś routingu, NAT-u lub czegoś innego, co wymaga przekazywania danych, nie będziesz używał tego łańcucha.
Jest jeden pewny sposób sprawdzenia, czy Twój system używa/potrzebuje łańcucha forward.
iptables -L -v
![Iptables – zapora sieciowa systemu Linux [MINI PORADNIK] Iptables – zapora sieciowa systemu Linux [MINI PORADNIK]](https://www.pcworld.pl/g1/news/thumbnails/4/1/413900_Zrzut_ekranu_z_2022_09_06_10_01_50_png_95_adaptiveresize_750x509.webp)
Fot. wł.
Powyższy zrzut ekranu wykonano na komputerze, który działa od kilkunastu minut i nie ma ograniczeń dotyczących połączeń przychodzących ani wychodzących. Jak widać, łańcuch wejściowy przetworzył 110 MB pakietów, a łańcuch wyjściowy przetworzył 525 kB. Z kolei łańcuch przekazywania nie przetworzył żadnego pakietu. Stało się tak, ponieważ komputer nie wykonuje żadnego przesyłania dalej ani nie jest używany jako urządzenie pośredniczące.
Wyjście (output) – ten łańcuch jest używany do połączeń wychodzących. Na przykład, jeśli spróbujesz pingować jakiś adres IP, iptables przed podjęciem decyzji o zezwoleniu lub odrzuceniu próby połączenia sprawdzi swój łańcuch wyjściowy, aby zobaczyć, jakie reguły dotyczą polecenia ping i adresu docelowego.
Chociaż pingowanie zewnętrznego hosta wydaje się czymś, co wymaga tylko sprawdzenia łańcucha wyjściowego, należy pamiętać, że do odebrania odpowiedzi zostanie użyty łańcuch wejściowy. Używając iptables, pamiętaj, że wiele protokołów będzie wymagało dwukierunkowej komunikacji, więc zarówno łańcuchy wejściowe, jak i wyjściowe będą musiały być odpowiednio skonfigurowane. SSH jest tu dobrym przykładem protokołu, na który ludzie zapominają zezwolić w obu łańcuchach.
Domyślne zachowanie iptables
Zanim skonfigurujesz określone reguły, powinieneś zdecydować, jakie ma być domyślne zachowanie iptables. Innymi słowy, powinieneś określić, co chcesz, aby iptables zrobił, jeśli połączenie nie pasuje do żadnej istniejącej reguły.
Aby sprawdzić, jakie łańcuchy zasad są obecnie skonfigurowane do obsługi niedopasowanego ruchu, uruchom polecenie iptables -L.
![Iptables – zapora sieciowa systemu Linux [MINI PORADNIK] Iptables – zapora sieciowa systemu Linux [MINI PORADNIK]](https://www.pcworld.pl/g1/news/thumbnails/4/1/413901_Zrzut_ekranu_z_2022_09_06_10_02_39_png_95_adaptiveresize_750x509.webp)
Fot. wł.
Jak widać, użyliśmy również polecenia grep, aby uzyskać bardziej czytelne wyjście. Na tym zrzucie ekranu widać, że w naszym systemie jest dozwolony każdy ruch sieciowy, który nie jest objęty specjalną regułą, co oznacza, że Twój system domyślnie będzie akceptował wszystkie połączenia. O ile wcześniej nie zmieniłeś reguł łańcucha zasad, to ustawienie powinno już być skonfigurowane. Tak czy inaczej, oto polecenia do domyślnego akceptowania połączeń:
iptables --policy INPUT ACCEPT
iptables --policy FORWARD ACCEPT
iptables --policy OUTPUT ACCEPT
Dzięki domyślnej zasadzie akceptowania połączeń możesz użyć iptables do odrzucenia określonych adresów IP lub numerów portów, jednocześnie zezwalając na wszystkie pozostałe połączenia.
Jeśli wolisz blokować cały ruch i ręcznie określać, na które połączenia zezwolić, powinieneś zmienić domyślną politykę iptables na odrzucanie (DROP). Jest to prawdopodobnie przydatne tylko w przypadku serwerów, które zawierają poufne informacje i łączą się z nimi tylko te same adresy IP.
iptables --policy INPUT DROP
iptables --policy FORWARD DROP
iptables --policy OUTPUT DROP
Reakcja firewalla na konkretne połączenie
Po skonfigurowaniu domyślnej polityki możesz zacząć dodawać reguły do iptables, aby program wiedział, co zrobić, gdy napotka połączenie z lub do określonego adresu IP lub portu. W tym przewodniku omówimy trzy najbardziej podstawowe i najczęściej używane „odpowiedzi” firewalla.
ACCEPT – zezwól na połączenie.
DROP – odrzuć połączenie, czyli zachowuj się tak, jakby żądanie połączenia nigdy nie nastąpiło. Jest to przydatne, gdy nie chcesz, aby wysyłający prośbę o połączenie otrzymał informację, że twój system istnieje.
REJECT — nie zezwalaj na połączenie, ale zwróć błąd. Jest to przydatne, gdy nie chcesz, aby określone źródło łączyło się z twoim systemem, ale chcesz, aby wiedziało, że zapora je zablokowała.
Najlepszym sposobem na przedstawienie różnicy między tymi trzema regułami jest pokazanie, jak to wygląda, gdy komputer PC z systemem Windows próbuje pingować komputer z systemem Linux z iptables skonfigurowanym dla każdego z tych ustawień.
Zezwolenie na połączenie (ACCEPT):
![Iptables – zapora sieciowa systemu Linux [MINI PORADNIK] Iptables – zapora sieciowa systemu Linux [MINI PORADNIK]](https://www.pcworld.pl/g1/news/thumbnails/4/1/413896_screen_win_01_jpg_95_adaptiveresize_750x434.webp)
Fot. wł.
Zerwanie połączenia (DROP):
![Iptables – zapora sieciowa systemu Linux [MINI PORADNIK] Iptables – zapora sieciowa systemu Linux [MINI PORADNIK]](https://www.pcworld.pl/g1/news/thumbnails/4/1/413895_screen_win_02_jpg_95_adaptiveresize_750x434.webp)
Fot. wł.
Odrzucenie połączenia (REJECT):
![Iptables – zapora sieciowa systemu Linux [MINI PORADNIK] Iptables – zapora sieciowa systemu Linux [MINI PORADNIK]](https://www.pcworld.pl/g1/news/thumbnails/4/1/413897_screen_win_03_jpg_95_adaptiveresize_750x434.webp)
Fot. wł.
Dopuszczanie lub blokowanie określonych połączeń
Po skonfigurowaniu ogólnych zasad w łańcuchach możesz skonfigurować iptables, aby dopuszczać lub blokować ruch z określonych adresów, zakresów adresów i portów. W poniższych przykładach ustawimy połączenia na DROP, ale możesz je przełączyć na ACCEPT lub REJECT, w zależności od Twoich potrzeb i konfiguracji łańcuchów zasad.
Uwaga: w tych przykładach użyjemy polecenia iptables -A, aby dodać reguły do istniejącego łańcucha. Iptables zacznie sprawdzanie reguł od początku łańcucha, aż znajdzie taką, która pasuje lub stworzy nową na końcu. Jeśli chcesz wstawić regułę nad inną, możesz użyć polecenia iptables -I [łańcuch][liczba], aby określić miejsce, na którym zostanie umieszczona na liście i jej priorytet.
Połączenia z jednego adresu IP
Ten przykład pokazuje, jak zablokować wszystkie połączenia z adresu IP 10.10.10.10:
iptables -A INPUT -s 10.10.10.10 -j DROP
Połączenia z zakresu adresów IP
Ten przykład pokazuje, jak zablokować wszystkie adresy IP w zakresie 10.10.10.0/24. Do ustalenia zakresu adresów IP można użyć maski podsieci lub standardowej notacji z ukośnikiem:
iptables -A INPUT -s 10.10.10.0/24 -j DROP
lub
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
Połączenia z określonym portem
Ten przykład pokazuje, jak blokować połączenia SSH z adresu 10.10.10.10:
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
Możesz zastąpić „ssh” dowolnym protokołem lub numerem portu. Ta część kodu: -p tcp mówi iptables, jakiego rodzaju połączenia używa protokół. Jeśli blokujesz protokół, który używa UDP zamiast TCP, użyj -p udp.
Ten przykład pokazuje, jak blokować połączenia SSH z dowolnego adresu IP:
iptables -A INPUT -p tcp --dport ssh -j DROP
Stany połączeń
Jak wspomniałem wcześniej, wiele protokołów będzie wymagało dwukierunkowej komunikacji. Na przykład, jeśli chcesz zezwolić na połączenia SSH, łańcuchy wejściowe i wyjściowe będą wymagały dodania do nich odpowiedniej reguły. Jednak co zrobić, aby były dozwolone tylko wejściowe połączenia SSH? Czy dodanie reguły do łańcucha wyjściowego nie pozwoli również na połączenia wychodzące?
W takim przypadku zastosowanie mają tak zwane "stany połączeń", które dają możliwość komunikacji dwukierunkowej, ale pozwalają też na nawiązywanie połączeń tylko w jedną stronę. Spójrz na ten przykład, gdzie połączenia SSH z 10.10.10.10 są dozwolone, ale połączenia SSH do 10.10.10.10 już nie. Jednak system może odesłać informacje przez SSH, o ile sesja została już ustanowiona, co umożliwia komunikację między tymi dwoma hostami.
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
Zapisywanie zmian w iptables
Zmiany wprowadzone w regułach iptables zostaną usunięte przy następnym ponownym uruchomieniu usługi iptables, chyba że wykonasz odpowiednie polecenie, aby zapisać zmiany. To polecenie może się różnić w zależności od Twojej dystrybucji Linuksa:
Ubuntu:
/sbin/iptables-save
Redhat / CentOS:
/sbin/service iptables save
lub
/etc/init.d/iptables save
Inne polecenia
Wymień aktualnie skonfigurowane reguły iptables:
iptables -L
Dodanie opcji -v da ci informacje o przesłanych pakietach i bajtach. Aby wyczyścić wszystkie aktualnie skonfigurowane reguły, możesz wydać polecenie flush:
iptables -F
Mam nadzieję, że po przeczytaniu tego poradnika, korzystanie z iptables stanie się dla Ciebie przyjemnością. Aby poszerzyć jeszcze swoją wiedzę na temat linuksowego firewalla, możesz skorzystać z manuala do iptables i wielu przydatnych materiałów dostępnych w internecie.
Źródło: How-To Geek