Základní úkol firewallu je oddělovat zóny s rozdílnou úrovní důvěryhodnosti. Jako příklad lze uvést internet, což je prostředí s nulovou úrovní důvěryhodnosti a podnikovou síť, kde je úroveň důvěryhodnosti vysoká. Firewall by měl ochránit služby které chceme poskytovat jen uživatelům v podnikové síti před použitím použitím zvenčí (z internetu).
Důvod proč chceme omezit přístup k různým službám může být jednak zamezení využítí těchto služeb neoprávněnými uživateli a jednak zamezenení zneužití potencionálních chyb v programech které tyto služby poskytují. Zpravidla bychom se tedy měli snažit ponechat přístupné jen ty služby, které opravdu potřebujeme a vše ostatní zakázat.
První firewally se objevily koncem 80-tých let, tedy v dobách, kdy byl internet poměrně novou technologií. Důvodem jejich vzniku byla potřeba reagovat na množství závažných bezpečnostních nedostatků tehdejších systémů.
Za první rozsáhlý útok na internetovou bezpečnost je často považován počítačový červ známý jako Morris Worm, napsaný v roce 1988 studentem Cornell University R. T. Morrisem. Červ využíval bezpečnostních chyb v programech sendmail, finger a rsh/rexec. Původně nebyl napsán aby působil škodu, ale za účelem změřit "velikost" internetu. Avšak v důsledku toho že virus napadal i již napadené stroje, začal napadené stroje příliš zatěžovat a to nakonec vedlo k jejich výpadku. Podle oficiálních statistik bylo celkově napadeno asi 6000 unixových systémů a vznikla škoda okolo 10 až 100 milionů dolarů.
Pracují jako paketové filtry rozhodnující které pakety propustí a které zablokují na základě pravidel zadaných administrátorem.
Mohou se rozhodovat na základě:
Mohou se dále rozdělit na stavové a bezstavové. Stavové filtry se mohou rozhodovat i na základě stavu spojení - např. zda paket patří k již vytvořenému spojení, nebo spojení teprve otevírá - což výrazně zjednodušuje konfiguraci.
Výhodou paketových filtrů je především vysoká rychlost, slušná úroveň zabezpečení a relativně snadná konfigurace, což snižuje riziko chybného nastavení administrátorem.
Příkladem paketového filtru jsou iptables v linuxu.
Označovány také jako aplikační brány, nebo proxy firewally. Komunikace skrz aplikační bránu probíhá ve dvou krocích - nejdříve se klient připojí k bráně, a ta na základě jeho požadavku otevře nové spojení s cílovým serverem. Data která brána obdrží od serveru potom pošle zpět klientovi (pokud usoudí že jejich obsah je nezávadný).
Aplikační brány se mohou rozhodovat na základě inspekce dat, které proudí mezi klientem a serverem a blokovat obsah který správce systému považuje za závadný (určité webové stránky, viry, nebo pokusy o zneužití známých logických chyb klientských programů).
Výhodou aplikačních bran je vyšší úroveň zabezpečení, než jaké lze dosáhnout u paketových filtrů, ale je to za cenu větších nároků na HW firewallu a nižší rychlosti práce.
Fungují a úrovni operačního systému. Mohou např. odepřít jednotlivým aplikacím přístup k síti, nebo jim zakázat spouštění jiných aplikací. Případně lze s jejich pomocí povolit spouštění pouze aplikací které jsou v inventáři povolených aplikací. Aplikační firewally jsou vývojově nejnovějším typem firewallů (z těch jmenovaných) a jsou z nich asi nejméně rozšířené.
NAT - Network Address Translation, neboli překlad adres slouží ke změnám zdrojových (SNAT - Source NAT) a cílových (DNAT - Destination NAT) adres v hlavíčkách paketů.
Překlad adres se nám může hodit například pokud máme síť kterou chceme připojit k internetu, ale nemáme k dispozici takový rozsah adres abychom mohli dát každému počítači vlastní adresu.
Výhoda pro administrátora je v tom že počítače skryté za NATem nejsou z internetu přímo přístupné, takže se na ně hůř útočí. Z toho ale pramení i nevýhoda NATu - nelze navázat spojení z internetu se strojem schovaným za natem, což znemožňuje použití některých aplikací na těchto strojích.
První paketový filtr se objevil v jádrech řady 1.1. Byl založen na ipfw z BSD a na linux portován Alanem Coxem v roce 1994. V linuxu 2.0 přibyla utilita ipfwadm pro nastavování filtrovacích pravidel. ipfwadm umožňoval zatím jen nastavit seznam pravidel ve kterých se popisovalo kterých paketů se pravidlo týká a co s takovým paketem dělat.
V roce 1998 v linuxu 2.2 byl vytvořen nástroj ipchains (autorem Rusty Russell). ipchains přinesly rozšíření o řetězce pravidel (chains).
V linuxu 2.3 byli bezstavové ipchains nahrazeny novým stavovým paketovým filtrem netfilter a jeho administračním nástrojem iptables který se používá dnes. Autorem je také Rusty Russell. Oproti ipchains přibyly v iptables tabulky, do ktetých se řetězce pravidel dělí.
netfilter obsahuje tři defaultní tabulky a každá z tabulek obsahuje nějaké předdefinované řetězce pravidel (chains). Všechny řetězce jsou implicitně prázdné. Administrátor má možnost vytvářet další "uživatelské" řetězce, ale většinou si vystačíme s těmi předdefinovanými. Předdefinované řetězce mají definovaný implicitní cíl (policy target), který určuje co se stane s paketem který nebude vyhovovat žádnému pravidlu v řetězci. U uživatelských řetězců policy target definovat nelze.
Pravidla v řetězcích se skládají jednak z kritérii podle kterých se rozhodne zda se má pravidlo na daný paket aplikovat a jednak z cíle, který určí co se má z paketem udělat, pokud vyhovuje kritériím. Cílem mohou být uživatelem definované řetězce, nebo jedna z následujících hodnot (výčet není kompletní):
Pokud jako cíl použijeme uživatelem definovaný řetězec, ale paket nebude vyhovovat žádnému pravidlu v tomto řetězci, bude vyhodnocování pokračovat následujícím pravidlem v původním řetězcí.
Program sloužící pro konfiguraci netfilteru.
iptables [-t table] { -A | --append | -D
| --delete } chain rule-specification [options]
přidá nebo smaže pravidlo z řetězce
iptables [-t table] { -R | --replace | -I
| --insert } chain rulenum rule-specification [options]
změní pravidlo na pozici rulenum, nebo vloží nové pravidlo na tuto pozici
iptables [-t table] { -P | --policy } chain target
nastaví řetězci implicitní cíl
iptables [-t table] { -L | --list } [chain] [options]
zobrazí aktuální nastavená pravidla v řetězci
Kritéria pravidel:
-p | --protocol protocol
Protokol paketu - tcp, udp, icmp, nebo jeden z /etc/protocols.
-s | --source address[/mask]
Zdrojová adresa paketu.
-d | --destination address[/mask]
Cílová adresa paketu.
-j | --jump target
Cíl který se má použít, pokud budou kritéria vyhovovat.
-i | --in-interface interface
Rozhraní přes které jsme paket obdrželi.
-o | --out-interface interface
Rozhraní kterým se paket chystáme poslat.
-m | --match extension
Rozšíření které se má načíst. Rozšíření umožňují definovat další vlastnosti paketu.
# načtení potřebných modulů, pokud je nemáme zakompilované
# v jádře (tyto umožní iptables chovat se jako stavový filtr)
modprobe ip_conntrack
modprobe ip_conntrack_ftp
# implicitní cíl - odmítnutí paketu
iptables -P INPUT REJECT
# příjímat pakety z již otevřených spojení
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# přijímat vše z loopback rozhraní
iptables -A INPUT -i lo -j ACCEPT
# povolit ftp a ssh
iptables -A INPUT -m multiports -dports ftp,ssh -j
ACCEPT
# NAT
modprobe iptable_nat
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE