Sieci w Linuksie/Netfilter/iptables

iptables jest poleceniem użytkownika służącym do konfiguracji Netfilter w systemach linuksowych. Polecenia tego może używać jedynie superużytkownik. Za pomocą tego polecenia można w szczególności ustawiać reguły służące do filtrowania i zmieniania pakietów, jak również wyświetlać istniejące reguły. Aby wyświetlić reguły w tablicy filter (opisanej poniżej) wystarczy wydać następujące polecenie:

# iptables -L

Które w przypadku domyślnej konfiguracji Netfilter wyświetli:

Chain INPUT (policy ACCEPT)
 target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
 target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
 target     prot opt source               destination

Powyższy listing pokazuje, że w tablicy filter nie ma żadnych reguł, a domyślna polityka dla zdefiniowanych w niej łańcuchów to ACCEPT (czyli przepuszczanie ruchu).

Grupowanie reguł edytuj

Jak widać z pierwszego przykładu w tym rozdziale reguły dodawane przez użytkownika są grupowane w łańcuchy a te są umieszczone w poszczególnych tablicach. Podział na tablice i łańcuchy jest związany z podziałem przetwarzania pakietów w jądrze na logiczne fragmenty. W chwili obecnej dostępne są 4 tablice opisane poniżej.

tablica filter edytuj

Jest to domyślna tablica programu iptables (dlatego nie trzeba jej specyfikować za pomocą opcji '-t filter'). W niej należy umieszczać reguły odpowiedzialne za filtrowanie pakietów. Dzieli się ona na 3 domyślne łańcuchy (użytkownik może tworzyć własne):

  • INPUT - do tego łańcucha trafiają pakiety, które docelowo są odbierane przez lokalny komputer.
  • FORWARD - do tego łańcucha trafiają pakiety, które zostaną przekazane dalej (trasowane przez lokalny komputer).
  • OUTPUT - do tego łańcucha trafiają pakiety, które są generowane przez lokalny komputer.

Domyślną polityką w tej tablicy jest ACCEPT, która oznacza, że pakiet zostanie odebrany/przekazany/wysłany.

tablica nat edytuj

W tablicy tej umieszcza się reguły służące do realizacji NAT (ang. Network Address Translation). W przeciwieństwie do tablicy filter tablica ta nie widzi wszystkich pakietów, a jedynie pierwszy pakiet inicjalizujący połączenie (w sensie definiowanym przez moduł conntrack) - pozostałe pakiety należące do tego połączenia są poddawane takim samym modyfikacjom jak ten pierwszy. Dzieli się ona na 3 domyślne łańcuchy:

  • PREROUTING - do tego łańcucha trafiają pakiety przychodzące. Na tym etapie przetwarzania Netfilter nie wie, czy pakiet zostanie odebrany przez lokalny komputer, czy przekazany dalej. Oznacza to, że w tym łańcuchu nie działa opcja '-o interfejs'.
  • POSTROUTING - do tego łańcucha trafiają pakiety wychodzące. Na tym etapie przetwarzania Netfilter nie wie, czy pakiet był wygenerowany lokalnie, czy jest przekazywany. Oznacza to, że w tym łańcuchu nie działa opcja '-i interfejs'.
  • OUTPUT - do tego łańcucha trafiają pakiety generowane lokalnie przez komputer (pakiety te przechodzą również następnie przez POSTROUTING!).

Domyślną polityką w tej tablicy jest ACCEPT, która oznacza, że pakiet nie będzie podlegał NAT.

Na komputerze, który nie jest używany jako router polecenie:

# iptables -t nat -L -v -n

Wyświetli następujące informacje:

Chain PREROUTING (policy ACCEPT 20 packets, 3564 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 473 packets, 39426 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 473 packets, 39426 bytes)
 pkts bytes target     prot opt in     out     source               destination

Jak widać łańcuchy POSTROUTING i OUTPUT mają tę samą liczbę pakietów, które przez nie przeszły.

tablica mangle edytuj

W tablicy tej należy umieszczać reguły, które zmieniają pakiety (np. ustawienie ttl, czy MSS), ale nie są NATowane. W tej tablicy widoczne są wszystkie pakiety należące do danego połączenia. Dzieli się ona na 5 domyślnych łańcuchów:

  • PREROUTING - do tego łańcucha trafiają pakiety wchodzące.
  • INPUT - do tego łańcucha trafiają pakiety odbierane przez lokalny komputer (po uprzednim przejściu przez PREROUTING!)
  • FORWARD - do tego łańcucha trafiają pakiety przekazywane przez lokalny komputer. Pakiety te wcześniej przeszły przez PREROUTING oraz jeżeli nie zostaną zatrzymane (w tablicy filter) przejdą potem przez POSTROUTING.
  • POSTROUTING - do tego łańcucha trafiają pakiety opuszczające lokalny komputer.
  • OUTPUT - do tego łańcucha trafiają pakiety wygenerowane lokalnie (potem przechodzą jeszcze przez POSTROUTING!)

tablica raw edytuj

W tablicy tej należy umieszczać reguły, które powinny dotyczyć pakietów zanim zostaną przetworzone przez mechanizm conntrack. Znajdują się w niej tylko 2 domyślne łańcuchy:

  • PREROUTING - do tego łańcucha trafiają pakiety wchodzące.
  • OUTPUT - do tego łańcucha trafiają pakiety wygenerowane lokalnie.

Nie ma łańcucha POSTROUTING ponieważ wszystkie pakiety opuszczające lokalny komputer albo:

  • są przekazywane, więc śledzenie połączenia nastąpiło za łańcuchem PREROUTING
  • są generowane lokalnie, więc śledzenie połączenia nastąpiło za łańcuchem OUTPUT

Podstawowe opcje programu iptables edytuj

Składnię polecenia iptables można przedstawić symbolicznie w następujący sposób:

iptables wybór_tablicy polecenie dopasowania akcja

Gdzie poszczególne elementy oznaczają:

wybór_tablicy - specyfikacja tablicy, której będzie dotyczyć pozostała część polecenia.
polecenie - wybór realizowanej czynności (dodanie, modyfikacja, usuwanie) reguł.
dopasowania - dopasowania tworzące regułę.
akcja - akcja wykonywana na pakiecie w przypadku pozytywnego dopasowania.

Polecenia edytuj

Poniższe opcje służą do dodawania, usuwania, modyfikowania i ogólnie zarządzania regułami iptables.

-t tablica - wybiera tablicę, której dotyczyć będą pozostałe operacje, nie podanie tej opcji jest równoważne z podaniem opcji -t filter.
-n - wyłącza rozwiązywanie nazw hostów i usług podczas wypisywania reguł.
-v - wyświetla zaawansowane informacje podczas listingu i dodawania reguł.
--line-numbers - wyświetla numery linii przy wypisywaniu reguł.
-c licznik-pakietów licznik-bajtów - ustawia liczniki bajtów i pakietów podczas dodawania/modyfikacji reguły.
-L [łańcuch] - wyświetla łańcuchy (wraz z regułami) dla danej tablicy, lub w przypadku podania opcjonalnego parametru tylko ten łańcuch.
-F [łańcuch] - usuwa reguły z wybranej tablicy, lub w przypadku podania opcjonalnego parametru tylko z wybranego łańcucha
-P łańcuch cel - ustawia domyślną politykę dla wybranego łańcucha na 'cel', tylko wbudowane łańcuchy mogą posiadać domyślną politykę
-A łańcuch definicja-reguły - dodaje na końcu łańcucha definicję reguły.
-I łańcuch [pozycja] definicja-reguły - dodaje na pozycji pozycja regułę. Domyślną pozycją jest 1.
-D łańcuch numer-reguły - usuwa z łańcucha regułę o wybranym numerze.
-R łańcuch pozycja definicja-reguły - zamienia regułę o zadanej pozycji w wybranym łańcuchu.
-N łańcuch - tworzy nowy łańcuch o nazwie łańcuch.
-E stara-nazwa nowa-nazwa - zmienia nazwę łańcucha (tylko dla łańcucha zdefiniowanego przez użytkownika).
-X [łańcuch] - kasuje wybrany łańcuch (tylko dla łańcucha zdefiniowanego przez użytkownika). W przypadku braku parametru opcjonalnego kasowane są wszystkie łańcuchy w tablicy. Aby móc skasować łańcuch, łańcuch ten musi być pusty oraz nie może być odwołań do niego (byc wywoływany z innego łańcucha).
-S [łańcuch] - wyświetla wybrany łańcuch (lub wszystkie łańcuchy) w formacie rozpoznawanym przez polecenie iptables-restore
-Z [łańcuch] - zeruje liczniki bajtów/pakietów w wybranym łańcuchu i jego regułach, lub we wszystkich łańcuchach. Polecenia tego można użyć razem z -L dzięki czemu najpierw łańcuch zostanie wyświetlony, a potem wyzerowany.

Dopasowania edytuj

Opcje specyfikujące dopasowania tworzą ciało reguły - odpowiedzialne są za klasyfikowanie pakietu. Większość opcji dopasowujących można zanegować poprzedzając ją znakiem ! (wykrzyknik).

[!] -i interfejs - dopasowuje interfejs wejściowy
[!] -o interfejs - dopasowuje interfejs wyjściowy
[!] -s adres - dopasowuje adres źródłowy do podanego adresu hosta, lub sieci w formacie CIDR
[!] -d adres - dopasowuje adres docelowy j.w.
[!] -p protokół - dopasowuje protokół warstwy transportowej (ICMP, UDP, TCP, itp.)
[!] --dport numer-portu - dopasowuje numer portu docelowego. Ta opcja wymaga podania opcji '-p ' wraz z protokołem, który posiada porty (np. UDP, TCP)
[!] --sport numer-portu - dopasowuje numer portu źródłowego. uwagi jak wyżej
[!] -f - dopasowuje kolejne fragmenty sfragmentowanego pakietu
[!] -m moduł - ładuje moduł dopasowujący. Większość modułów posiada dodatkowe opcje opisane w rozdziale Sieci:Linux/Netfilter/iptables/dopasowania.

Opis modułów dopasowujących oraz rozszerzony opis powyższych dopasowań znajduje się w rozdziale Sieci:Linux/Netfilter/iptables/dopasowania.

Akcje edytuj

Akcje definiują sposób postępowania z pakietem po dopasowaniu. Dwiema podstawowymi akcjami są:

-j ACCEPT - oznacza zaakceptowanie pakietu.
-j DROP - oznacza upuszczenie pakietu.

Akcje są dokładnie opisane w rozdziale Sieci:Linux/Netfilter/iptables/akcje.