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:
iptables
, ip6tables
, ebtables
, arptables
(starsze)nft
(nowszy)
Netfilter project jest zbiorem projektów związanych
z frameworkiem do filtrowania pakietów, w tym iptables
i nftables
.
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
.
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].
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.
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ę).
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ł:
iptables [-t filter] -L [-n]
– wypisanie (--list
) tablicy filtracji iptables -t <tablica> -L [-n]
– wypisanie innych tablic iptables [-t <tablica>] --line-numbers -L
– dodaje numery regułWzorce poleceń modyfikujących działanie filtracji i dodających reguły filtaracji:
iptables [-t filter] -P <łańcuch> <polityka>
– zmiana domyślnego zachowania (tj. jeśli żadna z reguł nie podejmie decyzji). Zwykle stosowane polityki to ACCEPT
lub DROP
. Przykład: iptables -P INPUT DROP
– ignoruje pakiety przychodząceiptables -A <łańcuch> <reguła>
– dodaje regułę do łańcucha (--append
), np: iptables -A INPUT -s 1.2.3.4 -j ACCEPT
iptables -I <łańcuch> [pozycja] <reguła>
– wstawia (--insert
) regułę na podane miejsce do łańcucha (lub na początek jeśli numeru nie podano), np: iptables -I INPUT 1 -s 1.2.3.4 -j ACCEPT
iptables -D <łańcuch> <nr>
– usuwa (--delete
) regułę na podanej pozycji z łańcucha, np: iptables -D INPUT 2
iptables -D <łańcuch> <reguła>
– usuwa (--delete
) regułę z łańcucha, np: iptables -D INPUT -s 1.2.3.4 -j ACCEPT
iptables -F [łańcuch]
– usuwa wszystkie reguły [z łańcucha] (--flush
); wysoce niebezpieczne
Zwykle reguły w iptables
są zakończone akcją:
-j ACCEPT
– przepuszcza pakiet-j DROP
– ignoruje (wyrzuca do śmieci) pakiet-j REJECT
– dodatkowa akcja, symuluje zamknięte gniazdo (wysyła ICMP destination unreachable)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:
-s
i -d
,-i
i -o
,-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:
-m tcp/udp
jest automatycznie ładowany razem z -p udp/tcp
; pozwala ustalić m. inn. port źródłowy i docelowy --sport / --dport
,-m conntrack
wybiera stan połączenia --ctstate
, m. inn.: INVALID,NEW,ESTABLISHED,RELATED
,-m comment
pozwala na dowolny komentarz --comment <tekst>
,-m limit
dzięki --limit
ogranicza ilość pakietów na jednostkę czasu,-m hashlimit
pozwala m. inn. ustawić limit pakietów/czas dla każdego IP z osobna,-m time
pozwala włączyć regułę o --datestart
i wyłączyć o --datestop
,-m u32
udostępnia --u32
wykonujący dowolny test na danych pakietu,-m connlimit
używając --connlimit-above
pozwala ograniczyć ilość połączeń z jednego adresu.
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.
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
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
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
iptables liczy ilość i rozmiar pakietów które dopasowały się do każdej reguły. Można:
iptables -v [-x] -L
– wyświetlić listę reguł z uwzględnieniem licznikówiptables -Z [co zerować]
– wyzerować stan liczników – wszystkich lub wybranego łańcucha / regułyFiltracja pakietów w systemie Linux - ćwiczenia
Przykładowe komendy iptables ustawiające filtrację i ich działanie
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
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ć).
W systemie Linux translacja adresów jest stanowa, stąd odpowiedzi zawsze znajdą drogę powrotną.
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]
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
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:
recent
pozwala filtrować biorąc pod uwagę wcześniejszą aktywność danego IP/ danej sieci, np: iptables -A INPUT -p tcp --dport 139 -m recent --name unwanted --set --seconds 15 -j DROP
iptables -A INPUT -m recent --update --seconds 15 -j DROP
string
pozwalający dopasowywać tekst i moduł u32
pozwalający dopasowywać dana na podanej pozycji, np: iptables -A FORWARD -p udp --dport domain -m string --algo bm --hex-string '|08|facebook|03|com|00|' -j LOG --log-prefix 'facebook '
mac
pozwala filtrację adresów MAC, np: iptables -A input -m mac ! --mac-source 00:12:34:56:78:ab -j DROP
-p icmp
pozwala na filtrowania icmp, np: iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
API systemów Windows do tworzenia firewalli: https://msdn.microsoft.com/en-us/library/aa366510%28v=vs.85%29.aspx