Firewalls

Ondřej Kozina, 120781(zvnč)mail(tčk)muni(tčk)cz

Obsah

Klasifikace firewallů

Obecně lze jako firewall označit zařízení (soustavu zařízení) nebo software, které regulují síťová spojení a přenos mezi některými komponentamy počítačové sítě. Obvyklý scénář si lze představit jako ochranu lokální sítě proti nedovoleným připojením z vnějších sítí, případně regulovat odchozí spojení z lokální sítě do internetu. Rozlišují se různé úrovně, na kterých lze provoz regulovat:

Aplikační firewally

Aplikační firewally regulují přístup konkrétních aplikací nebo služeb. Je možné to zařídit buď formou host-based firewallů, které sledují konkrétní aplikace služby na stroji na kterém jsou spuštěny. Např. proces XY se pokusí připojit (ustavit soketové spojení) k serveru. Firewall odchytí systémové volání, které souvisí s ustavením soketu a nadále rozhoduje podle toho, komu bude patřit vytvořené soketové spojení (př.: může wget stahovat data z portu 80 na hostu videoserver.org ?)

Druhá varianta je tzv. network-based nebo proxy server firewall. Tyto firewally vystupují jako prostředník při komunikaci klienta se serverem. Klient se nejprve připojí k proxu serveru a ten zprostředkuje spojení s hostem. Proxy server rozhoduje na základě pravidel, zda komunikaci povolí nebo nikoliv. Důsledkem těchto firewallů je NAT a server tak nikdy neví kdo je pravým původcem požadavku (všechny spojení jdou z proxy serveru). Nevýhodou takového řešení je poměrně silná zátěž stroje, který hostuje proxy server, v intenzivním síťovém provozu.

Paketové firewally

Paketové filtry posuzují jednotlivé pakety (v OSI modelu do úrovně 3) a rozhodují, jak s nimi naloží bez ohledu na to, kterému spojení pakety patří. Rozhodnutí o tom, zda bude paket firewallem propuštěn jsou dělána na základě čísel portů, typů transportních protokolů a na základě IP adres zdroje a cíle. Aby se paketové firewally bezpečně odlišily od třetího modelu, říká se jim někdy také bezstavové firewally.

Stavové firewally

Jde v podstatě o rozšíření druhého typu firewallů o možnost odlišit již ustavené spojení od nově navazovaných. Výhodou stavových firewallů je, že CPU intenzivní část posuzovaní paketů se obvykle provádí pouze při ustavovaní spojení, zatímco pakety které patří již existujícímu spojení jsou rozhodnuty poměrně levně. Navázané spojení se ukládá do tabulky, ze které jsou smazána po vypršení časového limitu. U UDP se obvykle první příchozí paket posuzuje jakoby se jednalo o SYN paket a ostatní jsou automaticky zařazeny k ESTABLISHED.

Netfilter

Netfiter je framework pro filtrování a manipulaci s pakety uvnitř jádra Linuxu. Počátky projektu jsou z roku 1998. Netfilter navhrl Paul "Rusty" Russel, autor ipchains v jádře 2.2. ipchains byly založeny na projektu ipfw z BSD a šlo o běžný paketový (bezstavový) firewall.

Netfilter hooks

Paket přijatý na síťové rozhraní prochází několik přípojných bodů Netfilteru (tzv. hooks)

    --->[1]--->[ROUTE]--->[3]--->[4]--->
                  |            ^
	          |            |
		  |         [ROUTE]
                  v            |
                 [2]          [5]
                  |            ^
                  |            |
                  v            |

Do jádra je možné psát moduly, které poslouchají na přípojných bodech a odebírají, zpracovávají a někdy i vracejí pakety zpět do zpracování.

Moduly Iptables

Iptables se skládají ze tří Netfilter modulů. Tabulky filter,nat a mangle zajišťují tři různé činnosti:

Moduly iptables využívají služeb modulu conntrack a dohromady tvoří stavový firewall v Linuxu.

Modul conntrack

Modul zprostředkovává evidenci TCP spojení (svým způsobem simuluje i UDP spojení - vysvětlím) a mapuje pakety do těchto kategorií:

Nástroj iptables

iptables jsou také userspace nástroj pro manipulaci s moduly Netfilteru (pro IPv6 je ip6tables). Příkaz má následující syntax:
iptables [tabulka] [akce] [chain] [ip_část] [match] [target] [target_info]

Nejprve se přepínačem -t vybere tabulka netfilter modulu, kterou budeme upravovat. Implicitně je to filter. Následuje jedna z akcí [akce] nad rětezcem [chain]:

V [ip_části] se popisují pravidla, která rozhodují zda bude řádek v řetězci vybrán jako odpovídající na základě IP protokolu (případně transportního protokolu).

Nakonec se rozhodne, jak pokračovat v případě, že paket spadne do příslušného pravidla. Jsou dva přepínače -g, --goto a -j, --jump. Asi nejlepší vysvětlení je citát z diskuze na root.cz:

"Programátorsky: --jump se chová jako CALL, neboli volání subrutiny se zapamatováním návratové adresy, --goto se chová jako JUMP, neboli skok bez zapamatování návratové adresy. :-)"

Jsou základní cíle ([target]) pro přepínače -j a -g: ACCEPT, DROP a REJECT pro tabulku filter. ACCEPT paket přijme v daném řetězci a pokračuje ve zpracování. DROP paket prostě zahodí a REJECT paket odmítne s příslušnou odpovědí prostřednictvím ICMP. Cílem může být také řetězec nebo uživatelem definováný řetězec (pozn. zdroj!=cíl). Pro tabulky nat se používají cíle MASQUERADE, SNAT a DNAT pro přepisování zdrojových nebo cílových adres.

Existuje spousta rozšíření, kterými lze podrobněji specifikovat pravidlo řetězce. Asi nejpoužívanější rozšíření je -m state --state, po kterém následuje výčet kategorií z modulu conntrack, podle kterých lze rozlišovat stav spojení.

Dalším používaným rozšířením je porovnávání zdrojových (--sport 2000:2005) a cílových (--dport 80) portů.

Literatura