Spis treści

Filtracja pakietów w systemie Linux

nefilter, iptables i nftables

Netfilter to część jądra systemu operacyjnego Linux zbierająca funkcje kontroli ruchu sieciowego.

Do konfiguracji mechanizmów kernela składających się na netfilter służą programy:

  1. iptables, ip6tables, ebtables, arptables (starsze)
  2. nft (nowszy)

Netfilter project jest zbiorem projektów związanych z frameworkiem do filtrowania pakietów, w tym iptables i nftables.

[ekstra] iptables-…, nft

Po stronie jądra istnieją (przynajmniej) dwa mechanizmy do filtrowania pakietów – starszy xtables i nowszy (i lepszy) nftables.

"Stare" iptables, często dostępne teraz jako iptables-legacy umie wykorzystać tylko pierwszy z tych mechanizmów.
Do użycia nowego mechanizmu zachowując bez zmiany składni i działania poleceń przygotowano nową implementację komendy ipables, wcześniej dostępną jako ipables-nft, teraz często już jako iptables.
Narzędzie nft konfiguruje nowszy z mechanizmów jądra.

Nie zaleca się mieszania konfiguracji programów iptables-legacy, ipables-nft i nft.

iptables… konfiguruje tylko protokół IPv4, IPv6 jest konfigurowane przez bliźniacze ip6tables….
nft pozwala na jednoczesną konfigurację obu tych protokołów (tabele inet).

Na razie polecenie nft ma pozostawiającą wiele do życzenia dokumentację, nieprzyjazne komunikaty o błędach składni polecenia i brak wbudowanej w komendę pomocy i brak bądź wysoce niekompletne autouzupełnianie. Z tego powodu na zajęciach jest wciąż pokazywane narzędzie iptables.

Hooki, tabele, łańcuchy

Podczas przejścia pakietu przez jądro Linuksa wykonywane są w ściśle określonej kolejności hooki decydujące co zrobić z pakietem.

Każdemu hookowi odpowiada jeden łańcuch reguł (chain).

Łańcuch reguły to wiele reguł które przetwarzane są w kolejności – jeśli któraś reguła zdecyduje o losie pakietu, późniejsze nie są brane pod uwagę.

Łańcuchy są pogrupowane w tabele (table) pod względem funkcjonalności.
W iptables / ip6tables dostępne są następujące tabele:

Łańcuchy mają nazwy odpowiadające momentowi ich wywołania:

Można też tworzyć własne łańcuchy, ale mogą one być uruchomione tylko przez dołączenie ich do już istniejących.

Droga pakietu przez mechanizmy filtrujące w systemie Linux podsumowana jest tutaj: [PL] [EN].

Stanowość i bezstanowość – conntrack

Jądro Linuksa jest zaopatrzone w mechanizm śledzenia połączeń (conntrack). Pozwala on dla rozpatrywanego pakietu określić czy wcześniej przez ten komputer był przepuszczony inny pakiet z tego samego połączenia, a nawet czy któryś z wcześniejszych pakietów jest powiązany z rozpatrywanym.
Taka wiedza nie tylko ułatwia konfigurację filtracji pakietów, ale też jest konieczna do obsługi niektórych często występujących scenariuszy.

[Ekstra] Trwałość reguł (persistance)

Iptables nie dostarcza mechanizmu automatycznego zapisywania ustawień – po ponownym uruchomieniu lista reguł jest pusta, a polityki domyślne. Dla odtworzenia reguł przy starcie dystrybucje Linuksa dostarczają odpowiedni skrypt startowy. Zwykle zapisanie reguł odbywa się ręcznie (tj. trzeba wydać odpowiednią komendę).

Komendy

Komenda iptables / ip6tables wszędzie rozróżnia wielkie i małe litery, ponadto kolejność argumentów decyduje o zrozumieniu polecenia.
Składnia iptables i ip6tables jest identyczna, w materiałach dla uproszczenia wszędzie użyte są przykłady dla iptables i IPv4.

Wyświetlanie listy reguł:

Wzorce poleceń modyfikujących działanie filtracji i dodających reguły filtaracji:

Zwykle reguły w iptables są zakończone akcją:

Są też dostępne inne akcje, np. LOG, MARK i SET. Więcej szczegółow w man iptables-extensions

Rdzeń iptables zawiera niewiele filtrów:

  1. źródłowy i docelowy adres – -s i -d,
  2. źródłowy i docelowy interfejs – -i i -o,
  3. protokół – -p

Filtry można negować przez użycie '!' (wykrzyknika)

Netfilter jest modularny – większość funkcji mieści się w rozszerzeniach, ładowanych przez -m <nazwa>
To pozwala na bardzo szczegółową filtrację.

Komendy iptables i ip6tables opisane są w podręczniku systemowym na stronie iptables (man iptables), a rozszerzenia do tych komend są opisane na stronie iptables-extensions (man iptables-extensions).

Przykładowe rozszerzenia:

iptables ma rozbudowaną pomoc wewnętrzną – po napotkaniu --help przerwie dodawanie reguły i pokaże listę opcji, np.:
iptables -I INPUT -p tcp --help
iptables -m hashlimit -m limit -m connlimit --help

iptables-save oraz iptables-restore są używane do zapisu/odczytu tablic do pliku.

Filtracja pakietów

Filtracja na wejściu

Najczęściej stosowana do wpuszczania tylko pożądanego ruchu.
Typowe podejście to zabronienie wszystkiego, co nie jest wprost dozwolone.

Przykładowe polecenia:
iptables -P INPUT DROP – ustawienie domyślnej akcji wybieranej jeśli żadna z reguł nie zadziała
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT – pozwala na ruch lokalny
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT – pozwala przychodzić pakietom nawiązanych wcześniej połączeń
iptables -A INPUT -p tcp --dport 22 -j ACCEPT – pozwala na dostęp do ssh

Filtracja pakietów przechodzących

Decyduje jaki ruch może przechodzić przez komputer. Podejście do reguł zależy od zastosowania.

Przykładowe polecenia:
iptables -A FORWARD -m connlimit --connlimit-above 5 -j DROP – pozwala na nie więcej niż 5 połączeń przechodzących od każdego nadawcy

Filtracja na wyjściu

Służy do wypuszczania tylko pożądanego ruchu. Typowe podejście to blokowanie niepożądanego ruchu.

Przykładowe polecenia:
iptables -A OUTPUT -p tcp --dport bnetgame -j REJECT – odrzuca połączenia na port "Battle.net Chat/Game Protocol"
iptables -A OUTPUT -p tcp -d www.google.pl -j DROP; ip6tables -A OUTPUT -p tcp -d www.google.pl -j DROP – blokuje próby połączenia z www.google.pl (Uwaga: iptables wypyta DNS o adresy IP i doda reguły z adresami IP, nie z nazwą)
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT – pozwala na używanie http

Liczniki

iptables liczy ilość i rozmiar pakietów które dopasowały się do każdej reguły. Można:

Filtracja pakietów w systemie Linux - ćwiczenia

Przykładowe komendy iptables ustawiające filtrację i ich działanie

Manipulowanie pakietami

Przykłady na manipulację pakietami:
iptables -t mangle -A POSTROUTING -o wlan0 -j TTL --ttl-set 1
iptables -t mangle -A PREROUTING -i wlan0 -j TTL --ttl-inc 16
iptables -t mangle -A PREROUTING -i wlan0 -j TEE --gateway 10.0.0.3
iptables -t mangle -A POSTROUTING -p tcp --sport 5222 -j TOS --set-tos Minimize-Delay

NAT (Network Address Translation) – translacja adresów

Ze względu na niewystarczającą ilość adresów IPv4 zwykle komputery w sieciach lokalnych używają adresów z bloków prywatnych.

Na wiadomość z takiego komputera – wysłaną z adresem źródłowym z bloku adresów prywatnych – odbiorca nie ma szansy odpowiedzieć (bo gdzie miałby?). Routery z publicznym IP powinny automatycznie wycinać takie wiadomości RFC 1918, str. 5.

Dlatego konieczne jest by na styku adresacji prywatnej i publicznej adresy były tłumaczone, stąd nazwa NAT = Network Address Translation.

Ruch generowany przez komputery z wewnątrz sieci lokalnej musi mieć zmieniony adres źródłowy (source address), stąd nazwa Source NAT (SNAT). Tradycyjnie adresy źródłowe zmienia się w momencie kiedy pakiet opuszcza system.

Jeśli zachodzi konieczność by ruch z sieci publicznej trafiał do komputera wewnątrz sieci lokalnej, trzeba zmienić adres docelowy (destination address), stąd nazwa Destination NAT (DNAT). Naturalnie urządzenie na styku sieci musi zmienić adres zanim podejmie decyzję o routingu (tj. decyzję gdzie pakiet ma trafić).

Ilustracja do NATów

iptables i stanowość firewalla

W systemie Linux translacja adresów jest stanowa, stąd odpowiedzi zawsze znajdą drogę powrotną.

Translacja źródłowa (Source NAT, SNAT)

Pozwala na dostęp do sieci z adresacją publiczną (np. internet) urządzeniom z sieci z adresacją prywatną.

Uproszczony tryb translacji źródłowej – maskarada:
iptables --table nat --append POSTROUTING --out-interface wlan0 -j MASQUERADE
Przy użyciu maskarady adres źródłowy jest automatycznie ustawiany na adres interfejsu którym pakiet opuszcza router

Klasyczny SNAT wymaga podania adresu (lub adresów) na jakie ma być zmieniane źródło:
iptables -t nat -A POSTROUTING -j SNAT --to-source 150.254.130.41 [--out-interface wlan0]

Translacja docelowa (Destination NAT, DNAT)

Pozwala na dostęp świata do urządzeń znajdujących się w sieci prywatnej, np:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2
iptables -t nat -A PREROUTING -p tcp ! --dport 22 -j DNAT --to-destination 10.0.0.2

NAT w systemie Linux - ćwiczenia

[Ekstra] Appendix

Dobry artykuł o nftables, z wstępem opisującym historię filtrowania pakietów w Linuksie: https://randomseed.pl/pub/nftables-nowy-firewall-linuksa/

Inne moduły:

API systemów Windows do tworzenia firewalli: https://msdn.microsoft.com/en-us/library/aa366510%28v=vs.85%29.aspx