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.
Firewally sa dajú rozdeliť podľa viacerých kritérii:
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ť).
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
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.
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)
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).
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 |
|
OUTPUT | lokálne generované pakety |
PREROUTING | prichádzajúce pakety |
POSTROUTING | odchá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ší.
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