Paketové filtry (ve FreeBSD)

Jakub Široký, xsiroky@fi.muni.cz


Obsah


Typy firewallů

V současné době existují na Internetu dva rozdílné typy běžně používaných firewallů. První se nazývá packet filtering router, který běží jako součást jádra operačního systému na stroji s více síťovými rozhraními, a který na základě nastavených pravidel povoluje nebo zakazuje průchod paketů mezi těmito rozhraními. Tako pravidla bývají označována jako chain-lists, řetězce, kterými filtrující program prochází a pokud najde shodu s filtrovaným paketem, aplikuje pravidlo a skončí.
Druhým používaným typem je proxy-server, který pomocí dalších služeb ověřuje uživatele a jejich pakety případně dále směřuje do sítě. Tyto dva typy mohou být kombinovány dohromady, kde například filtrovací router povoluje pouze pakety z proxy-serveru, který předtím ověřil oprávněnost přístupu uživatelů. Takový proxy-server se pak nazývá bastion host.

Verze používaných paketových filtrů

Operační systém Linux od verze jádra 2.4 poskytuje ve svém jádře subsystém iptables/netfilter, který zprostředkovává filtrování paketů, různé typy překladu adres (NAT) a manipulaci s pakety. Systémy založené na BSD používají většinou program ipfilter (ipf), který může být součástí jádra nebo zaváděn jako modul. Systém FreeBSD paralelně k ipf dále nabízí ještě ipfw (ipfirewall), který stejně jako ipfilter může být součástí jádra, a dále přidává možnost tzv. "tvarování" provozu (traffic shaper), což je systém vyvažování zátěže. Z komerčních produktů je k dispozici např. Tripwire, který ochranu rozšiřuje na úroveň souborového systému a umí hlídat změny souborů. Pro iptables/netfilter, ipfilter (a jeho verzi pro OpenBSD) je určen graficky orientovaný konfigurační nástroj Firewall Builder, který uživateli v GTK grafice dovoluje jednoduše nastavovat pravidla pro uvedené programy.

IPFirewall ve FreeBSD

IPFW dodávaný s FreeBSD je systém paketového filtrování a účtování, který je volitelně součástí jádra. Ovládá se pomocí uživatelského příkazu ipfw. IPFW se skládá ze dvou částí, kde vedle filtrovacího mechanismu obsahuje i monitorovací systém, který umožňuje získávat přehled o provozních podmínkách routeru. Dále ve spojení s částí jádra dummynet zprostředkuje vyvažování zátěže a je možné jej podobným způsobem použít i pro stanice nesloužící jako routery. Mezi jeho významné vlastnosti lze zařadit podporu pro jiné úrovně síťové komunikace než TCP/IP, schopnost přesměrovávat požadavky na jiné porty (divert), podpora “stateful” módu, kde filtrovací pravidla vznikají dynamicky za běhu systému. Je možné (byť nedoporučované) nastavit jej natvrdo na otevřený a pak jej omezovat.


Instalace IPFW

IPFW lze celkem jednoduše použít hned po instalaci systému, protože je již zkompilován jako modul:

kldload ipfw

Nastavený je implicitně na zakázat vše. Konfigurace se standardně načítá ze souboru /etc/rc.firewall. Tento soubor obsahuje seznamy pravidel pro firewall ve spustitelném tvaru (spouští klientský program ipfw – viz. dále).

Takto lze načíst otevřenou konfiguraci:

sh /etc/rc.firewall open

Další parametry firewall uzavírají nebo nastavují různé skupiny pravidel. Tyto parametry je možné specifikovat ve startovacím souboru /etc/rc.conf pomocí příkazu:

firewall_type=”typ”

kde pak startovací /etc/rc vyvolá právě /etc/rc.firewall s příslušným parametrem. Startovací /etc/rc.conf musí dále obsahovat:

firewall_enable=”yes”

Pro běh firewallu jako součást kernelu, je potřeba zadat do konfiguračního souboru pro kompilaci kernelu následující řádky:

options IPFIREWALL Přidává podporu pro firewall
options IPFIREWALL_VERBOSE
Přidává kód pro logování pomocí syslog
options IPFIREWALL_VERBOSE_LIMIT=10
Nastaví maximum položek záznamů o pro jedno pravidlo
options IPDIVERT
umožní přesměrovávat pakety na jiné porty pro NAT
options DUMMYNET
balancování zátěže

Takto zkompilovaný kernel po spuštění systému automaticky spustí firewall, a nastaví jej podle /etc/rc.conf a /etc/rc.firewall.


Konfigurace IPFW:

Pro konfiguraci firewallu se používá vedle konfiguračního souboru i klientský program ipfw. Jeho fungování lze shrnout do má čtyř oblastí: přidávání (add) /mazání (delete) pravidel, vypisování pravidel (show) a jejich skupin /chains – řetězců/ a čítačů paketů (list), smazání všech pravidel (flush) a resetování čítačů (clear). Následující příklady jsou poměrně srozumitelné:

ipfw add deny tcp from evil.crackers.org to nice.people.org 23 via ed0

zakazuje komunikaci protokolem TCP od evil.crackers.org do portu 23 stanice nice.people.org jdoucí přes rozhraní ed0

ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org

zakazuje a loguje komunikaci protokolem TCP ze sítě crackers.org a 24-bitovou maskou na jakýkoliv port stroje nice.people.org

Implicitně nastavený řetězec po instalaci, který zakazuje jakýkoliv přístup zvenčí:

allow 100 ip from any to any via lo0
deny 200 ip from any to 127.0.0.0/8
deny 65535 ip from any to any

Čísla označují pořadí v jakém se budou pakety porovnávat s pravidly řetězce, číslem 65535 je označené implicitní pravidlo, které nelze změnit, a které určuje implicitní chování firewallu.

Další příklady:

ipfw flush

smaže všechny řetězce a ponechá pouze implicitní pravidlo 'deny 65535 ip from any to any', tedy úplně uzavře síťovou komunikaci.

ipfw add fwd localhost,23 log tcp from evil.crackers.org to evil.crackers.org 23

přesměruje pakety jdoucí z evil.crackers.org na lokální počítač na port 23 na fbi.gov port 23.

Syntaxe příkazu ipfw:

ipfw [rule_number] [set set_number] [prob match_probability] action [log [logamount number]] body

rule_number .............. vzestupné číslo pravidla (implicitní a neměnné 65535). udává pořadí zpracování
set set_number ........... číslo množiny pravidel (1-30); lze takto seskupovat pravidla a manipulovat s nimy
prob match_probability ... float od 0 do 1; používá se s dummynet (například simulace cest paketů)
action ................... viz výše uvedené příklady a reference
log [logamount number] ... zda logovat uvedené pakety pomocí syslog a jejich počet
body ..................... viz výše uvedené příklady a reference

Reference

Část příručky FreeBSD věnující se firewallům

Man stránka příkazu ipfw