Zpět na blog

Architektura Iptables a Netfilter

Architektura Iptables a Netfilter

A firewall je bezpečnostní zařízení (hardwarové/softwarové), které chrání síť filtrováním provozu a blokováním nežádoucího/neoprávněného přístupu k soukromým datům. Mít správný firewall je důležité pro ochranu vašich serverů a infrastruktury. Může nejen blokovat nežádoucí provoz, ale také zabránit škodlivému softwaru v infikování systému.

V ekosystému Linuxu je iptables populární firewall, který komunikuje s netfilter frameworkem v linuxovém jádře. Většina moderních linuxových systémů se dodává s těmito předinstalovanými nástroji. Chcete-li tyto systémy využít na maximum, je naprosto zásadní porozumět jejich architektuře. V opačném případě může být vytváření spolehlivých pravidel firewallu skličující. Mohlo by to vést k vytváření složitých syntaxí, vzájemně propojených částí ve frameworku atd.

Tento průvodce se podrobně ponoří do architektury iptables a pomůže uživatelům, kteří si potřebují vytvořit vlastní pravidla firewallu. Prozkoumáme také, jak iptables komunikuje s netfilter a jak do sebe jednotlivé komponenty zapadají.

Iptables a Netfilter

V Linuxu je iptables firewall tím nejběžnějším. Funguje tak, že komunikuje s háčky pro filtrování paketů v síťovém zásobníku linuxového jádra. Právě tyto jádrové háčky jsou souhrnně označovány jako netfilter framework.

Každý příchozí/odchozí paket v systému aktivuje tyto háčky při svém průchodu zásobníkem. Programy registrované k těmto háčkům tak mohou interagovat s provozem v klíčových bodech. Nakonec se moduly jádra spojené s iptables připojují k těmto háčkům, aby vynutily definovaná pravidla firewallu.

Háčky Netfilteru

Aby se programy mohly připojit, existuje pět různých netfilter háčků. Jak pakety procházejí zásobníkem, háčky aktivují moduly jádra, které jsou u nich registrovány. Podmínka spuštění závisí na okolnostech, jako jsou:  směr paketu (příchozí/odchozí), cíl paketu, zda byl paket v předchozím bodě zahozen/odmítnut atd.

Toto jsou háčky představující různé přesně definované body v síťovém zásobníku:

  • NF_IP_PRE_ROUTING: Tento háček je aktivován jakýmkoli příchozím provozem. K aktivaci dochází před jakýmkoli rozhodnutím o směrování týkajícím se cíle paketu.

  • NF_IP_LOCAL_IN: Tento háček je aktivován po směrování příchozího paketu. Paket musí být zároveň určen pro lokální systém.

  • NF_IP_FORWARD: Tento háček je také aktivován po směrování příchozího paketu. Aktivuje se však v případě, že má být paket směrován na jiného hostitele.

  • NF_IP_LOCAL_OUT: Jakýkoli lokální odchozí provoz aktivuje tento háček, jakmile narazí na síťový zásobník.

  • NF_IP_POST_ROUTING: Tento háček je aktivován jakýmkoli odchozím/přesměrovaným provozem poté, co proběhlo směrování, a to předtím, než paket odejde do sítě.

Moduly jádra, které se chtějí u těchto háčků zaregistrovat, musí poskytnout prioritní číslo. Tato hodnota pomáhá určit pořadí, v jakém budou volány po aktivaci háčku. Tento mechanismus umožňuje více modulům (různým modulům nebo více kopiím stejného modulu) připojit se k jednotlivým háčkům v deterministickém pořadí. Každý modul vrátí po zpracování paketů své rozhodnutí netfilter frameworku.

Tabulky a řetězce v Iptables

K organizaci svých pravidel používá firewall iptables tabulky. Tabulky kategorizují pravidla na základě typu rozhodnutí, která činí. Pokud se například pravidlo zabývá překladem síťových adres (NAT), je zařazeno pod tabulku nat. Podobně, pokud pravidlo rozhoduje o tom, zda povolit nebo zamítnout paket do jeho cíle, přidá se do tabulky filter .

Uvnitř každé tabulky iptables jsou pravidla dále organizována do samostatných “řetězců”. Zatímco tabulka představuje typ pravidel, která obsahuje, řetězce popisují netfilter háčky, které pravidla aktivují. Stručně řečeno, řetězce určují, kdy bude pravidlo vyhodnoceno.

Zde jsou vestavěné řetězce iptables. Zajímavé je, že názvy řetězců také odrážejí název přidruženého netfilter hooků:

Řetězec (iptables) Využití
PREROUTING NF_IP_PRE_ROUTING
INPUT NF_IP_LOCAL_IN
FORWARD NF_IP_FORWARD
OUTPUT NF_IP_LOCAL_OUT
POSTROUTING NF_IP_POST_ROUTING

Pomocí řetězců mohou administrátoři určit, v jaké fázi doručování paketu bude pravidlo vyhodnoceno. Protože každá tabulka obsahuje více řetězců, může také rozšířit svůj vliv na více místech zpracování. Určitá rozhodnutí mají smysl pouze v určitých bodech síťového zásobníku. Proto každá tabulka nebude mít řetězec registrovaný u každého kernel hooku.

Framework netfilter nabízí pouze 5 kernel hooků. Jako takové jsou řetězce z více tabulek registrovány v každém bodě hooků. Pokud mají například tři řetězce řetězce PREROUTING , pak je registrován u hooku NF_IP_PRE_ROUTING . Každý z nich musí poskytnout prioritu, která určuje, v jakém pořadí je řetězec PREROUTING každé tabulky volán. Řetězec PREROUTING s nejvyšší prioritou je vyhodnocen jako první, ten s další nejvyšší prioritou jako druhý a tak dále.

Tabulky iptables

Udělejme krok zpět a podívejme se na tabulky, které iptables nabízí. Jak již bylo zmíněno dříve, každá tabulka představuje různé sady pravidel pro vyhodnocování paketů, uspořádané podle oblasti zájmu.

  • Tabulka filter

V iptables je tabulka filter jednou z nejoblíbenějších. Používá se k určení, zda bude paketu povoleno pokračovat do cíle, či nikoli. V terminologii firewallů se tento proces nazývá “filtrování” paketů.

Jsou to právě funkce tabulky filter tabulky, na které lidé odkazují, když mluví o firewallech (ve většině případů).

  • Tabulka nat

Tato tabulka implementuje pravidla regulující NAT. Když pakety vstoupí do síťového zásobníku, pravidla popsaná v této tabulce rozhodnou, jak upravit zdrojovou/cílovou adresu paketu, což má vliv na směrování paketu a veškerý provoz odpovědí.

Často se tabulka nat používá ke směrování paketů do sítí, kam neexistuje přímý přístup.

  • Tabulka mangle

Tato tabulka obsahuje pravidla, která různými způsoby upravují IP hlavičky paketů. Může například upravit hodnotu TTL (Time to Live) paketu prodloužením/zkrácením počtu platných síťových skoků, které paket může vydržet. Kromě toho může tabulka mangle upravovat další IP hlavičky podobným způsobem.

Tato tabulka může také na paket umístit interní kernelovou “značku”, kterou mohou ostatní tabulky a síťové nástroje převzít k dalšímu zpracování. Tato značka se nedotýká samotného paketu, ale spíše ji přidává do reprezentace paketu v jádře.

  • Tabulka raw

Firewall iptables je stavový, což znamená, že pakety jsou vyhodnocovány v kontextu jejich vztahu k předchozím paketům. Funkce sledování připojení (connection tracking) vyvinutá nad frameworkem netfilter umožňuje iptables nahlížet na pakety jako na součást probíhajícího připojení nebo relace, nikoli jako na proud samostatných, nesouvisejících paketů. Logika sledování připojení se obecně aplikuje velmi brzy poté, co paket dosáhne síťového rozhraní.

Tabulka raw přichází s velmi úzce definovanou funkcí. Jediným účelem této tabulky je poskytnout mechanismus pro označování paketů za účelem odhlášení ze sledování připojení.

  • Tabulka security

Tabulka security umisťuje na pakety interní značky bezpečnostního kontextu SELinux. To následně ovlivňuje, jak bude SELinux (nebo jakákoli jiná aplikace, která interpretuje bezpečnostní kontexty SELinux) s pakety nakládat.

Značky SELinux lze aplikovat na bázi jednotlivých paketů nebo jednotlivých připojení.

Řetězce implementované v každé tabulce

Dosud jsme o tabulkách a řetězcích mluvili odděleně. Je čas projít si, které řetězce jsou v jednotlivých tabulkách k dispozici. Toto téma rozšiřuje diskusi o pořadí vyhodnocování řetězců registrovaných ke stejnému hooku. Co se stane například v případě, že tři tabulky mají PREROUTING řetězce? Jaké je pořadí jejich vyhodnocování?

Dále se podívejte na následující tabulku. Ukazuje řetězce, které jsou k dispozici v rámci každé iptables tabulky.

  PREROUTING INPUT FORWARD OUTPUT POSTROUTING

(rozhodnutí o směrování)

raw

(sledování spojení povoleno)

mangle

nat (DNAT)

(rozhodnutí o směrování)

filter

security

nat (SNAT)

Při čtení zleva doprava popisuje, které tabulky obsahují které řetězce. Například raw tabulka má jak PREROUTING tak OUTPUT řetězce. Při čtení shora dolů popisuje, v jakém pořadí je každý řetězec volán, když je spuštěn jeho přidružený netfilter hook.

Všimněte si, že nat tabulka byla rozdělena mezi DNAT operace (změna cíle paketu) a SNAT operace (změna zdroje paketu), aby bylo jejich pořadí jasnější. Tabulka také obsahovala reprezentační body, kde se provádějí rozhodnutí o směrování a kde je povoleno sledování spojení.

Hooky (sloupce), které paket spustí, závisí na povaze paketu (příchozí/odchozí), provedených rozhodnutích o směrování a na tom, zda paket splňuje kritéria filtrování.

Určité události mohou během zpracování přeskočit řetězec tabulky. Například pouze první paket ve spojení bude vyhodnocen podle pravidel NAT, jak popisuje nat tabulka. Jakýkoli následný paket ve stejném spojení bude mít aplikována stejná nat rozhodnutí bez jakéhokoli dalšího vyhodnocování. Na odpovědi na spojení NAT se automaticky použijí zpětná pravidla NAT pro správné směrování.

Pořadí průchodu řetězcem

Za předpokladu, že server zná pravidla pro směrování paketů a pravidla firewallu povolují přenos, následující toky představují, jak budou procházeny různé cesty:

  • Příchozí pakety určené pro lokální systém: PREROUTING >> INPUT

  • Příchozí pakety určené pro jiného hostitele: PREROUTING >> FORWARD >> POSTROUTING

  • Lokálně generované pakety: OUTPUT >> POSTROUTING

Závěrem, když spojíme všechny dosud probrané informace, vidíme, že jakýkoli příchozí paket určený pro lokální systém bude vyhodnocen podle PREROUTING řetězců v raw, mangle, a nat tabulkách. Poté projde přes INPUT řetězce v mangle, filter, security, a nat tabulkách předtím, než konečně dorazí do lokálního socketu.

Pravidla iptables

Pravidla firewallu iptables jsou umístěna v rámci konkrétního řetězce konkrétní tabulky. Při volání řetězce bude příslušný paket vyhodnocen podle každého pravidla v řetězci. Každé pravidlo má dvě složky: porovnávací složku a akční složku.

  • Porovnávání

Porovnávací část pravidla specifikuje podmínky, které musí paket splnit, než bude provedena zadaná akce (nebo “cíl”).

Porovnávací systém nabízí neuvěřitelnou flexibilitu. Jeho funkčnost lze také rozšířit pomocí iptables rozšíření. Pravidla lze popsat tak, aby odpovídala paketům podle typu protokolu, zdrojové/cílové adresy, zdrojového/cílového portu, zdrojové/cílové sítě, vstupního/výstupního rozhraní, hlaviček, stavu spojení a dalších kritérií. Pravidlo může mít také kombinaci těchto podmínek, což vede ke složitým sadám pravidel pro rozlišení mezi různými druhy provozu.

  • Cíle

Cíl je akce provedená, když paket splňuje kritéria porovnání pravidla. Obecně se cíle dělí do dvou skupin:

    • Ukončující cíle: Ukončuje proces vyhodnocování v rámci řetězce a vrací řízení netfilter hooku. Na základě návratové hodnoty hook buď umožní paketu pokračovat v cestě, nebo jej zahodí.

    • Neukončující cíle: Cíl provede akci a vyhodnocování v řetězci pokračuje. Ačkoli každý řetězec musí projít konečným ukončujícím rozhodnutím, předtím může proběhnout libovolný počet neukončujících cílů.

Dostupnost jednotlivých cílů v rámci pravidel závisí na kontextu. Na dostupnost cílů může mít vliv například typ řetězce a tabulky. Mezi další možné faktory patří aktivovaná rozšíření v pravidle a odpovídající klauzule.

Uživatelsky definované řetězce

Existuje také speciální třída neukončujících cílů: cíl skoku (jump target). Cíle skoku jsou akce prováděné při přechodu vyhodnocování z jednoho řetězce do druhého za účelem dalšího zpracování. Dosud jsme hovořili o vestavěných řetězcích, které jsou úzce spjaty s netfilter hooky, které je volají. Nicméně iptables také umožňuje administrátorům vytvářet vlastní řetězce.

Pravidla v uživatelsky definovaných řetězcích jsou také podobná pravidlům ve vestavěných řetězcích. Klíčový rozdíl je v tom, že uživatelsky definované řetězce jsou dosažitelné pouze “skočením” na ně z nějakého pravidla. Je to proto, že uživatelsky definované řetězce nejsou propojeny s žádnými netfilter hooky.

Uživatelsky definované řetězce si můžete představit jako rozšíření řetězce, který je původně volal. Například v uživatelsky definovaném řetězci se vyhodnocování vrátí zpět do volajícího řetězce, pokud dosáhne konce seznamu pravidel nebo pokud odpovídající pravidlo provede cíl RETURN cíl. Zajímavé je, že uživatelsky definovaný řetězec může vyhodnocování také “přeskočit” na jiný uživatelsky definovaný řetězec.

Tato funkce pokládá základy pro lepší organizaci a nezbytný rámec pro robustní větvení.

Sledování připojení

Při diskuzi o tabulce raw a kritériích shody stavu připojení jsme hovořili o systému sledování připojení implementovaném nad frameworkem netfilter. Tato funkce umožňuje iptables  zobrazovat pakety v kontextu probíhajícího připojení. Systém sledování připojení také poskytuje iptables potřebné funkce k provádění “stavových” operací.

Ihned poté, co paket vstoupí do síťového zásobníku, se použije sledování připojení. Řetězce tabulky raw a některé základní kontroly správnosti jsou veškerou logikou, která se podílí na přiřazování paketů k připojení.

Systém kontroluje každý paket vůči sadě existujících připojení. V případě potřeby systém aktualizuje stav existujících připojení nebo vytvoří nová. Pakety, které byly v jakýchkoli řetězcích tabulky raw označeny cílem NOTRACK, obejdou další rutiny sledování připojení.

  • Dostupné stavy

Připojením, která jsou sledována systémem sledování připojení, bude přiřazen některý z následujících stavů:

    • NEW : Při příchodu paketu, který není spojen s existujícím připojením, ale není neplatný jako první paket, se do systému přidá nové připojení s tímto označením. K tomu dochází jak u protokolů orientovaných na připojení (například TCP), tak u bezspojových protokolů (například UDP).

    • ESTABLISHED: Stav připojení se aktualizuje z NEW  na ESTABLISHED , když obdrží platnou odpověď z opačného směru. U připojení TCP to znamená SYN/ACK. Pro provoz UDP a ICMP to znamená odpověď, kde jsou zdroj a cíl původního paketu prohozeny.

    • RELATED: Pakety, které nejsou součástí připojení, ale souvisejí s navázaným připojením, se označují jako RELATED . Může to znamenat pomocné připojení (například při přenosu dat FTP) nebo odpovědi ICMP na pokusy o připojení jinými protokoly.

    • INVALID: Pakety, které nejsou součástí navázaného připojení, jsou považovány za nevhodné pro otevření nového připojení, nelze je identifikovat, nejsou směrovatelné atd., se označují jako INVALID.

    • UNTRACKED: Paket může být označen jako UNTRACKED , pokud byl v řetězci tabulky raw cílen na obejití sledování.

    • SNAT: Označuje virtuální stav nastavený při změně zdrojové adresy operací NAT. Je zpracováván systémem sledování připojení, takže zdrojové adresy jsou v odpovědních paketech překládány.

    • DNAT: Podobně jako SNAT, značí virtuální stav, kdy je cílová adresa změněna operací NAT. Systém sledování připojení jej zpracovává tak, aby věděl, že má při směrování odpovědních paketů přeložit cílovou adresu zpět.

Tyto stavy sledované systémem sledování připojení umožňují administrátorům vytvářet specifická pravidla zaměřená na konkrétní body v životním cyklu připojení. Poskytuje to nezbytnou funkcionalitu pro důkladnější a bezpečnější pravidla.

Závěrečné myšlenky

V Linuxu, netfilter framework a iptables firewall slouží jako základ pro většinu firewallů. Hooky netfilteru jsou dostatečně blízko síťovému zásobníku, aby umožnily výkonnou kontrolu nad pakety zpracovávanými systémem. S využitím těchto schopností nabízí iptables firewall nabízí flexibilní způsob komunikace požadavků na politiky s jádrem.

Tato příručka jde do hloubky vnitřní struktury netfilter frameworku a iptables firewallu. Kromě toho se zabývá systémem sledování připojení. Pochopením toho, jak tyto části do sebe zapadají, je můžete lépe využít k vytvoření robustnějších a bezpečnějších serverových prostředí.

A nakonec, i když se tato příručka zabývá vnitřním fungováním, podívejte se na tento návod na konfiguraci iptables , abyste je uplatnili v praxi. Kromě toho se můžete podívat, jak firewall UFW dále zjednodušuje iptables. Dále bude užitečné naučit se, jak zobrazit a smazat pravidla firewallu iptables.

Příjemnou práci s počítačem!

author

Preslav Dobrev

Autor · CloudSigma

Preslav Dobrev je kreativní designér ve společnosti CloudSigma, který se zaměřuje na konzistentní firemní identitu prostřednictvím tradičních i inovativních marketingových kanálů. Je zdatný v propojování umělecké vize se strategickým marketingem za účelem vytváření působivých příběhů značky.

Komentáře

Zatím žádné komentáře. Buďte první.