Firewall v Linuxe

Dan Keder <keder@fi.muni.cz>

Obsah

Úvod

Firewall je hardware alebo software, ktorého úlohou je kontrolovať tok dát v sieti medzi zónami s rozdielnou dôveryhodnosťou (napr. vnútorná sieť podniku vs. Internet). Musí zamedziť takej komunikácii, ktorá je v rozpore s bezpečnostnou politikou.

Typy firewallov

Firewally sa dajú rozdeliť podľa viacerých kritérii:

NAT

Network adress translation je prepisovanie zdrojovej alebo cieľovej adresy (príp. aj portov) v IP paketoch pri ich prechode cez router alebo firewall. Väčšinou sa používa, aby sa stroje v privátnej sieti (192.168.x.x, 10.x.x.x a pod.) mohli pripojiť k Internetu pomocou jedinej verejnej IP adresy. Čiastočne sa takto rieši nedostatok verejných IP adries. Nevýhodou je, že takéto riešenie poskytuje len jednosmernú konektivitu, a to zvnútra privátnej siete von (čo ale zas v určitých prostrediach poskytuje vyššiu bezpečnosť).

Firewally v Linuxe

V kerneli rady 2.0 2.0 sa používal ipfwadm. Ipfwadm obsahovalo štyri moduly (input, output, forward a accounting), v ktorých boli jednotlivé pravidlá, podľa ktorých sa riadil tok dát. Keďže ipfwadm neumožňovalo pracovať s jednotlivými fragmentami paketov a inými protokolmi ako TCP, UDP a ICMP, v jadre rady 2.2 bol prepísaný a nahradený ipchains. Okrem toho má ipchains jednoduchšiu konfiguráciu a umožňuje reťaziť pravidlá.

Problém s ipchains je v tom, že je to stále bezstavový firewall. Toto rieši netfilter/iptables, ktorý je v jadre prítomný od verzie 2.4. netfilter má tiež prepracovanejší NAT subsystém a vylepšil mechanizmus reťazení pravidiel tým, že reťazce pravidiel sú uložené v tabuľkách.

V BSD systémoch je situácia jednoduchšia. V OpenBSD sa používa PF (Packet Filter), v minulosti sa používal IPFilter Darrena Reeda, ktorý bol ale nahradený kvôli licenčným problémom. Vo FreeBSD systémoch sa dnes používa ipfw (ipfirewall).

Netfilter/iptables

Netfilter je názov projektu a zároveň názov celej sady kernel modulov a user-space programov umožňujúcich manipuláciu s paketmi. Iptables je názov user-space programu, ktorým sa celý firewall konfiguruje. Ako iptables sa tiež často označuje celý balík netfilter/iptables.

Konfigurácia jadra

Aby sme mohli používať iptables, musí byť v jadre zakompilovaná podpora pre netfilter, a to buď priamo v jadre alebo ako moduly. Hlavný modul má názov ip_tables a na ňom závisia ostatné moduly (napr. ip_conntrack, ipt_state, iptable_filter...).

Networking -->
    Networking options -->
       [*] Network packet filtering (replaces ipchains) -->
           IP: Netfilter Configuration -->
                <M> Connection tracking (required for masq/NAT) 
                    (+ moduly, ktoré potrebujeme)
                <M> IP tables support (required for filtering/masq/NAT)  
                    (+ moduly, ktoré potrebujeme)

Ako funguje iptables

Riadenie toku paketov prebieha v sieťovej vrstve na úrovni jadra. V jadre sú uložené tabuľky (tables) filter, nat, mangle a raw. Každá tabuľka obsahuje reťazce pravidiel (chains), ktoré sú buď preddefinované, alebo užívatelom definované. Preddefinované reťazce má každá tabuľka svoje (napr. INPUT, OUTPUT, FORWARD v tabuľke filter, PREROUTING, OUTPUT, POSTROUTING v tabuľke nat). Okrem nich si užívateľ môže definovať svoje vlastné reťazce pravidiel, ktoré môže volať z preddefinovaných podobne ako subrutinu v programe. Každý reťazec obsahuje zoznam pravidiel (rules), ktoré určujú, čo sa bude s paketmi robiť.

Každý paket, ktorý chce byť odoslaný alebo prijatý z/na sieťové rozhranie počítača, musí prejsť cez proces overovania v príslušnej tabuľke a reťazci pravidiel. Pravidlá sa vyberajú sekvenčne v poradí, v akom sa nachádzajú v tabuľke. Ak paket vyhovie nejakému pravidlu, ďalej sa nepokračuje a vykoná sa definovaná operácia (target), napr. prijatie/zahodenie paketu. Ak paket nevyhovie žiadnemu pravidlu v reťazci, vykoná sa implicitná operácia, ktorú má každý reťazec definovanú (policy).

Konfigurácia

Netfilter/iptables nemajú žiadny konfiguračný súbor v tradičnom zmysle. Na konfiguráciu slúži program iptables, pomocou ktorého sa manipuluje s pravidlami jednotlivých tabuliek. Pri používaní programu iptables sa ako parameter uvádza tabuľka a reťazec pravidiel, s ktorými chceme pracovať, typ operácie a špecifikácia pravidla.

Niektoré parametre programu iptables
-t tabuľka, s ktorou budeme pracovať
-A pridanie pravidla na koniec reťazca
-D zmazanie pravidla z reťazca
-F vymazanie všetkých pravidiel v tabuľke alebo reťazci
-P nastaví politiku reťazca (čo sa má urobiť, ak paket nevyhovie žiadnemu pravidlu)
-L vypíše obsah tabuľky
-N vytvorí nový užívateľom definovaný reťazec pravidiel
-s zdrojová IP adresa paketu
-d cieľová IP adresa paketu
-i zdrojové sieťové rozhranie (eth0,...)
-o cieľové sieťové rozhranie
-p protokol (z /etc/procotols)
-m použije sa rozširujúci modul, ktorý môže mať vlastné parametre
-j čo sa má s paketom urobiť, ak vyhovie tomuto pravidlu (napr. ACCEPT, DROP, užívateľom definovaný reťazec pravidiel)
...

Príklady tabuliek a reťazcov pravidiel:

Tabuľka filter  
INPUT pravidlá v tomto reťazci pravidiel sa vyhodnocujú na paketoch prichádzajúcich pre tento počítač.
OUTPUT pravidlá v tomto reťazci sa vyhodnocujú na paketoch odchádzajúcich z tohto počítača.
FORWARD pravidlá v tomto reťazci sa vyhodnocujú na paketoch, ktoré prechádzajú cez tento počítač.
Tabuľka nat  
OUTPUTlokálne generované pakety
PREROUTINGprichádzajúce pakety
POSTROUTINGodchádzajúce pakety

Každé pravidlo musí špecifikovať, čo sa má s paketom urobiť, ak vyhovie jeho podmienkam.

Príklady operácii  
ACCEPT paket sa pustí ďalej
DROP paket sa zahodí
REJECT paket sa zahodí a odosielatelovi sa o tom pošle správa (vo forme ICMP paketu)
DNAT platný len v tabuľke nat, modifikuje cieľovú adresu a port, na ktorý sa paket ďalej odošle, podľa parametru --to-destination
SNAT platný len v tabuľke nat, modifikuje zdrojovú adresu paketu podľa parametru --to-source
MASQUERADE platný len v tabuľke nat. Podobne ako SNAT mení zdrojovú adresu a port paketu, ale IP adresu nastaví na adresu firewallu a port podľa parametru --to-ports. Používa sa pri dynamicky prideľovaných IP adresách (dialup).
REDIRECT platný len v tabuľke nat. Mení cieľovú IP adresu na adresu firewallu a port podľa parametru --to-ports.
RETURN v užívatekskom reťazci, zastaví sa prehľadávanie aktuálneho reťazca a pokračuje sa ďalším pravidlom vo volajúcom reťazci.

Detailná dokumentácia je v iptables(8).

Príklady konfigurácie:

# Zahodí všetky pakety z 10.0.0.1 do 10.0.40.2
$ iptables -t filter -A FORWARD -s 10.0.0.1 -d 10.0.40.2 -j DROP

# Zobrazí tabuľku filter
$ iptables -t filter -L

# Vloží na začiatok reťazca pravidlo o prepúšťaní ICMP paketov
$ iptables -t filter -I FORWARD 1 -p icmp -j ACCEPT

# Vymaže druhé pravidlo z tabuľky filter z reťazca FORWARD 
$ iptables -t filter -D FORWARD 2

# Povolí http protokol
$ iptables -t filter -I FORWARD 2 -s 10.0.0.1 -d 10.0.40.2 -p tcp -m \
state --state NEW,ESTABLISHED -m tcp --dport http -j ACCEPT

# Presmeruje všetky spojenia na port 8080 na 10.0.40.2:80
$ iptables -t nat -A PREROUTING -p tcp  -m tcp --dport 8080  -j DNAT \
--to-destination 10.0.40.2:80

Aby sme tieto príkazy nemuseli písať stále dokola, existujú programy iptables-save a iptables-restore. iptables-save vypíše obsah všetkých tabuliek vo formáte prepínačov programu iptables. Výstup tohoto programu sa dá použiť ako vstup programu iptables-restore, ktorý podľa tohoto súboru nastaví iptables.

Nevýhoda tohoto prístupu je, že ak máme napr. 200 podobných pravidiel, ktoré sa líšia len v nejakom jednom čísle, tak vo výstupe programu iptables-save bude 200 podobných riadkov. Preto je niekedy lepšie napísať si vlastný skript (napr. v bashi), ktorý bude volať program iptables. Takýto skript môže obsahovať rôzne cykly a podmienky, takže tento spôsob konfigurácie je oveľa flexibilnejší.

Odkazy

Domovská stránka netfilter/iptables: http://www.netfilter.org
Pekný článok o firewalloch: http://en.wikipedia.org/wiki/Firewall_(networking)
Ďalší pekný článok o netfilter/iptables: http://en.wikipedia.org/wiki/Netfilter/iptables
Network adress translation: http://en.wikipedia.org/wiki/Network_address_translation