Dydaktyka:
FeedbackTo jest stara wersja strony!
Netfilter to część jądra systemu operacyjnego Linux zbierająca funkcje kontroli ruchu sieciowego.
Do kontroli zachowania mechanizmów kernela składających się na netfilter służą programy iptables, ip6tables, ebtables oraz arptables [1]
Netfilter project jest zbiorem projektów związanych z frameworkiem do filtrowania pakietów, w tym iptables.
Podczas przejścia pakietu przez jądro Linuksa wykonywane są w ściśle określonej kolejności hooki decydujące co z pakietem zrobić.
Każdemu hookowi odpowada jeden łańcuch reguł (chain) przeglądanych w kolejności.
Łańcuchy są pogrupowane w tabele (table) pod względem funkcjonalności. W iptables dostępne są następujące tabele:
Łańchy mają nazwy odpowiadające momentowi ich wywołania:
Droga pakietu przez mechanizmy filtrujące w systemie Linux podsumowana jest tutaj: [PL] [EN]
Można tworzyć własne łańcuchy, ale mogą one być uruchomione tylko przez dołączenie ich do już istniejących.
Jądro Linuksa jest zaopatrzone w mechanizm śledzenia połączeń (conntrack). Duża część reguł korzysta z dostarczanych przez niego informacji, co znacznie ułatwia konfigurację filtracji.
Komenda iptables wszędzie rozróżnia wielkie i małe litery, ponadto kolejność argumentów decyduje o zrozumieniu polecenia.
Reguły są przetwarzane w kolejności – jeśli któraś reguła zdecyduje o losie pakietu, późniejsze nie są brane pod uwagę.
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 – źródłowy i docelowy adres(-s i -d), interface (-i i -o) i protokół (-p).
Patrz: man iptables.
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ę.
Patrz: 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 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.
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.
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.
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 google.pl -j DROP – blokuje próby połączenia z google.pl (Uwaga: iptables wypyta DNS o adresy IP i doda reguły z adresami IP, nie z nazwą google.pl)
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ły
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 interface'u 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
Na początku 2014 roku do jądra Linuksa włączono nową implementację kontroli ruchu sieciowego, nftables [1]
nftables jest nastawiony na zwiększenie wydajności, poprawienie czytelności i jakości kodu oraz wygodę użytkowania (w tej kolejności).
Reguły w nftables nie są interpretowane, a wykonywane po uprzednim przygotowaniu bytecode.
Polecenia .*tables zastąpiono jednym poleceniem nft o "prostszej" składni.
Bardzo dobry artykuł o nftables, z wstępem opisującym historię filtrowania pakietów w Linuksie: https://badsector.pl/w-praktyce/artykuly/nftables-nowy-firewall-linuksa-cz-1.195.html?full=1
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 systrmów Windows do tworzenia firewalli: https://msdn.microsoft.com/en-us/library/aa366510%28v=vs.85%29.aspx