Dydaktyka:
FeedbackNetfilter 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 ACCEPTiptables -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 ACCEPTiptables -D <łańcuch> <nr> – usuwa (--delete) regułę na podanej pozycji z łańcucha, np: iptables -D INPUT 2iptables -D <łańcuch> <reguła> – usuwa (--delete) regułę z łańcucha, np: iptables -D INPUT -s 1.2.3.4 -j ACCEPTiptables -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,-pFiltry 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ć).
DNAT:
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 DROPstring 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 ACCEPTAPI systemów Windows do tworzenia firewalli: https://msdn.microsoft.com/en-us/library/aa366510%28v=vs.85%29.aspx