Ponad 25 najczęściej używanych poleceń iptables z przykładami

System Linux daje użytkownikom szerokie możliwości zabezpieczania swoich urządzeń. Jednym z kluczowych narzędzi jest iptables, potężna zapora sieciowa działająca w trybie tekstowym, oferująca dużą elastyczność i zaawansowaną ochronę.

Należy jednak pamiętać, że ze względu na swoją tekstową naturę, iptables wymaga pewnego czasu na opanowanie.

Jeśli jesteś administratorem systemu, lub dopiero zaczynasz przygodę z Linuksem, ten artykuł jest dla Ciebie. Przyjrzymy się najczęściej używanym poleceniom iptables, prezentując je na konkretnych przykładach.

Czym jest iptables?

Iptables to wbudowana w system Linux zapora ogniowa, oparta na oprogramowaniu. Umożliwia ona użytkownikom tworzenie i definiowanie reguł, które mają bezpośredni i pośredni wpływ na przepływ danych w sieci.

Dzięki iptables można tworzyć reguły, które blokują lub dopuszczają ruch sieciowy w zależności od portu, adresu IP źródłowego, interfejsu sieciowego i innych kryteriów.

Po zdefiniowaniu reguł, cały ruch sieciowy musi przez nie przechodzić. Na przykład, każde nowe połączenie jest analizowane przez iptables, która szuka pasujących reguł. Jeśli taka reguła zostanie znaleziona, jest ona stosowana. Jeśli nie ma odpowiedniej reguły, aktywowana jest reguła domyślna.

Aby skorzystać z iptables, należy użyć następującej komendy:

$ iptables -L -n -v 

Parametry użyte w poleceniu oznaczają:

  • -L – wyświetlenie wszystkich zdefiniowanych reguł.
  • -n – prezentacja danych wyjściowych w postaci numerycznej dla lepszej wydajności.
  • -v – pokazanie szczegółowych informacji.

Uruchomienie polecenia iptables bez żadnych argumentów spowoduje wyświetlenie komunikatu:

iptables v1.8.7 (nf_tables): no command specified

Try `iptables -h' or 'iptables --help' for more information.

Jeśli pojawi się błąd informujący, że polecenie „iptables” nie zostało znalezione, konieczna będzie jego instalacja.

W celu zainstalowania iptables w wybranej dystrybucji Linuksa, należy wprowadzić poniższe polecenie:

$ sudo apt-get install iptables

W przypadku, gdy iptables jest już zainstalowane (jak w poniższym przykładzie), zostanie wyświetlona informacja:

#output
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
iptables is already the newest version (1.8.7-1ubuntu5).
iptables set to manually installed.
0 upgraded, 0 newly installed, 0 to remove, and 35 not upgraded.

Co to jest zapora sieciowa?

Zapory sieciowe to podstawowe narzędzia ochrony systemów, sieci i komputerów. Mogą być zaimplementowane jako sprzęt lub oprogramowanie i działają na zasadzie zdefiniowanych reguł.

Większość zapór sieciowych umożliwia dostosowanie, pozwalając na tworzenie i modyfikację reguł. Na przykład, pakiety danych z Internetu docierają do systemu poprzez porty, co umożliwia ich filtrowanie na podstawie numerów portów. Dodatkowo, zapora może zezwalać lub blokować usługi w oparciu o adres IP źródłowy lub interfejs sieciowy.

Użytkownicy Linuksa mają dostęp do wbudowanego iptables. Możliwe jest również korzystanie z niezależnej zapory sieciowej, która może wspomóc proces zabezpieczania systemu.

Po co iptables do konfiguracji zapory sieciowej?

Po co w ogóle korzystać z iptables? Dostępnych jest wiele alternatywnych narzędzi do zarządzania zaporą z poziomu wiersza poleceń, takich jak ufw i firewalld. Można również używać samodzielnych zapór sieciowych, które są proste w obsłudze i oferują rozbudowane funkcje.

Dlaczego iptables jest tak popularne przy konfiguracji zapory sieciowej? Oto niektóre z powodów:

  • Oferuje dużą elastyczność konfiguracji. Możliwe jest definiowanie reguł na poziomie poszczególnych pakietów.
  • Jest relatywnie łatwe w użyciu, jeśli pozna się jego mechanizmy działania.
  • Umożliwia proste blokowanie niechcianego ruchu sieciowego.
  • Pozwala na przekierowanie pakietów na alternatywny adres IP.
  • Chroni systemy przed atakami typu „odmowa usługi” (DoS).

I wiele więcej!

Zrozumienie architektury iptables i jej powiązanie z Netfilter

Aby dobrze zrozumieć iptables, konieczne jest poznanie jego architektury. Pozwoli to na jasne zrozumienie poszczególnych komponentów i ich wykorzystanie przy tworzeniu reguł zapory.

W kontekście iptables pojawia się również Netfilter. Można traktować Netfilter jako bazę, na której opiera się iptables i która oferuje rozbudowane funkcje zarządzania zaporą. Iptables jest jednym ze sposobów wykorzystania potencjału Netfilter.

Iptables to interfejs wiersza poleceń, który umożliwia interakcję z mechanizmem przechwytywania pakietów na poziomie jądra systemu Linux, znanym jako Netfilter. Te punkty zaczepienia pozwalają na interakcję ze stosem sieciowym Linuksa i modyfikowanie pakietów na najniższym poziomie.

Architektura iptables przedstawia się następująco:

Tabele

Architektura iptables rozpoczyna się od tabel, które służą do porządkowania reguł. Każda tabela jest przypisana do określonego rodzaju decyzji. Tabele upraszczają proces przetwarzania pakietów, przypisując im specyficzny sposób obsługi.

Iptables oferuje następujące tabele:

  • Tabela filtrów: określa typ decyzji związanej z filtrowaniem pakietów. W skrócie, decyduje, czy pakiet powinien zostać dostarczony do miejsca docelowego.
  • Tabela NAT: określa typ decyzji związanej z translacją adresów. W tym przypadku trasa pakietów jest ustalana na podstawie sieci NAT. Jeśli pakiet nie może uzyskać dostępu do NAT, zostanie pominięty, a system spróbuje znaleźć alternatywną sieć.
  • Tabela mangle: zarządza specjalnymi wymaganiami przetwarzania pakietów. Można ją skonfigurować tak, aby modyfikowała informacje nagłówka pakietu, na przykład wartości TTL.
  • Tabela raw: umożliwia pracę ze stanowym aspektem zapory iptables. Dzięki niej można kierować pakiety w oparciu o ich „stan”, zanim jądro Linuksa rozpocznie jego śledzenie. Służy głównie do oznaczania pakietów, niezależnie od tego, czy system śledzenia połączeń je obsługuje. Jeśli pakiet nie jest śledzony, jest ustawiany jako cel NOTRACK.

Łańcuchy

Kolejnym elementem są „łańcuchy” w „tabelach”.

Łańcuchy te kontrolują pakiety na różnych etapach ich podróży, np. w momencie dotarcia do portu lub interfejsu sieciowego. Dzięki temu decyzja może być podjęta przed przekazaniem pakietu do procesu systemowego.

Iptables oferuje różne łańcuchy, w tym:

  • Łańcuch PREROUTING: reguły w tym łańcuchu dotyczą pakietów, które właśnie dotarły do interfejsu sieciowego.
  • Łańcuch INPUT: reguły w łańcuchu INPUT dotyczą połączeń przychodzących i po przetworzeniu są przekazywane do lokalnych procesów.
  • Łańcuch OUTPUT: łańcuch OUTPUT dotyczy pakietów generowanych przez procesy.
  • Łańcuch FORWARD: łańcuch FORWARD zarządza pakietami, które nie są przeznaczone dla lokalnych systemów. Służy jako medium dla innych systemów docelowych, na przykład routerów.
  • Łańcuch POSTROUTING: łańcuch POSTROUTING zarządza pakietami, które mają opuścić interfejs sieciowy.

Nie wszystkie łańcuchy są dostępne we wszystkich tabelach. Na przykład, łańcuch FORWARD jest dostępny tylko w tabelach mangle, filter i security. Łańcuch POSTROUTING znajduje się w tabelach mangle i nat (SNAT). Jedynie łańcuch OUTPUT jest dostępny we wszystkich tabelach.

Cel

Ostatnim elementem jest „cel”. Po przybyciu pakiet przechodzi przez łańcuchy, aby sprawdzić, która reguła najlepiej pasuje. Jeśli taka reguła zostanie znaleziona, wykonywana jest z nią związana akcja, a pakiet jest przekazywany do celu, co ostatecznie decyduje o jego losie.

W wielu przypadkach pakiet nie pasuje do żadnej reguły, i tutaj pojawia się domyślny cel.

Cele mogą mieć wartości AKCEPTUJ, ODRZUĆ i PORZUĆ. Są to cele kończące, które decydują o losie pakietu.

  • AKCEPTUJ: pakiet zostaje zaakceptowany.
  • PORZUĆ: pakiet jest odrzucany bez powiadamiania nadawcy, co uniemożliwia mu sprawdzenie, czy system jest obecny.
  • ODRZUĆ: pakiet jest odrzucany.

Istnieją też cele niekończące, wykorzystywane głównie do przechowywania informacji o pakiecie.

Najczęściej używane polecenia iptables z przykładami

Zanim zaczniesz używać poleceń iptables, upewnij się, że:

  • Masz uprawnienia administratora, aby uruchamiać polecenia. Jeśli polecenie nie powiedzie się z powodu braku uprawnień, uruchom je ponownie z `sudo` przed komendą.
  • Ten artykuł nie jest kompleksowym przewodnikiem konfiguracji iptables w systemie Ubuntu.
  • Używamy poleceń iptables dla IPv4. Jeśli chcesz pracować z IPv6, będziesz musiał użyć ip6tables.

Sprawdzanie statusu iptables

Aby sprawdzić aktualny stan iptables, należy wykonać następujące polecenie:

$ iptables -L -n -v
#output

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Powyższe dane wyjściowe zawierają wiele informacji i wskazują, że zapora jest obecnie nieaktywna. Jest to spowodowane tym, że wszystkie łańcuchy mają ustawioną domyślną politykę ACCEPT i nie zawierają żadnych zdefiniowanych reguł.

Aby aktywować zaporę, należy zacząć dodawać reguły.

Dodawanie reguł do łańcucha

Dodając nową regułę, jest ona zawsze dołączana do istniejącego łańcucha. Do tego celu służy opcja `-A` (Dołącz). Składnia tego polecenia jest następująca:

$ sudo iptables -A

Jednak po uruchomieniu, polecenie to zwróci:

iptables v1.8.7 (nf_tables): option "-A" requires an argument

Try `iptables -h' or 'iptables --help' for more information.

Argumentami używanymi przy dodawaniu reguł są:

  • –i: określa interfejs sieciowy, dla którego dodawane są reguły, np. ppp0, eth0.
  • –p: określa protokół sieciowy, który ma być użyty przy filtrowaniu pakietów, np. ICMP, TCP, UDP. Użycie wartości `all` sprawi, że reguła będzie dotyczyła wszystkich protokołów.
  • –s: argument source określa źródło ruchu (adres IP lub nazwę hosta).
  • –dport: dport oznacza port docelowy, czyli numer portu, do którego pakiet jest kierowany.
  • –j: argument TARGET, który przyjmuje wartość AKCEPTUJ, PORZUĆ, ODRZUĆ lub RETURN.

Prawidłowa kolejność polecenia to:

$ sudo iptables -A <chain-name> -i <interface-name> - p <protocool-name> - s <source> --dport <port no.> -j <target>

Zapisywanie zmian w iptables

Po dodaniu reguł, można je zapisać za pomocą polecenia `iptables -save`.

$ sudo iptables -save

Wyświetlony wynik będzie podobny do:

[email protected]:~$ sudo iptables-save

# Generated by iptables-save v1.8.7 on Sun May 14 13:37:34 2023

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 392 -j REJECT --reject-with icmp-port-unreachable

-A OUTPUT -o lo -j ACCEPT

COMMIT

# Completed on Sun May 14 13:37:34 2023

Trwałe reguły (ręcznie)

Domyślnie iptables nie zapisuje reguł trwale. Po ponownym uruchomieniu komputera wszystkie ustawienia zostaną usunięte. Aby uniknąć konieczności ponownej konfiguracji iptables, należy zapisać reguły w pliku.

Dla reguł IPv4 należy wydać polecenie:

$ sudo iptables-save > /etc/iptables/rules.v4

Dla reguł IPv6 należy wydać polecenie:

$ sudo iptables-save > /etc/iptables/rules.v6

Trwałe reguły (automatycznie)

Aby reguły były zachowane po ponownym uruchomieniu systemu, konieczna jest instalacja pakietu `iptables-persistent`.

Aby to zrobić, należy wprowadzić polecenie:

$ sudo apt-get install iptables-persistent

Po uruchomieniu tego polecenia otworzy się okno z zapytaniem o potwierdzenie. Wybierz opcję i naciśnij Enter.

W tym przykładzie pracujemy z tabelą IPv4, zostaną zatem załadowane tylko reguły dla IPv4. W przypadku pracy z IPv6, zostanie wyświetlone odpowiednie okno.

Uwaga: pakiet ładuje tylko zapisane reguły iptables. Po każdej zmianie iptables, trzeba będzie je zapisać za pomocą polecenia `iptables -save`.

Ponowne ładowanie reguł po restarcie

Po zapisaniu reguł, należy je przywrócić za pomocą odpowiedniego polecenia:

$ sudo iptables-restore < /etc/iptables/rules.v4

oraz

$ sudo iptables-restore < /etc/iptables/rules.v6

Włączanie ruchu na hoście lokalnym/włączanie pętli zwrotnej

Aby włączyć ruch na Localhost, należy wprowadzić poniższe polecenie:

$ sudo iptables -A INPUT -i lo -j ACCEPT

Gdzie `lo` oznacza interfejs pętli zwrotnej, używany do całej komunikacji z hostem lokalnym.

Podobnie, można zezwolić pakietom na wychodzenie przez interfejs pętli zwrotnej:

$ sudo iptables -A OUTPUT -o lo -j ACCEPT

Aby sprawdzić zmiany w regułach, uruchom `iptables -L -n -V`:

#output

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Włączanie ruchu na określonych portach

Można włączyć ruch poprzez AKCEPTOWANIE lub ODRZUCANIE połączeń na określonych portach.

Porty SSL, HTTP i SSH są kluczowe dla prawidłowego działania aplikacji. Można dodać reguły do pakietu AKCEPTUJ, podając numery portów, aby upewnić się, że działają zgodnie z przeznaczeniem.

Dla protokołu SSL, należy uruchomić:

$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Dla protokołu HTTPS, należy wprowadzić:

$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Aby zezwolić na cały ruch HTTPS przez interfejs eth0:

$ iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

$ iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Dla protokołu SSH, należy wprowadzić:

$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Aby zaakceptować CAŁY ruch przychodzący SSH przez interfejs eth0, należy uruchomić:

$ iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

$ iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Innym przykładem może być włączenie ruchu dla niestandardowej aplikacji, na przykład portu 233.

Aby otworzyć połączenia na tym porcie, uruchom:

$ sudo iptables -A INPUT -p tcp --dport 233 -j ACCEPT

Podobnie, można wyłączyć połączenia na określonym porcie, używając celu ODRZUĆ.

Zablokujmy wszystkie połączenia na porcie 392.

$ sudo iptables -A INPUT -p tcp --dport 392 -j REJECT

Aby sprawdzić wprowadzone zmiany, uruchom `iptables -L -n -v`.

#output

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:233

    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:392 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

 0     0 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0

Usuwanie istniejących reguł

Aby usunąć wszystkie reguły, wprowadź:

$ iptables -F

lub:

$ iptables --flush

Uwaga: jeśli nie zapisałeś reguł, zostaną one bezpowrotnie usunięte i nie będzie można ich przywrócić za pomocą `iptables -restore`.

Usuwanie reguł z numerami linii

Aby usunąć konkretną regułę, należy najpierw wyświetlić listę reguł z numerami linii.

$ sudo iptables -L --line-numbers
#output

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination

1    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh

2    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http

3    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https

4    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:233

5    REJECT     tcp  --  anywhere             anywhere             tcp dpt:392 reject-with icmp-port-unreachable

Aby usunąć regułę nr 4 z łańcucha INPUT, należy uruchomić:

$ sudo iptables -D INPUT 4

Po ponownym uruchomieniu `iptables -n -v -L` wynik będzie następujący:

#output

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0       

newsblog.pl