====== Filtracja pakietów w systemie Linux ====== ===== nefilter, iptables i nftables ===== **[[http://pl.wikipedia.org/wiki/Netfilter|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żą [[https://upload.wikimedia.org/wikipedia/commons/d/dd/Netfilter-components.svg|programy]]: - **''iptables''**, **''ip6tables''**, ''ebtables'', ''arptables'' (starsze) - **''nft''** (nowszy) [[http://netfilter.org/|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 ([[https://wiki.nftables.org/wiki-nftables/index.php/What_is_nftables%3F#Why_nftables?|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 [[http://en.wikipedia.org/wiki/Hooking|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:
* **filter** – odrzuca niechciane pakiety, * **nat** – zmienia adresy źródłowe lub docelowe pakietu, * mangle – modyfikuje pakiety, * raw – udostępnia pakietów przed ich przetworzeniem przez część kernela (np. conntrack), * security – używana przy zaawansowanych modelach bezpieczeństwa w Linuksie (np. SELinux). Łańcuchy mają nazwy odpowiadające momentowi ich wywołania: * **PREROUTING** jest wykonywany dla pakietów przychodzących //przed routingiem// (czyli decyzją czy pakiet jest kierowany do tego komputera, czy należy go przesłać dalej lub odrzucić), * **INPUT** jest wykonywany dla pakietów //prz__**y**__chodzących// skierowanych do tego komputera, * **FORWARD** jest wykonywany dla pakietów //prz__**e**__chodzących//, tj. pakietów ze świata, które mają być wysłane dalej, * **OUTPUT** jest wykonywany dla pakietów wyprodukowanych na tym komputerze (//wychodzących//), * **POSTROUTING** jest wykonywany dla pakietów wychodzących po podjęciu decyzji gdzie je wysłać. 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: **[[https://pl.wikipedia.org/wiki/Plik:Netfilter-packet-flow-pl.svg|[PL]]]** **[[https://commons.wikimedia.org/wiki/File:Netfilter-packet-flow.svg|[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ł: * ''iptables [-t filter] -L [-n]'' – **wypisanie** (''--list'') **tablicy filtracji** \\ * ''iptables -t