Späť na blog

Architektúra Iptables a Netfilter

Architektúra Iptables a Netfilter

A Firewall je bezpečnostné zariadenie (hardvér/softvér), ktoré chráni sieť filtrovaním prevádzky a blokovaním nežiaduceho/neoprávneného prístupu k súkromným údajom. Mať správny firewall je dôležité na ochranu vašich serverov a infraštruktúry. Dokáže nielen blokovať nežiaducu prevádzku, ale aj zabrániť škodlivému softvéru infikovať systém.

V ekosystéme Linux, iptables je populárny firewall, ktorý komunikuje s rozhraním netfilter v jadre Linuxu. Väčšina moderných systémov Linux sa dodáva s týmito predinštalovanými nástrojmi. Ak chcete tieto systémy využiť na maximum, je nevyhnutné porozumieť ich architektúre. V opačnom prípade môže byť vývoj spoľahlivých pravidiel firewallu náročný. Mohlo by to viesť k vytváraniu zložitej syntaxe, vzájomne prepojených častí v rámci frameworku atď.

Tento sprievodca sa podrobne pozrie na architektúru iptables s cieľom pomôcť používateľom, ktorí si potrebujú vytvoriť vlastné pravidlá firewallu. Preskúmame tiež, ako iptables komunikuje s netfilter a ako do seba jednotlivé komponenty zapadajú.

Iptables a Netfilter

V Linuxe je iptables firewall najbežnejší. Funguje tak, že komunikuje s háčikmi na filtrovanie paketov v sieťovom zásobníku jadra Linuxu. Práve tieto háčiky v jadre sa spoločne označujú ako netfilter framework.

Každý prichádzajúci/odchádzajúci paket v systéme spustí tieto háčiky pri prechode zásobníkom. Programy registrované s týmito háčikmi tak môžu interagovať s prevádzkou v kľúčových bodoch. Nakoniec sa moduly jadra spojené s iptables pripájajú k týmto háčikom, aby vynútili špecifikované pravidlá firewallu.

Háčiky Netfilter

Na pripojenie programov existuje päť rôznych netfilter háčikov. Ako pakety prechádzajú zásobníkom, háčiky spúšťajú moduly jadra, ktoré sú s nimi registrované. Podmienka spustenia závisí od podmienok, ako sú:  smer paketu (prichádzajúci/odchádzajúci), cieľ paketu, či bol paket v predchádzajúcom bode zahodený/odmietnutý atď.

Toto sú háčiky predstavujúce rôzne presne definované body v sieťovom zásobníku:

  • NF_IP_PRE_ROUTING: Tento háčik je spustený akoukoľvek prichádzajúcou prevádzkou. K spusteniu dochádza pred prijatím akéhokoľvek rozhodnutia o smerovaní týkajúceho sa cieľa paketu.

  • NF_IP_LOCAL_IN: Tento háčik sa spustí po smerovaní prichádzajúceho paketu. Paket musí byť tiež určený pre lokálny systém.

  • NF_IP_FORWARD: Tento háčik sa tiež spustí po smerovaní prichádzajúceho paketu. Spustí sa však vtedy, ak má byť paket smerovaný na iného hostiteľa.

  • NF_IP_LOCAL_OUT: Akákoľvek lokálna odchádzajúca prevádzka spustí tento háčik hneď, ako zasiahne sieťový zásobník.

  • NF_IP_POST_ROUTING: Tento háčik je spustený akoukoľvek odchádzajúcou/presmerovanou prevádzkou po tom, čo prebehlo smerovanie, predtým ako paket dosiahne sieťové médium.

Moduly jadra, ktoré sa chcú zaregistrovať na týchto háčikoch, musia poskytnúť číslo priority. Táto hodnota pomáha určiť poradie, v akom budú volané po spustení háčika. Takýto mechanizmus umožňuje viacerým modulom (rôznym modulom alebo viacerým kópiám rovnakého modulu) pripojiť sa ku každému z háčikov v deterministickom poradí. Každý modul po spracovaní paketov vráti rozhodnutie frameworku netfilter po spracovaní paketov.

Tabuľky a reťazce v Iptables

Na usporiadanie svojich pravidiel používa iptables firewall tabuľky. Tabuľky kategorizujú pravidlá na základe typu rozhodnutí, ktoré robia. Napríklad, ak sa pravidlo zaoberá NAT (prekladom sieťových adries), potom sa pravidlo zaradí pod nat tabuľku. Podobne, ak pravidlo rozhoduje o tom, či povoliť/zamietnuť paket do jeho cieľa, pridá sa do filter tabuľky.

Vo vnútri každej tabuľky iptables, sú pravidlá ďalej usporiadané v rámci samostatných “reťazcov”. Zatiaľ čo tabuľka predstavuje typ pravidiel, ktoré obsahuje, reťazce popisujú netfilter háčiky, ktoré spúšťajú pravidlá. Stručne povedané, reťazce určujú, kedy sa bude pravidlo vyhodnocovať.

Tu sú vstavané reťazce iptables. Zaujímavé je, že názvy reťazcov tiež zrkadlia názov asociovaného netfilter hookov:

Chain (iptables) Utilisation
PREROUTING NF_IP_PRE_ROUTING
INPUT NF_IP_LOCAL_IN
FORWARD NF_IP_FORWARD
OUTPUT NF_IP_LOCAL_OUT
POSTROUTING NF_IP_POST_ROUTING

Pomocou reťazcov môžu administrátori určiť, v ktorej fáze doručovania paketov sa bude pravidlo vyhodnocovať. Keďže každá tabuľka obsahuje viacero reťazcov, môže rozšíriť svoj vplyv na viacerých miestach spracovania. Určité rozhodnutia majú zmysel len v určitých bodoch sieťového zásobníka. Preto každá tabuľka nebude mať reťazec zaregistrovaný pre každý hook jadra.

Framework netfilter ponúka iba 5 hookov jadra. Ako také sú reťazce z viacerých tabuliek zaregistrované v každom bode hookov. Napríklad, ak tri reťazce majú PREROUTING reťazce, potom sú zaregistrované s NF_IP_PRE_ROUTING hookom. Každý z nich musí poskytnúť prioritu, ktorá určuje, v akom poradí sa volá reťazec každej tabuľky PREROUTING . Reťazec PREROUTING s najvyššou prioritou sa vyhodnocuje ako prvý, s druhou najvyššou prioritou ako druhý a tak ďalej.

Tabuľky iptables

Urobme krok späť a pozrime sa na tabuľky, ktoré iptables ponúka. Ako už bolo spomenuté, každá tabuľka predstavuje rôzne sady pravidiel, usporiadané podľa oblasti záujmu, na vyhodnocovanie paketov.

  • Tabuľka filter

V iptables , je tabuľka filter jednou z najpopulárnejších. Používa sa na určenie, či bude paketu povolené pokračovať do cieľa alebo nie. V terminológii firewallov sa tento proces nazýva “filtrovanie” paketov.

Sú to práve funkcie tabuľky filter na ktoré ľudia väčšinou odkazujú, keď diskutujú o firewalloch.

  • Tabuľka nat

Táto tabuľka implementuje pravidlá regulujúce NAT. Keď pakety vstúpia do sieťového zásobníka, pravidlá popísané v tejto tabuľke rozhodujú o tom, ako upraviť zdrojovú/cieľovú adresu paketu, čo má vplyv na smerovanie paketu a akúkoľvek odpoveďovú prevádzku.

Často sa tabuľka nat používa na smerovanie paketov do sietí, do ktorých nie je priamy prístup.

  • Tabuľka mangle

Táto tabuľka obsahuje pravidlá, ktoré rôznymi spôsobmi upravujú IP hlavičky paketov. Môže napríklad upraviť hodnotu TTL (Time to Live) paketu predĺžením/skrátením počtu platných sieťových skokov (hops), ktoré paket môže vydržať. Okrem toho môže tabuľka mangle upravovať ďalšie IP hlavičky podobným spôsobom.

Táto tabuľka môže tiež umiestniť internú značku jadra (“mark”) na paket, ktorú môžu ostatné tabuľky a sieťové nástroje zachytiť na ďalšie spracovanie. Táto značka sa nedotýka samotného paketu, ale skôr pridáva značku do reprezentácie paketu v jadre.

  • Tabuľka raw

Firewall iptables je stavový, čo znamená, že pakety sa vyhodnocujú v kontexte ich vzťahu k predchádzajúcim paketom. Funkcia sledovania spojení (connection tracking) vyvinutá na vrchu netfilter frameworku umožňuje iptables zobrazovať pakety ako súčasť prebiehajúceho spojenia alebo relácie, a nie ako prúd samostatných, nesúvisiacich paketov. Vo všeobecnosti sa logika sledovania spojení aplikuje veľmi skoro po tom, ako paket dosiahne sieťové rozhranie.

Tabuľka raw prichádza s veľmi úzko definovanou funkciou. Jediným účelom tejto tabuľky je poskytnúť mechanizmus na označovanie paketov s cieľom odhlásiť sa zo sledovania spojení.

  • Tabuľka security

Tabuľka security umiestňuje na pakety interné značky bezpečnostného kontextu SELinux. To následne ovplyvňuje, ako bude SELinux (alebo akákoľvek iná aplikácia, ktorá interpretuje bezpečnostné kontexty SELinux) s paketmi zaobchádzať.

Značky SELinux je možné aplikovať na báze jednotlivých paketov alebo jednotlivých spojení.

Reťazce implementované v každej tabuľke

Doteraz sme hovorili o tabuľkách a reťazcoch oddelene. Je čas prejsť si, ktoré reťazce sú k dispozícii v každej tabuľke. Táto téma rozširuje diskusiu o poradí vyhodnocovania reťazcov zaregistrovaných na rovnaký hook. Čo sa napríklad stane, ak majú tri tabuľky PREROUTING reťazce? Aké je ich poradie vyhodnocovania?

Ďalej sa pozrite na nasledujúcu tabuľku. Ukazuje reťazce, ktoré sú k dispozícii v rámci každej iptables tabuľky.

  PREROUTING INPUT FORWARD OUTPUT POSTROUTING

(rozhodnutie o smerovaní)

raw

(sledovanie spojení povolené)

mangle

nat (DNAT)

(rozhodnutie o smerovaní)

filter

security

nat (SNAT)

Pri čítaní zľava doprava popisuje, ktoré tabuľky obsahujú ktoré reťazce. Napríklad tabuľka raw má oba reťazce PREROUTING aj OUTPUT reťazce. Pri čítaní zhora nadol popisuje, v akom poradí sa jednotlivé reťazce volajú, keď sa spustí ich priradený netfilter hook.

Všimnite si, že tabuľka nat bola rozdelená na operácie DNAT (zmena cieľa paketu) a SNAT (zmena zdroja paketu), aby sa jasnejšie špecifikovalo ich poradie. Tabuľka obsahovala aj reprezentačné body, kde sa robia rozhodnutia o smerovaní a kde je povolené sledovanie spojení.

Hooky (stĺpce), ktoré paket spustí, závisia od povahy paketu (prichádzajúci/odchádzajúci), prijatých rozhodnutí o smerovaní a od toho, či paket spĺňa kritériá filtrovania.

Určité udalosti môžu počas spracovania preskočiť reťazec tabuľky. Napríklad iba prvý paket v spojení sa bude vyhodnocovať podľa pravidiel NAT, ako to popisuje tabuľka nat. Na akýkoľvek nasledujúci paket v rovnakom spojení sa uplatnia rovnaké rozhodnutia nat bez akéhokoľvek ďalšieho vyhodnocovania. Na odpovede na NAT spojenia sa automaticky uplatnia spätné pravidlá NAT pre správne smerovanie.

Poradie prechodu reťazcami

Za predpokladu, že server pozná pravidlá smerovania paketov a pravidlá firewallu povoľujú prenos, nasledujúce toky predstavujú, ako sa bude prechádzať rôznymi cestami:

  • Prichádzajúce pakety určené pre lokálny systém: PREROUTING >> INPUT

  • Prichádzajúce pakety určené pre iného hostiteľa: PREROUTING >> FORWARD >> POSTROUTING

  • Lokálne generované pakety: OUTPUT >> POSTROUTING

Na záver, po spojení všetkých informácií, o ktorých sme doteraz hovorili, vidíme, že akýkoľvek prichádzajúci paket určený pre lokálny systém sa bude vyhodnocovať podľa reťazcov PREROUTING tabuliek raw, mangle, a nat. Potom prejde cez reťazce INPUT tabuliek mangle, filter, security, a nat predtým, ako nakoniec dosiahne lokálny socket.

Pravidlá iptables

Pravidlá firewallu iptables sú umiestnené v rámci konkrétneho reťazca konkrétnej tabuľky. Keď sa reťazec zavolá, príslušný paket sa vyhodnotí voči každému pravidlu v reťazci. Každé pravidlo má dve zložky: zložku zhody a zložku akcie.

  • Zhoda

Časť pravidla týkajúca sa zhody špecifikuje podmienky, ktoré musí paket splniť pred vykonaním špecifikovanej akcie (alebo “cieľa”).

Systém porovnávania ponúka neuveriteľnú flexibilitu. Jeho funkčnosť je možné rozšíriť aj pomocou rozšírení iptables. Pravidlá môžu byť definované tak, aby zodpovedali paketom podľa typu protokolu, zdrojovej/cieľovej adresy, zdrojového/cieľového portu, zdrojovej/cieľovej siete, vstupného/výstupného rozhrania, hlavičiek, stavu spojenia a ďalších kritérií. Pravidlo môže mať aj kombináciu týchto podmienok, čo vedie k zložitým sadám pravidiel na rozlíšenie medzi rôznou prevádzkou.

  • Ciele

Cieľ je akcia vykonaná, keď paket spĺňa kritériá zhody pravidla. Vo všeobecnosti sa ciele delia do dvoch skupín:

    • Ukončujúce ciele: Ukončujú proces vyhodnocovania v rámci reťazca a vracajú riadenie netfilter hooku. Na základe návratovej hodnoty hook buď umožní paketu pokračovať v ceste, alebo ho zahodí.

    • Neukončujúce ciele: Cieľ vykoná akciu a vyhodnocovanie v reťazci pokračuje. Hoci každý reťazec musí prejsť konečným ukončujúcim rozhodnutím, predtým môže prebehnúť ľubovoľný počet neukončujúcich cieľov.

Dostupnosť každého cieľa v rámci pravidiel závisí od kontextu. Napríklad typ reťazca a tabuľky môže ovplyvniť dostupnosť cieľov. Medzi ďalšie možné faktory patria aktivované rozšírenia v pravidle a zodpovedajúce klauzuly.

Používateľom definované reťazce

Existuje aj špeciálna trieda neukončujúcich cieľov: cieľ skoku (jump target). Ciele skoku sú akcie vykonávané vtedy, keď sa vyhodnocovanie presunie z jedného reťazca do druhého na ďalšie spracovanie. Doteraz sme hovorili o vstavaných reťazcoch, ktoré sú úzko prepojené s netfilter hookmi, ktoré ich volajú. Avšak iptables tiež umožňuje administrátorom vytvárať si vlastné reťazce.

Pravidlá v používateľom definovaných reťazcoch sú tiež podobné tým vo vstavaných reťazcoch. Kľúčový rozdiel je v tom, že používateľom definované reťazce sú dostupné iba “skočením” na ne z nejakého pravidla. Je to preto, že používateľom definované reťazce nie sú prepojené so žiadnymi netfilter hookmi.

Používateľom definované reťazce si môžete predstaviť ako rozšírenia reťazca, ktorý ich pôvodne zavolal. Napríklad v používateľom definovanom reťazci sa vyhodnocovanie vráti späť do volajúceho reťazca, ak dosiahne koniec zoznamu pravidiel, alebo ak zhodné pravidlo vykoná RETURN cieľ. Zaujímavé je, že používateľom definovaný reťazec môže vyhodnocovanie tiež “presmerovať skokom” na iný používateľom definovaný reťazec.

Táto funkcia kladie základy pre lepšiu organizáciu a potrebný rámec pre robustné vetvenie.

Sledovanie spojení

Pri diskusii o tabuľke raw a kritériách zhody stavu spojenia sme hovorili o systéme sledovania spojení implementovanom nad rámcom netfilter . Táto funkcia umožňuje iptables  zobraziť pakety v kontexte prebiehajúceho spojenia. Systém sledovania spojení tiež poskytuje iptables potrebnú funkcionalitu na vykonávanie “stavových” operácií.

Ihneď po vstupe paketu do sieťového zásobníka sa aplikuje sledovanie spojení. Reťazce tabuľky raw a niektoré základné kontroly integrity sú jedinou logikou, ktorá sa podieľa na priraďovaní paketov k spojeniu.

Systém skontroluje každý paket voči množine existujúcich spojení. V prípade potreby systém aktualizuje stav existujúcich spojení alebo vytvorí nové. Pakety, ktoré boli označené cieľom NOTRACK v ktoromkoľvek reťazci tabuľky raw, obídu ďalšie rutiny sledovania spojení.

  • Dostupné stavy

Spojeniam, ktoré sú sledované systémom sledovania spojení, bude priradený niektorý z nasledujúcich stavov:

    • NEW : Pri príchode paketu, ktorý nie je spojený s existujúcim spojením, ale nie je neplatný ako prvý paket, sa do systému pridá nové spojenie s týmto označením. Deje sa tak pre protokoly orientované na spojenie (napríklad TCP), ako aj pre bezspojové protokoly (napríklad UDP).

    • ESTABLISHED: Stav spojenia sa aktualizuje z NEW  na ESTABLISHED po prijatí platnej odpovede z opačného smeru. Pre TCP spojenia to znamená SYN/ACK. Pre UDP a ICMP prevádzku to znamená odpoveď, v ktorej sú zdroj a cieľ pôvodného paketu prehodené.

    • RELATED: Pakety, ktoré nie sú súčasťou spojenia, ale súvisia s nadviazaným spojením, sa označia ako RELATED . Môže to znamenať pomocné spojenie (napríklad pri prenose dát cez FTP) alebo ICMP odpovede na pokusy o spojenie inými protokolmi.

    • INVALID: Pakety, ktoré nie sú súčasťou nadviazaného spojenia, sú považované za nevhodné na otvorenie nového spojenia, nedajú sa identifikovať, nie sú smerovateľné atď., sa označia ako INVALID.

    • UNTRACKED: Paket môže byť označený ako UNTRACKED ak bol cieľom v reťazci tabuľky raw na obídenie sledovania.

    • SNAT: Označuje virtuálny stav nastavený vtedy, keď je zdrojová adresa upravená operáciou NAT. Je spracovávaný systémom sledovania spojení, aby sa zdrojové adresy prekladali v odpovedných paketoch.

    • DNAT: Podobne ako SNAT, označuje virtuálny stav, kedy je cieľová adresa zmenená operáciou NAT. Systém sledovania spojení to spracováva tak, aby vedel preložiť cieľovú adresu späť pri smerovaní odpovedných paketov.

Tieto stavy sledované systémom sledovania spojení umožňujú administrátorom vytvárať špecifické pravidlá zamerané na konkrétne body v životnom cykle spojenia. Poskytuje to potrebnú funkčnosť pre dôkladnejšie a bezpečnejšie pravidlá.

Záverečné myšlienky

V systéme Linux netfilter framework a iptables firewall slúžia ako základ pre väčšinu firewallov. Hooky netfilter sú dostatočne blízko k sieťovému stacku, aby umožnili výkonnú kontrolu nad paketmi spracovávanými systémom. Využitím týchto možností iptables firewall ponúka flexibilný spôsob komunikácie požiadaviek na politiku s jadrom.

Tento návod podrobne rozoberá vnútornú štruktúru netfilter frameworku a iptables firewallu. Okrem toho sa zaoberá systémom sledovania spojení. Pochopením toho, ako tieto časti do seba zapadajú, ich môžete lepšie využiť na vytvorenie robustnejších a bezpečnejších serverových prostredí.

Na záver, hoci sa tento návod zaoberá vnútorným fungovaním, pozrite si tento návod na konfiguráciu iptables, aby ste ich uviedli do praxe. Okrem toho môžete vidieť, ako firewall UFW ďalej zjednodušuje iptables. Okrem toho bude užitočné naučiť sa, ako zobraziť a vymazať pravidlá firewallu iptables.

Príjemnú prácu s počítačom!

author

Preslav Dobrev

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.