Hlavní navigace

FireHOL - nejsnazší firewall

3. 2. 2005
Doba čtení: 5 minut

Sdílet

Každý, kdo se někdy dostal k nutnosti nastavit firewall v Linuxu pomocí iptables, mi jistě dá zapravdu, že jde o poměrně zdlouhavou proceduru a navíc je výsledný script značně rozsáhlý a nepřehledný. Přesně to samé si zřemě řekl i Costa Tsaousis, autor projektu FireHOL, a vytvořil sadu shell scriptů, které celou záležitost dělají tak snadnou, jak to jenom jde.

FireHOL lze získat na adrese firehol.source­forge.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/fi­rehol.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í.

ict ve školství 24

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.

Autor článku