Vítám vás u druhého dílu o iptables. Minule jsme si ukázali, co je to firewall a jak funguje. Dále jsme si vysvětlili pravidla, řetězce, tabulky a cíle v iptables. Dnes se podíváme na to, jak dát tyto pravidla dohromady a jak zprovoznit jednoduchý firewall.
Přístup vnitřní sítě do internetu
Nejprve si musíme vysvětlit, jak umožníme přístup vnitřní sítě do internetu. Vždyť přece máme jenom jednu veřejnou IP adresu a ta je navíc přidělena serveru! Pokud chce počítač ve vnitřní síti přistupovat k internetu, nezbývá nám, než mu propůjčit naši veřejnou adresu na dobu trvání jeho komunikace. S propůjčením adresy a se situací, kdy chce adresu propůjčit více počítačů, nám pomůže firewall. Jak to funguje? Firewall si zapamatuje, který počítač přistupuje do internetu na jaký port (co je to port viz. minulý díl). Pak tento údaj v každém packetu pozmění tak, aby pro každý počítač byl unikátní. Provede tedy dvě věci:
1. Zdrojovou privátní adresu počítače nahradí za svou veřejnou.
2. Zdrojový port počítače nahradí jiným svým zdrojovým portem.
Tuto záměnu si uloží do své interní tabulky. Pokud přijde nějaký packet (odpověď) na adresu serveru a na zaměněný port, firewall tento packet přepošle na počítač uvedený v tabulce. Díky původního unikátního přidělení zdrojového portu teď firewall rozliší, kterému počítači je packet určen. Počet portů je omezen (65536), proto je třeba dát pozor, aby mohly být všechny počítače obslouženy. Navíc firewall tyto porty mapuje podle určitých pravidel (porty do 1024 mapuje na zdrojový port do 1024, do 4096 mapuje na porty do 4096 a zbytek do zbytku), takže z toho plynou další omezení. Pro malé sítě toto ale není problém. Tato celá technika se jmenuje IP maškaráda (ip masquerade) a jedná se ve své podstatě o jedno konkrétní využití SNATu (viz. minulý díl).
Tímto ale možnosti SNATu zdaleka nekončí. Pokud má server přiděleno více IP adres, tak proč je k propůjčování nevyužít všechny? I toto iptables dokáže a stačí jenom uvést, které adresy má pro zapůjčování využít. Pak se jedná o takzvaný pool adres a firewall se o všechno postará sám (přidělování adres pak probíhá jednoduchým round-robin plánováním). To je vše co potřebujeme vědět o přístupu vnitřní sítě do internetu a můžeme se pustit do základní konfigurace pravidel.
Jednoduchý firewall
Nejjednodušším firewallem je takový, který všechno povolí. Nicméně taková konfigurace se ani nedá považovat za firewall, ale i tak má své využití. Například pro ladění. Pokud máte nastavený firewall, potřebujete nejprve smazat stávající pravidla, abyste mohli nahrát nové. Pokud zároveň celá vnitřní síť aktivně využívá internet, došlo by k chvilkovému výpadku v době přechodu na nová pravidla. Pokud místo smazání pravidel vše povolíte (a popřípadě přidáte SNAT), pak vnitřní síť žádný výpadek nepocítí. Druhá výhoda je zřejmá, pokud firewall přenastavujete vzdáleně. Pak totiž musíte firewall vypnout a zapnout v jediném příkazu. Proto je lepší nejprve vše povolit, protože kdyby nastal problém při nastavování nových pravidel, nezůstanete od serveru odříznuti. Představme si, že eth0 je rozhraní vnitřní sítě a eth1 je rozhraní vnější sítě. Adresa 1.2.3.4 je IP vnějšího rozhraní našeho serveru. Pak následujícím kódem povolíme všechnu komunikaci:
/sbin/iptables -t filter -P INPUT ACCEPT
/sbin/iptables -t filter -P OUTPUT ACCEPT
/sbin/iptables -t filter -P FORWARD ACCEPT
/sbin/iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 1.2.3.4
První tři pravidla nastavují implicitní politiky (viz. minulý díl) a povolují veškerou komunikaci. Poslední pravidlo spouští ip maškarádu (vkládáme do tabulky nat, do řetězce postrouting, podmínka je, že packet odchází rozhraním eth1 a cílem je záměna zdrojové adresy).
Složitější pravidla a techniky
Často na serverech bývá zprovozněna takzvaná transparentní proxy. Co znamená proxy jistě všichni víte. Transparentní znamená, že o ní koncový uživatel neví. O zprovoznění takovéto proxy se nám zase postará firewall. Představme si, že nám proxy běží na serveru na portu 3128. Počítače z vnitřní sítě posílají své požadavky na web servery do internetu na port 80. Jediné, co potřebujeme zajistit, je následující: firewall vezme každý packet, jehož cílový port je 80 (tzn. snaží se přistoupit na nějaký webserver) a přesměruje ho na port 3128. Tam už si jej převezme naše proxy. Tímto způsobem se uživatel nedozví, že jeho požadavky běží přes transparentní proxy. Jak to zapíšeme?
/sbin/iptables -t nat -A PREROUTING -p tcp -i ! eth1 -d ! 1.2.3.4 --dport 80 -j REDIRECT --to-port 3128
Poslední technika, kterou potřebujeme pochopit předtím, než si nakonfigurujeme plnohodnotný firewall, je optimalizace datových cest. Firewall dokáže snižovat dobu zpracování packetu, nebo maximalizovat propustnost apod. Vždy na úkor něčeho jiného. Pro úplný výpis, jaké všechny optimalizace iptables umožňuje, použijte příkaz:
/sbin/iptables -m tos -h
Optimalizací se v iptables zabývá tabulka mangle. Pokud budeme chtít optimalizovat ssh, nastavíme mu minimální odezvu. Naopak je tomu u dat ftp, tam by mělo být naším cílem spíše maximalizování propustnosti. Optimalizaci ssh a dat ftp provedeme takto:
/sbin/iptables -t mangle -A PREROUTING -p tcp --sport ssh -j TOS --set-tos Minimize-Delay
/sbin/iptables -t mangle -A PREROUTING -p tcp --dport ssh -j TOS --set-tos Minimize-Delay
/sbin/iptables -t mangle -A PREROUTING -p tcp --sport ftp-data -j TOS --set-tos Maximize-Throughput
V prvních dvou pravidlech nastavujeme minimální zpoždění pro packety na portu ssh oběma směry. V posledním pravidle se snažíme dosáhnout co největší propustnosti dat na portu FTP.
Závěr
V dnešním článku jsme si vysvětlili složitější techniky a pravidla. Tyto by měly být základem každého kvalitního firewallu, proto je třeba jim dobře porozumět, než se pustíme do konfigurace. V příštím díle si pomocí skriptu zprovozníme plnohodnotný firewall a vysvětlíme si jednotlivá pravidla.
Autor: Radim Poloch