Tabuliek môže (a zvyčajne aj je) viacero, každá sa aplikuje na pakety, ktoré chodia z určitého smeru. Napríklad na zariadenie zo siete, von zo zariadenia, z lokálnej aplikácie atď.
Riadky tabuľky obsahujú jednotlivé pravidlá, kde môžme definovať čo sa má diať s paketmi ktoré vyzerajú tak a tak. Napríklad zakázať všetky pakety z určitej IP adresy, ktoré sa snažia nadviazať spojenie na porte 80.
Hlavná výhoda paketových filtrov spočíva v relatívne malej režií pre
filtrovanie a teda nespôsobuje takmer žiadne zdržanie sieťovej dopravy. Naopak
nevýhodou je to, že vôbec nepracujú s obsahom packetu a teda nie je možné
jemnejšie filtrovanie napríklad na základe uživateľov. Firewally všeobecne
väčšinou nie sú schopné zabrániť "tunelovaniu" protokolov.
Pre tích, ktorí sa nemôžu vzdať ipfwadm a ipchains existujú
skripty, ktoré používajú syntax týchto nástrojov a fungujú nad ipchains alebo
iptables (ipfwadm-wrapper a podobne). Paketový filter je na Linuxe zabudovaný do jadra, vďaka čomu je celý
proces rýchlejší, keďže sa nemusí ísť do uživateľského priestoru.
Pre zachovanie nastavenia firewallu je nutné dať príkazy pre nastavnie do
štartovacích skriptov, poslúžiť môžu aj utiliky ipchains-save
(iptables-save) a ipchains-restore (iptables-restore).
Použitie:
Pomocou nástrojov na firewalling vieme v Linuxe robiť aj NAT, Maškarádu alebo
port-forwading.
Pravidlá (rules) v príslušnom reťazci sa prechádzajú jedno po druhom a keď sa
nájde vyhovujúce uplatní sa na paket akcia v danom pravidle. Ak žiadne pravidlo
nevyhovuje použije sa implicitná politika pravidla. Obrázok:
Application-level gateway
Aplikačné brány (resp. Proxy servery) pracujú na vyššej úrovni ako paketové
filtre. Prevážne ovládajú iba jeden protokol, čo je ich hlavná nevýhoda.
Pracujú na aplikačnej vrstve OSI modelu. Ďalšou nevýhodou je, že
často vyžadujú spoluprácu na strane klienta narozdiel od paketových filtrov,
ktoré pracujú transparantne. Toto sa dá vyriešiť prostredníctvom transparetnej
proxy. Ich výhoda je, že môžu robiť filtrovanie jemnejšie na základe
uživateľov, prípadne príkazov pre daný protokol, ktorý poznajú.
Stateful inspection firewall
Stavový firewall sa používa v kombincií s paketovým filtrom. Paketový filter
sám o sebe robí rozhodovanie o osude každého paketu zvlášť. V kombinácií so
stavovým firewallom je schopný zapamätať si informáciu o vzniknutom spojení a
udržiavať si jeho stav a ďalej rozoznávať pakety, ktoré do neho patria a podla
toho s nimi nakladať.
Linux Firewally
Existujú 3 verzie paketových filtrov pre Linux. Ich vývoj súvisí s verziami
jadra. Úplne prvá verzia ipfw bola portom z BSD.
# ipchains-save > /etc/ipchains.rules
IP Chains
IP Chains používajú user-space nástroj ipchains. V jadre sa nachádzajú
tri reťazce (chains) pravidiel:
+---->( Local Process )->---+
^ |
+-------------+ | +---------------+ v +--------------+
----->| INPUT Chain |-+--+---->| FORWARD Chain |-----+-+->| OUTPUT Chain |--->
+-------------+ | +------+--------+ | +--------------+
| | | ^ |
Deny/Reject | Deny/Reject | Deny/Reject
| |
+------->( Demasquerading )->----+
Syntax príkazu ipchains sa prechodom na iptables čiastočne, ale nie radikálne
zmenila. Podrobnosti v manuálovej stránke ku ipchains a iptables.
Príklad skriptu s nastavením firewallu pomocou ipchains je tu. Oproti ipfwadm vie pracovať s IP fragmentami
alebo aj NAT 1:N (maškaráda). Je bezstavový.
Deny/Reject Deny/Reject | | +---+---+ +----+---+ | INPUT |->---( Local Process )--->-| OUTPUT | +---+---+ +----+---+ | | ^ (routing) | | +------------+ | +---------+ +------+------+ -->| PREROUTING |-(routing)-->| FORWARD |->------>| POSTROUTING |-->- +-----+------+ +----+----+ +------+------+ | | | Deny/Reject Deny/Reject Deny/Reject
Základná syntax príkazu iptables je:
# iptables [table] <command> <match> <target/jump>kde, jednotlivé položky znamenajú:
table | : tabuľka s ktorou manipulujeme |
---|---|
command | : čo chceme s tabuľkou/pravidlom robiť |
match | : popis paketu, pre ktorý pravidlo vyhovuje |
target/jump | : čo sa má urobiť s paketom |
nat | Používa sa pre NAT (Network Address
transalation). Nemala by sa používať na filtrovanie. Obsahuje reťazce PREROUTING pre pakety príchodzie na zariadenie, OUTPUT pre pakety z lokálnych aplikácií a POSTROUTING pre pakety odchádzajúce na zariadenie. |
---|---|
mangle | Používa sa na zmeny v hlavičkách paketov (TTL,
TOS a podobe), ale nie na NAT alebo maškarádovanie, na to slúži
tabuľka nat Obsahuje reťazce PREROUTING pre pakety, ktoré práve prišli zo zariadenia a ešte sa neviem kam ďalej pôjdu (routing decision) a OUTPUT pre pakety, ktoré sa generovali lokálne a opäť ešte smerovaním. |
filter | Používa sa na filtrovanie paketov všeobecne,
teda na akcie typu DROP, LOG, ACCEPT,
REJECT a iné. Obsahuje reťazce FORWARD pre pakety, ktoré neboli generované lokálne a nie sú určené pre localhost. INPUT pre pakety určené pre lokálnu aplikáciu a OUTPUT pre lokálne vygenerované pakety. |
-A | pridá nové pravidlo na koniec reťazca |
---|---|
-D | zmaže definované pravidlo |
-R | zmení definované pravidlo |
-L | vypíše všetky pravidlá daného reťazca |
-P | definuje implicitnú politiku reťazca |
-F | zmaže všetky pravidlá v danom reťazci |
-p | Protokol |
---|---|
-s | Zdrojová IP adresa |
-i | Vstupný interface |
--sport | Zdrojový port |
--tcp-flags | Typ paketu |
--icmp-type | Typ ICMP paketu |
DROP | Paket sa zahodí |
---|---|
ACCEPT | Paket sa akceptuje |
SNAT | Preklad zdrojovej adresy |
MASQUERADE | Maškaráda |
REDIRECT | Presmerovanie |
Príklady použitia iptables:
# iptables -A INPUT --dport 80 -j DROP # iptables -D INPUT 1 # iptables -R INPUT 1 -s 192.168.0.1 -j DROP # iptables -I 1 --dport 80 -j ACCEPT # iptables -L OUTPUT # iptables -P INPUT REJECT # iptables -p tcp --tcp-flags SYN,ACK,FIN ...
Ukážka ako paket "cestuje" tabuľkami a reťazcami pravidiel:
Nakoniec doplním, že je možné si vytvárať vlastné reťazce pravidiel, pakety medzi reťazcami presmerovávať alebo robiť účtovanie.
IP Filter
User-space nástroj sa volá ipf. Pri štarte počítača sa pravidlá čítajú zo
súboru /etc/ipf.rules.
Príklad obsahu súboru /etc/ipf.rules:
pass out from any to any
pass in from any to any
block in on fxp0 from any to any port = 3306
Pravidlá sa prechádzajú jedno po druhom zhora dole, ale na rozdiel od reťazcov
pravidiel napr. v IP Chains paket prechádza cez všetky pravidlá a uplatní sa
posledné, ktoré vyhovuje!, teda v uvedenom príklade prejdú všetky okrem paketov
smerovaných na port 3306 (MySQL), ale v tomto príklade:
pass out from any to any
block in on fxp0 from any to any port = 3306
pass in from any to any
prejdú všetky pravidlá, pretože posledné vyhovujúce je posledné uvedené! Toto
chovanie sa dá zmaniť tým, že na riadku pre pravidlo, ktoré má ako posledné
paket spracovať uvedieme kľúčové slovo quick:
block in quick on fxp0 from any to any port = 3306
IP Filter vie v podstate všetko to čo Ip Chains.
Podrobný popis syntaxe príkazu ipf nájdete vo forme podobnej BNF v ipf(5) alebo
ipf.conf(5). Výborný (český) návod viď
OpenBSD FAQ - IP Filter.
add | Pridá položku do zoznamu pravidiel |
---|---|
delete | Zmaže položku zo zoznamu pravidiel |
reject | Zahodí paket a späť pošle ICMP `host or port unreachable' |
---|---|
allow | Paket pošle ďalej |
deny | Zahodí paket a nič neoznamuje |
count | Účtovanie - zapína počítanie paketov, ale pokračuje na ďalšom pravidle |
all |
---|
icmp |
tcp |
udp |
from address/mask [port] to address/mask [port] [via interface]Kde address/mask môže mať jeden z tvarov:
frag | Súhlasí ak paket nie je prvý fragment z datagramu |
---|---|
in | Súhlasí ak paket je na ceste dnu |
out | Súhlasí ak paket je na ceste von |
setup | Súhlasí pre pakety pokúšajúce sa vytvoriť spojenie (SYN flag) |
Syntax pre výpisy pravidle:
# ipfw [-a] [-t] [-N] lpre význam prepínačov viď man stránku. Syntax pre zmazanie všetkých pravidiel:
# ipfw flushSyntax pre zmazanie stavu účtovania pre dané "počítadlo":
# ipfw zero [index]
Príklady použitia ipfw:
# ipfw add deny tcp from evil.crackers.org to nice.people.org 23 # ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org # ipfw add deny tcp from any to my.org/28 6000 setup # ipfw -a list # ipfw -a l # ipfw -at l
#!/bin/sh [ -f /etc/ipchains.rules ] || exit 0 case "$1" in start) echo -n "Turning on packet filtering:" /sbin/ipchains-restore < /etc/ipchains.rules || exit 1 echo 1 > /proc/sys/net/ipv4/ip_forward echo "." ;; stop) echo -n "Turning off packet filtering:" echo 0 > /proc/sys/net/ipv4/ip_forward /sbin/ipchains -F /sbin/ipchains -X /sbin/ipchains -P input ACCEPT /sbin/ipchains -P output ACCEPT /sbin/ipchains -P forward ACCEPT echo "." ;; *) echo "Usage: /etc/init.d/packetfilter {start|stop}" exit 1 ;; esac exit 0