Firewally

Filip Slunečko, filip.slunecko@mail.muni.cz

Obsah

Historie

První generace

První generace byla vyvinuta v roce 1988 v Digital Equipment Corporation jako bezstavový firewall. Tento typ filtrování bere jednotlivé pakety a zkoumá jejich obsah. Neřeší zda jsou pakety součástí nějakého datového toku. Rozhoduje pouze na základě obsahu paketu a protokolu (TCP, UDP).

Druhá generace

Druhá generace umožnila rozpoznávat protokoly jednotlivých aplikací a rozhodovat se podle kontextu.

Třetí generace

Třetí generace byla vyvinuta v Bellových laboratořích kolem roku 1989-1990. Umožňuje zařadit paket do kontextu ostatních paketů a rozhodovat v jaká fázi komunikace se paket nachází. Jsou to takzvané stavové firewally.

Typy Firewallů

Filtrování paketů

Prohlížejí pakety na 1 - 4 vrstvě OSI modelu a na základě pravidel definovaných uživatelem buď paket zahodí přijmou nebo ho změní.

Aplikační brány

Zaměřují se na jednotlivé protokoly (ftp, http ....) 7 vrstva OSI modelu.

Proxy server

Stroj, který dělá prostředníka v komunikaci.
Nejčastější použití:

NAT (Network address translation)

Slouží k ochraně sítě za firewallem a umožňuje využít jednu IP adresu pro více počítačů. Skrytí fyzické adresy slouží jako ochrana před útočníkem.

Netfilter

Netfilter je framework, který umožňuje manipulovat se síťovými pakety. Projekt Netfilter začal Rusty Russell (autor ipchains: předchůdce netfiltru) v roce 1998. V roce 2000 ho začlenil do Linuxového jádra 2.3. Úplně prvním frameworkem pro manipulaci s pakety byl projekt ipfwadm v jádře 2.0. Tento projekt vycházel z ipfw na BSD. Tyto starší projekty mohly manipulova s pakety, ale nemohly je kontrolovat jejich tok.

Iptables

Iptables je aplikace, která běží v uživatelském prostoru a umožňuje nastavovat moduly netfiltru. Pro používání iptables je potřeba mí práva root.

Historie

Iptables zachovávají stejné postupy jako jejich předchůdci (ipfw, ipfwadm) a pravidla řadí do seznamů. Každé pravidlo v se seznamu říká co udělat s paketem, který splňuje požadavky, které jsou v pravidlu specifikované. Dále rozšiřuje myšlenku ipchains, které zavedlo řetězce pro manipulace s pakety a implementuje tabulky (např. tabulku NAT, FILTER atd.). Díky tomuto rozdělení mohou iptables znát stav spojení jednotlivých paketů. Budoucnost vývoje projektu je buď v projektu nftables nebo Xtables2 a nebo úplně někde jinde :).

Jak to celé funguje

Paket prochází postupně sadou pravidel a tabulek. Každá tabulka je spojená s jinou částí zpracování paketu. Paket prochází pravidla postupně v pořadí ve, kterém byla zadána.

V iptables je pět předdefinovaných zřetětzení (chains).

PREROUTING
Toto zřetětzení hodnotí paket ještě před tím než se rozhoduje o směrování.

INPUT
Pokud je paket určen pro lokální doručení pak skončí zde.

FORWARD
Všechny pakety, které byly směrovány a nejsou určeny pro lokální doručení patří sem.

OUTPUT
Pakety odeslané z počítače prochází tudy.

POSTROUTING
Toto je poslední zřetětzení, kterým pakety prochází při odchodu z počítače.

Na tyto zřetětzení se vztahuje základní pravidlo. Administrátor může dodefinovat zřetětzení kolik chce, ale základní pravidlo na ně neplatí.

Tabulky

Všechny pakety musí projít přes tři tabulky.

MANGLE

První je tabulka MANGLE. Tato tabulka slouží k označování paketů za účelem QOS.

FILTER

Druhá tabulka je FILTER.

Tabulka filter:

NAT

Třetí tabulka je tabulka NAT.

Tabulka nat:

Nejčastější akce:

ACCEPT - paket je přijat.
DROP - paket je zahozen bez odpovědi.
LOG - informace o paketu je zaslána syslogu.
REJECT - paket je odmítnut a je vygenerována zamítací odpověď.
DNAT - destination network address translation. Přepisuje cílovou adresu.
SNAT - source network address translation. Přepisuje odesílací adresu určenou adresou.
MASQUERADE - SNAT, ale source adresa definována jako FW interface.

Obecné kritéria pro výběr paketů
-ttablefilter, nat, mangle
-jtargetskočí na cílové pravidlo
-Apřidá pravidlo do zřetězení.
-Fsmaže pravidla z vybrané tabulky.
-pprotocoltyp protokol (icmp, tcp, udp ....)
-sip-addresszdrojová adresa.
-dip-addresscílová adresa
-iinterface-namejméno vstupního rozhraní
-ointerface-namejméno výstupního rozhraní

Pravidla - příklady

iptables -A INPUT -i eth0 -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT

-A INPUT - přidat pravidlo do řetězce INPUT
-i eth0 - paket přijde rozhraním eth0
-s 10.0.0.1 - paket má zdrojovou IP adresu 10.0.0.1
-p tcp - protokol tcp
--dport 22 - port 22
-j ACCEPT - akceptuj tento paket

Vypsání pravidel

iptables -L -n -v
-L vypíše tabulku
-n nebude vyhledávat jména pro IP adresy
-v vypíše víc informací

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
    0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           udp dpt:67 
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
58276   70M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    6   539 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
 1424  174K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24    state RELATED,ESTABLISHED 
    0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
    0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable 
    0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable 
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT 39588 packets, 5709K bytes)
 pkts bytes target     prot opt in     out     source               destination 

Příkazy pro manipulaci s pravidly

iptables -A ... přidá  pravidlo
iptables -D ... vymaže pravidlo
iptables -I ... vloží - 1 - výchozí - na začátek
iptables -F ... vymaže pravidla
Smazání pravidel:
$IPTABLES -F
$IPTABLES -F -t nat
Nastavení výchozích politik:
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
Vytváření nových řetězců
iptables -N tcp_segmenty
iptables -A INPUT -p TCP -i eth0 -j tcp_segmenty
iptables -A tcp_segmenty -p TCP --dport 80 -j ACCEPT
iptables -A tcp_segmenty -p TCP --dport 25 -j ACCEPT

Moduly a nastavení jádra

Iptables požadují, aby pro některé funkce byli do jádra nahrány potřebné moduly.

Moduly

# Modul pro stavový FW
modprobe ip_conntrack

# Modul, aby bylo možné použí aktivní ftp
modprobe ip_conntrack_ftp
  
# Modul umožňující použití nat
modprobe iptable_nat
 
# Module pro aktivní FTP za NATem
modprobe ip_nat_ftp

Nastavení jádra

# Ochrana proti Spoofingu
net/ipv4/conf/all/rp_filter = 1
 
#Loguje pakety se poškozenými IP
net/ipv4/conf/all/log_martians = 1
 
# Ochrana proti DOS 
net/ipv4/tcp_syncookies = 1
 
 
# Zakáže odpovídat na broadcast icmp
net/ipv4/icmp_echo_ignore_broadcasts = 1
 
# Povolí routing
net/ipv4/ip_forward = 1

Literatura