FireHOL lze získat na adrese firehol.sourceforge.net. Po rozbalení stačí nakopírovat spustitelné scripty podle vlastního uvážení, já perferuji /usr/local/bin. Dále je třeba založit adresář /etc/firehol, a tím je intalace hotová.
Samotné nastavování firewallu je velmi jednoduché. Do souboru /etc/firehol/firehol.conf se zapisuje velmi stručně a troufám si říci, že i velmi přehledně.
Vše se nejlépe objasní na příkladu. Pro začátek zvolím pomyslný jednoduchý web server, na kterém má být dostupný Apache a ssh, počítač má jednu síťovou kartu konfigurovanou jako eth0. Konfigurace jeho firewallu může vypadat takto:
home_ips="192.168.10.85" interface eth0 internet src not "${home_ips} ${UNROUTABLE_IPS}" protection strong 10/sec 10 server ident reject with tcp-reset server http accept server ssh accept server ping accept client icmp accept client http accept client ping accept client dns accept client smtp accept client ftp accept client ntp accept client ssh accept
První řádek je pouhým nastavením proměnné, kterou využívám dále. Na druhém řádku sděluji FireHOLu, že počítač má síťové rozhranní eth0, které jsem pojmenoval internet. Na rozhranní se dívám vždy zvenku, a proto je doplněno, že nebudu akceptovat pakety, které mají mou vlastní adresu – pokud přicházejí zvenku, jsou nepochybně podvržené. Proměnná UNROUTABLE_IPS je definovaná interně a obsahuje seznam adres, které jsou vyhrazeny pro vnitřní sítě a neměly by se tedy vyskytnout na Internetu. Na druhou stranu, už jsem se s nimi setkal, a to u naprosto korektních přípojných bodů.
Na třetím řádku přitvrzuji a přidávám příkaz protection. To je interní příkaz FireHOLu, který má nekolik parametrů: fragments – zahazuje všechny samostatné fragmenty (viz dokumentaci), new-tcp-w/o-syn – zahazuje pakety, které otevírají spojení, ale nemají nastaven SYN bit, syn-floods a icmp-floods zapínají ochranu před DOS útokem, malformed-xmas, malformed-null a malformed-bad pak zahazují vadné pakety. Zde použitý parametr strong je aliasem, který zapíná všechno. Čísla uvedená nakonci představují limity pro výše uvedené parametry, jejich význam je popsán v dokumentaci iptables.
Řádky začínající příkazem server snad není třeba více komentovat. Povolují přístup k uvedeným službám zvenku. Hlavní jsou samozřejmě služby http a ssh, ale samozřejmě je vhodné povolit i ping a ident. Parametr příkazu služby ident by měl zajistit, že pokud přijdou požadavky s vypršenou platností, budou zahozeny.
Obrácený směr, tj. požadavky zevnitř serveru, povolují řádky začínající příkazem client. Tj. vyjmenuji ty služby, které bude server chtít navazovat zevnitř – http a ftp pro stahování aktualizací, ntp pro nastavování času, ping a icmp pro kontrolu síťového připojení, dns pro potřeby apache, smtp, aby mohl posílat případné alerty, a protokolem ssh se přenáší záloha na jiný stroj. Kdybych chtěl povolit veškerý provoz, mohl bych použít alias all místo vyjmenovávání jednotlivých protokolů.
Celý firewall nyní mohu aktivovat příkazem firehol.sh start. Dalšími parametry příkazu firehol.sh jsou obligátní stop, restart a několik dalších. Za velmi užitečný považuji try, který umožňuje nastavené hodnoty vyzkoušet, a pokud není nový stav do 30 vteřin potvrzen, vrátí se nastavení firewallu do původního stavu.
Pokud bych chtěl tento server použít jakou router (já vím, že by se to dělat nemělo, ale berme to jako příklad), přidám další síťové rozhraní, na které připojím vnitřní síť. Nové rozhranní bude mít označení eth1. Do vnitřní sítě teď budu chtít poskytovat navíc službu proxy serveru pro web.
interface eth1 home policy reject server "squid http ssh" accept client all accept
Trochu jsem si zjednodušil nastavení přístupu k vnitřní síti, kde jsem použil alias all, je to stejné jako v předchozím příkladu, all zastupuje všechna spojení. Na třetím řádku je vidět další možné zjednodušení – spojení více protokolů do jednoho pravidla. Nový je příkaz policy, výchozí politika uplatňovaná na rozhranní je „deny“, ale v případě vnitřní sítě se klient dozví, že byl odmítnut, a nemusí čekat na timeout, takže nastavím „reject“. Až dosud byl nastavován přístup na server a ze serveru; teď se můžeme pustit do nastavení přístupu skrze firewall z jedné síťě do druhé.
router home2internet inface eth1 outface eth0 masquerade route all accept router internet2home inface eth0 outface eth1 route ident reject with tcp-reset
Příkazem router se nastavují pravidla pro povolení směrování. Základními parametry jsou rozhranní, ze kterého na které se bude předávat. Ve směru zevnitř ven je povolen veškerý provoz a navíc je zapnuta maškaráda. Zvenku dovnitř je povolen pouze ident, stejně jako již bylo uvedeno u samotného vnějšího rozhranní.
Tím považuji ukázkový firewall za nastavený. Jak je vidět, je nastavení firewallu velmi jednoduché a hlavně přehledené.
Až dosud jsem popisoval poměrně triviální požadavky na firewall. FireHOL je schopen se vyrovnat i se složitějšími požadavky. U většiny příkazů, zejména server, klient a route, lze použít navíc parametry src a dst, sport a dport, log, limit. A další poněkud exotičtější, jako jsou mark, uid, pid, sid; pro jejich nastavení je už vhodné si přečíst dokumentaci a rozumět alespoň trochu síťovému provozu. Je možno i přímo volat příkaz iptables se všemi jeho parametry.
Podpora services, tj. toho, co je možné požívat jako parametr příkazu server a client, je velmi široká, od velmi rozšířených protokolů http, smtp, pop3, squid apod. až po poměrně exotické používané sítěmi vpn, grafickými terminály a dalšími méně rozšířenými službami. Celkem je podporováno asi 80 services a autor se nebrání doplnění dalších. V samotném konfiguračním souboru je možnost si jednoduše dodefinovat vlastní.
Co když možnosti FireHOLu opravdu nestačí? Dosud jsem zamlčoval poměrně důležitý fakt, totiž to, že způsob, jak FireHOL zpracovává konfigurační script (je samozřejmě popsán v dokumentaci), umožňuje požívat v konfiguračním scriptu i normální příkazy použitelné v shellu bash, a tím vlastně padají veškerá omezení. A zkušenější síťař si může doplnit, cokoliv uzná za vhodné.
Autor na svých stránkách uvádí slogan „FireHOL, a firewall for humans…“, a podle mého názoru jej velmi dobře splňuje. Konfigurace jednoduchých věcí je jednoduchá, aniž by bylo znemožněno provádění věcí složitých, a to je ten nejlepší přístup.