iptables tu s námi jsou už tak dlouho, že je považujeme za danost a když mluvíme o linuxovém firewallu, myslíme tím automaticky právě iptables. Pro mnohé dnešní uživatele Linuxu je to také jediné řešení, které kdy ve své praxi zažili.
Co se dozvíte v článku
Před iptables tu ale byly ipchains a ještě před nimi ipfwadm. Nic není věčné a také iptables pomalu odchází a je nahrazován dalším řešením v pořadí: nftables. Právě o něm bude tento článek a celý následující seriál článků.
Co je to nftables?
Jedná se o subsystém linuxového jádra, který má za úkol filtrovat síťový provoz. Vývoj byl poprvé prezentován už v roce 2008 a první verze se do Linuxu dostala v lednu roku 2014 s vydáním jádra 3.13. Nutno říct, že nftables není konkurenční projekt vytvořený na truc projektu netfilter/iptables. Za vývojem stojí stejní vývojáři, takže jde o přirozenou evoluci: nftables je následovníkem iptables.
Cílem projektu je vytvoření jednoduššího a univerzálnějšího řešení, které bude v jádře potřebovat výrazně méně kódu. Zároveň by mělo usnadnit život uživatelům (správcům), kteří dostanou do ruky jeden univerzální švýcarský nůž, namísto celé dílny plné různých nástrojů v podobě iptables.
Virtuální stroj v jádře
Základem nftables je virtuální stroj v jádře, který je schopen zpracovávat jednoduchý bytekód. Ten je schopen provádět porovnání, aritmetiku či bitové operace. Dostane k dispozici samotná data (například paket), přístup k metadatům (třeba příchozí rozhraní) a ke connection trackingu (sledování spojení). Na základě těchto informací je schopen provést rozhodnutí, co s daty provést dále.
Taková implementace je výrazně odlišná od přístupu iptables, který staví na principu modulů schopných pracovat s jednotlivými protokoly. Integrovaná znalost protokolů je pevnou součástí iptables a je natolik svázaná s funkcí jednotlivých modulů, že bylo potřeba kód napsat čtyřikrát: zvlášť pro IPv4, IPv6, ARP a ethernetové rámce (bridging). Pro každý protokol je navíc nutné napsat samostatný modul, který je napsán se znalostí obsahu určitého typu provozu.
Proti tomu je virtuální stroj nftables napsán naprosto obecně, nezajímají ho konkrétní protokoly, formáty hlaviček a podobné vysokoúrovňové informace. Umí jen postupovat podle jednoduchého programu a provádět jednoduchá porovnávání a rozhodování. Řešení nftables je tedy „hloupější“, ale v tom je jeho síla.
Chytrost v jedné utilitě
Dramaticky se tak snižuje množství kódu v jádře i v uživatelském prostoru. Tradiční utility iptables
, ip6tables
, arptables
a ebtables
nahrazuje jediná utilita nft
. Ta implementuje celý firewall nad jednoduchým virtuálním strojem v jádře. Ona je zodpovědná za to, že z pravidel zadaných správcem vytvoří kód pro virtuální stroj.
Výhodou je, že se znalost protokolů přesouvá do uživatelského prostoru, takže přidání podpory pro nový typ filtrování znamená jen aktualizaci jedné utility. Není potřeba kompilovat nový modul do jádra a zavádět ho, nebo dokonce překompilovat celé jádro a restartovat. Nová utilita jednoduše vytvoří nový bytekód a nakrmí jím starý virtuální stroj.
Příjemné je také nové jednoduché API, které dokáže provádět atomické operace v jaderném rozhraní Netlink. Změna pravidla ve firewallu tak znamená jednu jedinou transakci, což drasticky zrychluje úpravy velkých a komplikovaných sad pravidel a předchází to problémům při souběhu, když probíhají změny v jádře.
Současnost jménem nftables
Pokud vám tohle všechno připadá jako hudba budoucnosti, tak vězte, že je to vlastně už naše současnost. Možná nftables používáte a ani jste si toho nevšimli. Součástí projektu je totiž také vrstva kompatibility (iptables-nft), která dokáže načítat pravidla původně napsaná pro iptables.
Současný stav (například v Debianu 10 Buster) je takový, že známá utilita iptables
je nahrazena novou verzí, která na pozadí provádí překlad do nftables. Uživatel má stále pocit, že používá staré známé rozhraní, ve skutečnosti už ale pracuje s nftables.
V balíčku iptables
jsou stále ještě binárky končící na -legacy
, na které je možné přepnout pomocí příkazu update-alternatives
. Ve výchozím stavu ale zmíněné čtyři příkazy ve skutečnosti volají binárky končící na -nft
. Tabulky iptables tak zůstávají prázdné a uživatel plní nftables. Příští verze Debianu také pravděpodobně za dva roky vyhodí iptables z výchozí instalace.
Rozdíly proti iptables
Pokud jste zvyklí na iptables, budou vás pravděpodobně zajímat rozdíly proti nftables. V první řadě se liší syntaxe, která více připomíná ovládání utility ip či příkazu tcpdump. Přepínače se neuvozují pomlčkami, ale je možné je přirozeně zapisovat za sebou v relativně volném pořadí.
Další změnou je, že všechny tabulky a řetězce jsou zcela volně konfigurovatelné. Zatímco iptables uživateli nabízejí připravené tabulky s vestavěnými řetězci, nic takového v nftables nenajdete. Nepoužívané prázdné řetězce vás tak nestojí výkon a je na vás, abyste si je zaregistrovali do jádra, až když je budete potřebovat.
Tvorba pravidel je výrazně volnější a dává širší možnosti než u iptables. Jedno pravidlo může obsahovat více výrazů, které se postupně procházejí zleva doprava, pokud byl předcházející výraz vyhodnocen kladně. Padá tak omezení na jedno pravidlo – jeden cíl.
Stejně tak je možné v rámci jednoho pravidla definovat více akcí (cílů). To v praxi velmi usnadňuje správcům život, protože je možné v rámci jednoho rozhodnutí provést několik úkonů: započítat, zalogovat a pak třeba přejít do jiného řetězce. Zvyšuje se tím přehlednost a snižuje komplexita pravidel.
Firewall s nftables také automaticky nemá počítadla na řetězcích a pravidlech. Pokud chcete nějaký provoz počítat, musíte si o to výslovně říct při zápisu nového pravidla.
V dnešní době nasazování dual-stacku potěší fakt, že nftables mají podporu pro jednotné rozhraní filtrující zároveň IPv4 a IPv6. Nemusíte tak udržovat dva samostatné firewally, ale jednotná pravidla se mohou aplikovat na oba jinak nezávislé světy. Zjednodušuje se vám tím život a vyhnete se častým chybám, při kterých je nové pravidlo přidáno jen do jednoho ze dvou firewallů.
Nový firewall také integruje složitější datové struktury, které byly do toho původního buď doplněny dodatečně nebo neexistují vůbec. V nftables tak můžete přímo používat infrastrukturu setů, které umožňují vytvářet rozsáhlé sady pravidel využívající libovolný dostupný selektor. Můžete tak vytvářet slovníky, mapy a rozsahy, které se snadno spravují a nabízejí vysoký výkon při prohledávání.
Nad tím vším je navíc možné od jádra 4.1 provádět řetězení (concatenation) pomocí uspořádaných n-tic (tuple) selektorů. Můžete tak v jednom kroku provést porovnání nad celou skupinou selektorů, což opět zvyšuje přehlednost a výkon. Příklad: Je tento paket z vyjmenovaných zdrojových IP adres a zároveň používá protokol UDP?
Co zůstalo stejné
Pokud jste zvyklí na Netfilter, pak vás potěší to, že nftables v síťovém stacku využívá stejnou infrastrukturu. Stejně tak používá stávající connection tracking, funkce pro NAT, logování a další součásti. Změnil se tedy jen nástroj pro rozhodování, zbytek funkcí jádra zůstává nezměněný.
Stále jsou tedy ve hře jaderné hooky, na které se umí nftables zavěsit a rozhodovat o osudu procházejícího provozu. Data směřující do našeho stroje procházejí přes prerouting a input, odchozí provoz pak analogicky míří přes output a postrouting. Pokud je v jádře zapnutá funkce směrovače (forwarding), pak procházející pakety jdou přes prerouting, forward a postrouting. Tenhle princip se s nftables nemění.
Příště už prakticky
V příštím článku začneme s praktickými ukázkami a ukážeme si, jak se nftables ovládají pomocí utility nft
. Vytvoříme si tabulky, přidáme do nich řetězce a některé z nich připojíme na správná místa v síťovém stacku. Také si ukážeme, jak spravovat jednotlivá pravidla v řetězcích.