GUFICon #5

IPFW, il packet filter di FreeBSD

© Matteo Riondato

under the terms of the BSD License

IPFW

Packet filter ai livelli 2-3 della pila ISO/OSI

Traffic Shaper (frontend di dummynet)

Possibilità di PAT e di NAT (tramite socket divert)

Schema di funzionamento

Pacchetti filtrati da 0 a 4 volte

In entrata a livello ethernet (ether_demux)

In entrata a livello IP (ip_input)

In uscita a livello IP (ip_output)

In uscita a livello ethernet (ether_output_frame)

Ogni pacchetto viene sottoposto a ciascuna regola finché non ne soddisfa una.

Attenzione alle performance quando si opera su più livelli

Regola di default (allow o deny)

Attivare IPFW

Modulo del kernel: /boot/kernel/ipfw.ko

#kldload ipfw && \

ipfw add 32000 allow all from any to any

Inclusione statica nel kernel:

option	IPFIREWALL # attiva IPFW

option IPFIREWALL_VERBOSE # abilita il log

Attivare IPFW (2)

Attivare ipfw al boot:

in /etc/rc.conf

firewall_enable='yes'

firewall_type='open'

Altri ruleset predefiniti in /etc/rc.firewall

Le regole

Formato delle regole:

ipfw comando numero_regola set numero_set azione log numero_log corpo_della_regola

Formato del corpo della regola:

protocol from ip porta to ip porta direzione via interfaccia opzioni

Le Regole: opzioni generali

numero_regola: ad ogni regola viene assegnato un numero, da 0 a 65535. E' possibile specificare il numero della regola da riga di comando.

set numero_set: le regole possono essere suddivise in 32 set. Il set a cui vanno aggiunte le regole può essere specificato da riga di comando

log limite_log: ipfw, tramite syslogd, può effettuare il log dei pacchetti. Il log dopo che sono state controllate tutte le opzioni della regola e prima che sul pacchetto sia compiuta l'azione definita dalla regola

Le Regole: i comandi

add: aggiunge una regola ad un set

delete: rimuove una regola da un set

set [enable – disable]: abilita – disabilita un set

table: configura una table

pipe: configura una pipe di dummynet

queue: configura una queue di dummynet

Le Regole: le azioni

allow: consenti il passaggio al traffico

deny: blocca il traffico

check-state: controlla le regole dinamiche

fwd: cambia l'indirizzo di destinazione del pacchetto. Se è un indirizzo locale, cambia la porta di destinazione

reset: invia un TCP reset (RST) (warning!!)

skipto N: salta le regole successiva fino al numero N specificato

unreach code: invia un ICMP unreach code

Le Regole: il corpo

protocollo: all | tcp | udp | ip | icmp o uno tra quelli in /etc/protocols

IP di provenienza e di destinazione: possono essere specificati come hostname, come IP, come blocco indirizzi nella forma subnet/lunghezza_netmask o come una lista di indirizzi. Casi particolari sono:

any: qualsiasi indirizzo

me: ogni indirizzo di ogni interfaccia del sistema

Le Regole: il corpo (2)

porta di provenienza e di destinazione: può essere specificata come numero, range di porte o con il nome identificativo del servizio (/etc/services)

direzione: verso del flusso di pacchetti

in : pacchetti in entrata

out: pacchetti in uscita

via NIC: interfaccia tramite la quale transitano i pacchetti

opzioni avanzate per il controllo del pacchetto

Le Regole: le opzioni del pacchetto

gid | uid | jail: filtro in base al gruppo | utente | jal ID (utile per regole dummynet)

established | setup | keep-state: filtraggio stateful

frag: frammenti

ipoptions | tcpoptions: analisi delle opzioni IP | TCP

layer2: pacchetti a layer2 (ether_demux, ether_output_frame)

Le regole: le opzioni del pacchetto (2)

mac dst-mac src-mac: filtro in base al MAC di provenienza o destinazione (possibile utilizzare “any”)

verrevpath: controlla che il pacchetto sia arrivato effettivamente dall'interfaccia su cui passa la route per il suo indirizzo di provenienza

versrcreach: controlla che esista una route per il pacchetto in questione. La route di default è esclusa

Le Regole: le opzioni del pacchetto(3)

antispoof: si controlla se l'indirizzo di provenienza del pacchetto appartiene ad una rete direttamente connessa e se il pacchetto è arrivato dall'interfaccia alla quale la rete è connessa

tcpack: controlla se il pacchetto ha la sola flag ACK attiva

tcpflags flags: controlla se nell'header del pacchetto TCP sono presenti le flags specificate

icmptypes types: filtro in base ai tipi ICMP

Le Regole: esempi

Consenti il passaggio ai pacchetti da Internet verso SSH:

ipfw add allow tcp from any to me 22 in via tun0

Blocca i pacchetti diretti alla 80 TCP provenienti dalla lan

ipfw add deny tcp from 192.168.0.0/16 to me 80

Consenti il traffico ICMP di un certo tipo

ipfw add allow icmp from any to any icmptypes 0,3,8,11

Visualizzare le regole

# ipfw [-t] list

ruleset ordinato secondo il numero di regola

-t mostra l'ora in cui è stato trovato un pacchetto che soddisfasse la regola

# ipfw show

ruleset ordinato secondo il numero di regola

mostra quanti pacchetti hanno soddisfatto ciascuna regola

I set di regole

Gruppi numerati (0-31) di regole

ipfw add set 4 allow ip from any to me 80

Possono essere abilitati e disabilitati in blocco

ipfw set 4 enable

ipfw set 4 disable

Possono essere spostati e swappati

ipfw set swap 4 5

ipfw set move 4 5

Possono scambiarsi regole tra loro

ipfw set move 1300 4 to 5

Un firewall modulare con set e skipto

Evitare che ogni pacchetto venga passato attraverso tutto il ruleset (salto delle regole tramite skipto)

ipfw add 10 skipto 1000 all from any to any layer2 in

ipfw add 20 skipto 2000 all from any to any not	layer2 in

ipfw add 30 skipto 3000 all from any to any not layer2 out

ipfw add 40 skipto 4000 all from any to any layer2 out

Possibilità di aggiungere e rimuovere blocchi di regole specifiche: dummynet, sottoreti, in e out, servizi

Gestione elastica

Schema della rete d'esempio

Firewall Stateful

ipfw allow tcp from any to me established

ipfw allow tcp from any to me 22 setup

ipfw check-state

ipfw allow tcp from any to me 22 setup keep-state

Il secondo metodo è meno vulnerabile!!

Per le connessioni TCP può essere inviato un keep-alive

Dummynet

Traffic shaper per abitudine, non per nascita

2 componenti fondamentali:

Pipe: “tubi” di dimensione (bandwidth) fissa

Queue: “tubi” di dimensione variabile che si dividono la banda di una pipe. Hanno un peso (weight) che ne determina la priorità (peso maggiore, priorità maggiore)

Dummynet: le pipe

Configurare una pipe:

ipfw pipe 1 config bw 640Kbit/s

ipfw pipe 1 config bw tun0

Assegnare del traffico ad una pipe

ipfw add pipe 1 tcp from me 80 to any via tun0

ipfw add pipe 2 from any to

Dummynet: le queue

Creare queue relative ad una pipe

ipfw pipe 1 config bw 640Kbit/s

ipfw queue 10 config pipe 1 weight 3

ipfw queue 20 config pipe 1 weight 1

Assegnare traffico alle queue

ipfw add queue 10 ip from me ftp,ftp-data to any

ipfw add queue 20 ip from me 80 to any

Risorse

ipfw(8)

firewall(7)

dummynet(4)

2003-04-04T17:44:27