Semestrální projekt do předmětu TPS

Konfigurace firewallu nad iptables

Autoři:   Lukáš RajskýRAJ029
Stanislav Pustka   PUS039



Úvod

Pod obecným názvem firewall se skrývá systém propojující dvě nebo více sítí a monitoruje, omezuje a připadně pozměňuje provoz mezi nimi.

Typy firewallů


Paketové filtry

Každý IP datagram s sebou nese vyjma vlastních užitečných dat také hlavičku, obsahující zejména IP adresu původce i adresáta, zdrojový a cílový port specifikující program, kterému je datagram určen a další informace popisující komunikaci, ke které datagram náleží. Paketový firewall je pak jakýmsi filtrem, který na základě těchto informací rozhoduje o tom, které pakety mohou být připuštěny až k programům nebo které naopak smějí opustit počítač.

PREROUTING, POSTROUTING, INPUT, OUTPUT a FORWARD jsou tzv. chainy (řetězce), což jsou pomyslné body, kterými paket prochází a kde je možné ho zpracovávat. PREROUTING, resp. POSTROUTING jsou řetězce, do kterých přichází paket těsně po přijetí na rozhraní, resp. těsně před odesláním. INPUTem prochází pakety určené pro lokální procesy, obdobně OUTPUTem prochazí pakety generované lokálními procesy. A konecně retězcem FORWARD prochází pakety, které nejsou určené pro lokální procesy a přeposílají se dále, tedy pokud je povoleno routování paketů proměnnou /proc/sys/net/ipv4/ip_forward == 1

Kromě těchto implicitně definovaných chainu je možné tvořit vlastní, které se řetězí za jednotlivé implicitní. Význam mají pro zprehlednění a zjednodušení konfigurace paketového filtru.

Pro přehlednost jsou zaváděné tzv. tabulky (tables), které sdružují tyto body podle aplikovatelné funkcionality v jednotlivých bodech (tj. každá tabulka je jakoby podmnožina těchto bodů, které mají tu společnou vlastnost, že se v nich dá aplikovat určitá funkce).

Implicitní tabulky jsou tyto:

filter - tabulka týkající se filtrovaní paketů, jejich zahazování a logování. Filtrovat pakety je možné v INPUT, OUTPUT a FORWARD.

nat - tabulka pro NAT, tzn. přepisování zdrojových a cílových adres paketu. Rozlišujeme SNAT (přepis zdrojových adres), DNAT (přepis cílových adres), masquerading (nahrazení zdrojových adres všech paketů jdoucích přes rozhraní adresou tohoto rozhraní) a redirect (přesměrování paketů na lokální počítač; speciální případ DNATu). Nat se aplikuje v chainech PREROUTING (lze aplikovat DNAT, REDIRECT), OUTPUT (DNAT,REDIRECT) a POSTROUTING (SNAT a masquerading).

mangle - tabulka umožňující modifikaci paketu - nastavování TTL, označování (marking) paketu, nastavovani TOS pole v IP zahlavi, ap. (v chainech PREROUTING a OUTPUT).

iptables

K nastavování pravidel slouží nástroj iptables, který je součástí snad všech nových distribucí Linuxu. Jeho použití je vázáno na jádra verzí 2.4.x a 2.5.x. Většina samotné funcionality je implementována přímo v linuxovém jádře případně modulech.

Program voláme s několika parametry. Prvním je místo určení kam chceme pravidlo zařadit. Chceme-li například nějaké pravidlo přidat (append) do řetězce INPUT, uděláme to takto:

iptables -A INPUT pravidlo

pravidlo obsahuje podmínky, se kterými se zkoumaný paket porovnává a cíl (target), tedy co má jádro udělat, pokud zkoumaný paket danému pravidlu vyhovuje.
Nejpoužívanější cíl bývá DROP (paket bude zahozen) nebo ACCEPT (paket bude propuštěn). Dalším cílem může být například REJECT (paket bude zahozen, ale jeho původce bude o tomto informován pomocí chybového hlášení ICMP) nebo LOG (záhlaví paketu je zapsáno do systémového logu).

Parametry paketu použitelné na levé straně pravidla lze rozdělit do dvou skupin:

Celé pravidlo pak může vypadat např. takto:

iptables -A OUTPUT -i eth1 -p TCP -s 192.168.0.1 --sport 3000 --d 192.168.0.2 --dport 25 -j DROP

Přeloženo do přirozeného jazyka: Pokud se v řetězci OUTPUT objeví TCP segment, který bude mít v úmyslu opustit počítač přes rozhraní eth1, jeho odesílatelem bude 192.168.0.1 port 3000 a příjemcem port 25 adresy 192.168.0.2, tak jej nepouštěj.

Pokud některý parametr explictně neuvedeme, bude pravidlo vyhovovat libovolnému paramateru z množiny možných. Pokud tedy například neurčíme cílovou IP adresu pomocí "-d", výchozí hodnotou bude 0/0, tedy libovolná IP adresa.
Firewall je vhodné koncipovat ve smyslu věty "co není výslovně povoleno, je zakázáno". Znamená to, že implicitní politikou ve všech základních řetezcích by mělo být zahazování všech paketů, které nevyhovují některému z pravidel. Začneme tedy zápisem:

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

Stavový firewall

Jádra řady 2.4 přicházejí s koncepčně novým přístupem, kdy při filtrování berou v úvahu nejen informace obsažené v záhlaví zkoumaného datagramu, ale dokáží na něj nahlížet komplexně, v kontextu spojení, do kterého patří. Stavový firewall rozezná paket, který otevírá nové spojení, od paketů, které tuto komunikaci realizují, a díky tomu můžeme precizněji filtrovat datové toky.

Na základě stavové informace můžeme tedy pakety třídit. Můžeme například stanovit, že spojení mohou být navazována pouze směrem z vnitřní sítě ven a ne naopak, přičemž pakety již otevřených spojení mohou putovat oběma směry.

iptables -P FORWARD DROP
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT

SNAT

Příkladem použití SNATu je IP maškaráda nebo-li zamaskování IP adresy routovaných paketů adresou routeru. Do NAT tabulky routeru vložíme následující pravidlo:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

Pravidlo způsobí, že pokud z vnitřní sítě (řekněme z adresy 192.168.0.2) přijde paket, který má v úmyslu opustit router přes vnější rozhraní eth0, tak dojde k nahrazení jeho původní IP adresy za adresu 1.2.3.4. To znamená, že příjemce datagramu bude mít "pocit" jako kdyby s ním nekomunikovala stanice s nesměrovatelnou adresou 192.168.0.2, ale přímo router 1.2.3.4, který pak zajistí, aby se pakety v opačném směru dostaly zpátky k 192.168.0.2. Na uvedeném příkaze si povšimněme "-t nat", což znamená, že pravidlo je určené k zapsání do NAT tabulky.
Jiný příklad definice maškarády může být:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Jaký je tedy v těchto dvou přístupech vlastně rozdíl? Oba dva fungují téměř stejně ovšem u druhého způsobu nemusíme při deklaraci uvádět maskovanou adresu. To je výhodné tehdy, když ji v okamžiku zavádění pravidla ještě neznáme (např. ji získáme z DHCP serveru). První způsob naopak přináší možnost specifikovat ne jednu, ale rozsah adres, to když má náš router k dispozici několik veřejných adres:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.8

DNAT

Naopak DNAT použijeme tehdy, když potřebujeme měnit IP adresu adresáta datagramu. Používá se to při přesměrovávání datagramů na jiného adresáta. Například někde v síti máme umístěný WWW server a rádi bychom na něj přesměrovali všechny požadavky směřující přes náš router:

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.0.2:80

Tímto zápisem jsme zařídili, že pokud se na našem routeru objeví TCP segment určený pro port 80 (WWW server), tak se jeho cílová adresa přepíše na 192.168.0.2.
Tím čím je "-j MASQUARADE" pro SNAT je výraz "-j REDIRECT" pro DNAT, tedy dává nám možnost přesměrovat datagram na jiný port bez znalosti přesné IP adresy. Chceme-li například použít program Squid na portu 3128 v režimu transparentní proxy přesměrujeme všechny HTTP požadavky na port 3128:

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j REDIRECT --to-port 3128



Použitá literatura

[1] http://www.root.cz/clanek/980
[2] http://www.root.cz/clanek/990
[3] http://www.root.cz/clanek/995
[4] L. Lhotka : Server v Internetu, Kopp, České udějovice 2001