Autoři: | Lukáš Rajský | RAJ029 |
Stanislav Pustka | PUS039 |
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ů
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).
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
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.
iptables -P FORWARD DROP
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT
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
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