Firewally

Simon Rerucha <xrerucha(at)fi.muni.cz>


Obsah


Co to je

Pod obecnym nazvem firewall se skryva system propojujici dve nebo vice siti a monitoruje, omezuje a pripadne pozmenuje provoz mezi nimi. Existuji dve zakladni filosofie:

Paketove filtry

Paketove filtry v nejjednodussi podobe pracuji na sitove vrstve podle ISO/OSI modelu, zakladni zpracovavanou entitou jsou jednotlive pakety. Jak cas postupoval, paketove filtry trosku vystrcily ruzky a rozsirily svoje pole pusobnosti i na linkovou (klasifikace podle MAC adres) a transportni vrstvu (zpracovani TCP proudu ), a jednotlive implementace paketovych filtru castokrat i s prihlednutim k aplikacnim protokolum na relacni vrstve (FTP, IRC).

Vyhodou paketovych filtru je jejich nenarocnost na system i hardware (obligatni jednodisketove firewally bezici v RAM na 386ce), dale neni treba specialni podpory v aplikacich na nadrazenych vrstvach. Nevyhodou je nedosazitelnost vyssich protokolu (napr. autentizace uzivatele).

Aplikacni brany

Aplikacni brany naopak pracuji az nekde kolem prezentacni a aplikacni vrstvy. Vetsinou funguji v kontextu client-server pozadavku jako prostrednici (analogie man-in-the-middle), tj. ze vuci klientovi vystupuji jako server a vuci serveru jako klient.

Vyhodou je moznost definovat pravidla na zaklade parametru pozadavku (zakazani porna, omezeni velikosti stahovanych souboru, autentizace uzivatele, ... ). Neni potreba specialni podpora jadra, zato vetsinou si s aplikacni branou musi rozumet aplikace.

Stateful inspection (Hloubkova inspekce)

je rozsireni paketovych filtru o moznost rozpoznavat pozadavky na vyssich urovnich - napr. vyse zminene TCP streamy. Oznacovana obcas jako dynamicky paket-filtering. V podstate je kombinaci obeou predchozich pristupu. Je narocna na vykon, firewall musi projit a analyzovat kazdy paket cely a drzet pomerne netrivialni stavovou informaci o jednotlivych proudech a pozadavcich.

V praxi je casto zamenovan pojem firevall za paketovy filter, nejinak tomu bude v nasledujici stati.


Paketove filtry na linuxu

Netfilter, IPtables

Projekt netfilter/iptables je firewallovy subsystem pro linuxy rady 2.4.x a 2.5.x. Prinasi moznost filtrovani paketu (packet-filteringu), jak stavoveho tak bezstavoveho (stateful/stateless), preklad sitovych adres(NAT, network address translation) a alteraci paketu (packet mangling).

Vetsina samotne funcionality je implementovana primo v linuxovem jadre (pripadne modulech), ke konfiguraci subsystemu se pak pouzivaji obsluzne binarky.

Paket pri ceste jadrem prochazi po pomyslne kostre, kterou lze naznacit zhruba takto:


     network
       ||		
       \/
 +-------------+
 | PREROUTING  |
 +-------------+
       ||
  -------------	       +-------+
< input routing > ==== | INPUT | ====++
  -------------	       +-------+     ||	
       ||			    local
       ||			    apps
 +-------------+		     ||
 |   FORWARD   |		 +--------+
 +-------------+		 | OUTPUT |
       ||			 +--------+    
       ||	  --------------     ||	
       ++ =====	< output routing > ==++
       ||	  --------------
       ||
 +-------------+
 | POSTROUTING |
 +-------------+
       ||		
       \/
     network
Okynka oznacena PREROUTING, POSTROUTING, INPUT, OUTPUT a FORWARD jsou tzv. chainy (retezce), coz jsou pomyslne body, kterymi paket prochazi a kde je mozne ho zpracovavavat.

PREROUTING, resp. POSTROUTING jsou retezce, do kterych prichazi paket tesne po prijeti na rozhrani resp. tesne pred odeslanim. INPUTem prochazi pakety urcene pro lokalni procesy, obdobne OUTPUTem prochazi pakety generovane lokalnimi procesy. A konecne retezcem FORWARD prochazi pakety, ktere nejsou urcene pro lokalni procesy a preposilaji se dale.

Krome techto implicitne definovanych chainu (iplicitnich, built-in) je mozne tvorit vlastni, ktere se retezi za jednotlive implicitni. Vyznam maji pro zprehledneni a zjednoduseni konfigurace paketoveho filtru. Nebo taky k zesloziteni, pokud jsou pouzivany zbytecne moc.

Pro prehlednost jsou zavadene tzv. tabulky (tables), ktere sdruzuji tyto body podle aplikovatelne funkcionality v v jednotlivych bodech (tj. kazda tabulka je jakoy podmnozina techto bodu, ktere maji tu spolecnou vlastnost, ze se v nich da aplikovat urcita funkce). Tabulky jsou implicitne zadany tyto:

filter - tabulka tykajici se filtrovani paketu, jejich zahazovani a logovani. Filtrovate pakety je mozne v INPUT, OUTPUT a FORWARD, i kdyz vyznam nekterych je dost pofiderni.

nat - tabulka starajici se o NAT, tzn. prepisovani zdrojovych a cilovych adres paketu. Rozlisujeme SNAT (prepis zdrojovych adres), DNAT (prepis cilovych adres), masquerading (nahrazenim zdrojovych adres vsech paketu jdoucich pres rozhrani adresou tohoto roahrani) a presmerovani (redirect), cimz se zde mini presmerovani paket na lokalni pocitac (de-facto specialni pripad DNATU). Nat se aplikuje v chainech PREROUTING (lze aplikovat DNAT, REDIRECT), OUTPUT (taktez DNAT,REDIRECT) a POSTROUTING (SNAT a masquerading).

mangle - tabulka umoznujici modifikaci paketu - nastavovani TTL, oznacovani (marking) paketu, nastavovani TOS pole v IP zahlavi, ap. , v chainech PREROUTING a OUTPUT.

Tak mame chainy, tabulky a pekny zmatek, co s tim dal ? Kazdy retezec obsahuje sadu pravidel, a implicitni chovani (politika, policy). Kazde pravidlo obsahuje pominku (podminky) a cil.

Podminkou muze byt libovolny parametr paketu. Hlavne tedy parametry IP (zdrojova/cilova adresa, typ protokolu vyssi urovne, vstupni/vystupni rozhrani, ...), dale pro jednotlive protokoly nizsich (arp - filtrace podle MAC adres) i vyssich urovni - TCP/UDP (zdrojovy/cilovy port, ... ), ICPM (typ zpravy), dale podle oznaceni paketu, stavu spojeni (NEW - nove spojeni, INVALID - paket nepatrici k zadnemu zpojeni, RELATED/ESTABLISHED - paket prinalezi k jiz existujicimu spojeni), UID procesu generujiciho procesu u lokalne generovanych paketu etc.

Cilem muze byt:

Strucne o poslednim bode: cil LOG a ULOG zpusobi zapis o paketu do logu, prosterdnictvim syslogu prip. predanim do userspace, ma vyznam prevazne v tabulce filter. MARK,TOS a TTL urcuji alteraci paketu, pouzitelne pouze v tabulce mangle. SNAT, DNAT, MASQUERADE a REDIRECT jsou aplikovatelne v tabulce nat, SNAT a REDIRECT v chainu PREROUTING, DNAT a MASQUERADE v POSTROUTING a OUTPUT. Konecne REJECT je obdoba DROP, jenom je odesilateli poslana ICMP zprava.

Minuly odstavec je sice znacne neprehledny, ale jakekoliv delsi rozepisovaniu by bylo pouhym prekladanim manove stranky, coz asi neni ucelem ...

K vetsine cilu se vazi nejake povine ci volitelne parametry, detaily si najdete v nejakem z nescetnych tutorialu. Nakonec zjistite, ze nad man iptables neni.

Implicitni politikou muze byt jeden z vyse uvedenych cilu, krome chainu (implicitnich i uzivatelskych). Politika muze by definovana pouze u implicitnich chainu.

Priklady tahnou ....

Filter

# defaultne nenechame nic projit ani odejit
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# povolime Echo Request, Echo reply, Dest Unreachable a Time Exceeded
iptables -A INPUT -p ICMP -i eth0 --icmp-type 0 -j ACCEPT
iptables -A INPUT -p ICMP -i eth0 --icmp-type 3 -j ACCEPT
iptables -A INPUT -p ICMP -i eth0 --icmp-type 8 -j ACCEPT
iptables -A INPUT -p ICMP -i eth0 --icmp-type 11 -j ACCEPT

# zakazem nesmyslne pakety zvenci
# v nat je to proto, aby se previdlo nemuselo opakovat zvlast pro INPUT a FORWARD
iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP

# zkusime si udelat vlastni chain, ktery bude zvenci 
# poustet pouze pakety prislusici  nejakemu spoojeni, nove jenom zevnitr
iptables -N block
iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT
iptables -A block -j DROP

# ... a navazeme ho  na INPUT a FORWARD.
iptables -A INPUT -j block
iptables -A FORWARD -j block

NAT

# jednoducha maskarada - zamaskujem vse, co jse pres eth0
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# a nebo zamaskujeme pouse adresy 10.0.0.0/24
iptables --table nat --append POSTROUTING --source 10.0.0.0/24  -j SNAT --to-source 147.251.315.408

# chceme presmerovat pozadavky z firewallu na zanimstojici WWW
iptables -t nat -A PREROUTING -p tcp -d 11.22.33.44 --dport 80 -i eth0 -j DNAT --to 192.168.0.2:80

# a nebo na port 8080, kde ceka proxy.
# v principu to nemusi byt uplne dobry napad, nefunguje napr HTTP autentizace   
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080


Mangle

# nastavime znacku paketu jdoucich na port ssh
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

# pohrajeme si s TTL paketu
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64
iptables -t mangle -A PREROUTING -i eth1 -j TTL --ttl-dec 1
iptables -t mangle -A PREROUTING -i eth2 -j TTL --ttl-inc 1

Starsi zalezitosti

Netfilter/IPTables je zalezitost pomerne nova, co tedy bylo drive ? V linuxovych kernelech rady 2.0.x se pouzivala k nastavovani pravidel utilitka ipfwadm. Existovaly chainy INPUT, OUTPUT a FORWARD s podobnou semantikou jako stejnojmene chainy u netfilteru, a chain ACCOUNT, ktery se staral o uctovani a (vicemene) maskarady ci presmerovani. Akce aplikovatelne na paket byly accept, reject a deny (= DROP u netfilteru). Pakety bylo lze filtrovat podle zdrojove/cilove adresy, protokolu (ne obecne, pouze pevne definovana podmozina), zdrojoveho/ciloveho portu (TCP,UDP), rozhrani a TCP ACK flagu.

V jadrech 2.2.x se objevil balicek ipchains, jako vylepsena verze ipfwadm. Oproti ipfwadm umi jiz vytvaret vlastni retezce, pouzit hvezdickovou notaci u nazvu rozhrani, nove lze pracovat s fragmentovanymi pakety, filtrovat ICMP podle typu aj. Vytratil se uctovaci retezec, funkcionalita se rozdelila do ostatnich built-in chainu. Pribyly dalsi akce: , MASQ (jiz neni vedlejsim efektem jako u ipfwadm), RETURN a REDIRECT.

Fakt to musim psat rucne ?

Udrzovat firewall ktery zpracovava vic nez cca 30 pravidel muze bytr vyseuvedenym zpusobem minimalne casove narocne, ne-li zbytecne slozite. Proto existuje spoustu apliaci, ktere se honosi nazvem firewall, a ktere pravidla pro IPtables tvori za vas.

PCXFirewall - pomerne sofitikovany generator pravidel pro iptables, napsany v perlu. Je treba se v iptables trosku orientovat, ale poskytuje temer vsechny moznosti co standardni distribuce Netfilteru.

FireHOL - velice jednoduse konfigurovatelny paket filter (se stavovou inpekci). Ovladany pomoci jednoduchouckeho metajazyka, pravidla se definuji spise z aplikacniho pohledu. Neumi NAT a packet mangling.

Dalsim z rady je skriptik iptables-control, ktery na zaklade bash-like konfiguraku vytvori (zcela nacekane) pravidla pro netfilter. Jako tresnicku podporuje port forwarding.

Zajimava hracka je i IPTables log analyzer, ktery logy z netfilteru zpracovava do HTML podoby a umoznuje tak snazzsi orientaci ve vystupech filtru.

Existuje spousta dalsich, mensich ci vetsich podobnych projektu, pocinaje malymi skriptiky konce pomerne rozsahlymi projekty. Jsou k videni i graficke nadstavby. Stoji za to se porozhlednout i po doplnujicich utilitkach, ktere cini dobre nastaveny firewall alespon castecne pouzitelnym.


Paketove filtry na BSD

Na FreeBSD zajistuje nastaveni firewallu utilitka ipfw. V soucasne dobe je k dispozici rozsirena verze ipfw2, ktera oproti sve starsi verzi prinasi radu rozsireni. Oproti netfilteru zde neni zadna kostra, ale funkcionalita je v zasade stejna. Narozdil od netfilteru je implicitne po instalaci velice restriktivne nastaven, s cimz je potreba pocitat treba u instalaci na dalku. Pekny navod jak na to je na http://www.freebsd.cz/~michal/doc/ipfw.html.

Jiny uhel pohledu

Par obecnych proverenych principu:

Zdroje a odkazy

serial "stavime firewall" na R00tu (1. dil, 2. dil a 3. dil)
jeden , druhy web o bezpecnosti
firewally - kapitola z FreeBSD handbook
http://www.freebsd.cz/~michal/doc/ipfw.html - ipfw cesky a srozumitelne
man iptables - doporucuji precist
perlipq - PERLovy modul, implmentace API pro zpracovani paketu v userspace (iptables)