Firewall invisibile how-to (bridge firewall)




Note:

Esigenze:

Quante volte abbiamo avuto l'esigenza di proteggere 2 reti contigue (2 parti della stessa lan, il router con
la selvaggia internet dai server ..) e pensavamo che un firewall normale ci avrebbe fatto impazzire..
Assegnazione di un indirizzo ip al firewall, eventuale cambio di sottorete, fare tutto quando gli utenti non ci sono
(e si.. in quel momento potresti fare altro...)


Possibile scenario:

Siete annoiati alla vostra postazione e pensate... pensate ad una black box con solo 2 porte per inserire i cavi di rete,
attaccate al primo plug il cavo di rete proveniente dal router, che prima era collegato allo switch.
Ora prendete un nuovo cavo e collegate la seconda porta della BlackBox nella porta rimasta vuota sullo switch.
Non è cambiato nulla. nulla? I dati passano attraverso la BlackBox e tutto appare come prima.
Collegando una tastiera e un monitor alla black bbox potete intervenire sui dati che passano.
Decidiamo che tutti gli accessi da e verso la porta 80 vengono bloccati.
Torniamo alla nostra postazione di lavoro e facciamo un test... non vedo più un sito internet, nessuno vede più
un qualsiasi servizio sulla porta 80, i pacchetti non arrivano al router.


Come è possibile?

Tutto questo lo dobbiamo alla semplicità di configurare un bridge con OpenBsd 3.x e 2 schede di rete da pochi Euro.
Oltre questo PF entra in gioco e ci permette di affinare tutta la configurazione.
Mettendo le 2 schede di rete in modo promiscuo, tutti i dati che entrano da una scheda di rete passano per il
kernel e escono dall'altra scheda di rete. Se in mezzo ci mettiamo PF che analizza i pacchetti
e decide cosa far passare e cosa scartare il gioco è fatto. La cosa simpatica è che il nostro firewall non appare
da nessuna parte. Non si vede ne dal router ne dai pc.. Il firewall semplicemente non esiste.


Cosa ci serve?

Non è difficile.. Una macchina con installato OpenBsd e due o più schede di rete.
Non è necessaria nessuna configurazione di rete, per i test un paio di cavi "crossover" sarebbero fantastici.


Configurazione dei files:

Ci sono un paio di modifiche da effettuare a 2 files di sistema:

/etc/sysctl.conf

togliere il commento alla riga per abilitare il forwarding ip:

net.inet.ip.forwarding=1

e se si usa ipv6 decommentate il comando per abilitare il forwarding dei pacchetti ipv6

net.inet6.ip6.forwarding=1

in /etc/rc.conf abilitare le funzioni di PF

PF=YES

Riavviare per attivare le modifiche.


Testiamo il nostro bridge:

Eseguiamo la configurazione del bridge on-the-fly a scopo di test. Se non effettiamo le operazioni del paragrafo
110 al prossimo riavvio si perderà tutto.
Prima di tutto configuriamo le nostre interfacce di rete senza indirizzi ip. Solo interfacce attive.
Per farlo eseguiamo quindi i seguenti comandi:

#ifconfig dc0 delete
#ifconfig dc1 delete
#ifconfig dc0 up
#ifconfig dc1 up


Nel caso di messaggi di errore ignorate e proseguite.
Ora abilitiamo il bridge tra le interfacce.

#brconfig bridge0 add dc0 add dc1 up

Bene, abbiamo effetuato il nostro bridge.
Ora dobbiamo provare la configurazione, per farlo colleghiamo 2 pc con 2 cavi crossover ad ognuna delle porte
del bridge. (una all'interfaccia dc0 e una alla dc1). I pc devono avere indirizzi ip diversi, ma nella
stessa subnet mask. A questo punto da un pc dovrei riuscire a pingare l'altro e viceversa.
Se questo non succede e collegando i 2 pc con un cavo crossover il ping funziona abbiamo sbagliato qualcosa nel
bridge e dobbiamo riiniziare dal punto 2.
Se invece il ping funziona possiamo provare ad inserire una prima regola..
Editiamo il file:

/etc/pf.conf

e inseriamo le regole:

block in on dc0 all
block in on dc1 all

facciamo prendere a PF le nuove regole con il comando:

#pfctl -f /etc/pf.conf


A questo punto il ping dovrebbe dare time out. Il nostro bridge funziona.. e vi dirò di più, va da dio...


Rendiamo permanente il bridge:

A questo punto sappiamo che il nostro bridge funziona e vogliamo renderlo permanente, tutto in poche operazioni.
I dati delle configurazioni delle interfaccie sono dentro i files hostname.xxx in /etc es: /etc/hostname.dc0 oppure
/etc/hostname.xl0 e così via.

Dobbiamo cancellare il contenuto del file e sostituire tutto con la parola: up

#echo up > /etc/hostname.dc0
#echo up > /etc/hostname.dc1


a questo punto le nostre interfacce sono attive e senza indirizzo ip.
Per abilitare il bridge bisogna modificare (o creare) il file /etc/bridgename.bridge0

#echo "add dc0 add dc1 up" > /etc/bridgename.bridge0

Inoltre il seguente file deve essere vuoto: /etc/mygate (contiene l'indirizzo del gateway).

A questo punto riavviamo il bridge per testare la configurazione permanente.


Settiamo le regole del firewall:

Per ora abbiamo 2 interfacce.
Tutti i dati che entrano da una interfaccia escono dall'altra quindi potremo escluderne una.
utilizzando la seguente regola ( sempre nel file pf.conf)

pass in quick on dc0
pass out quick on dc0


e poi effetuare il block sull'altra interfaccia e scrivere tutte le regole ( vi rimando ai fantastici lavori
e traduzioni pubblicati su OpenBeer.it)


Varie e eventuali:

Possiamo dotare la nostra BlackBox di una terza scheda di rete per permettere il collegamento ad una rete
dedicata (anche no.. possiamo usare un crossover cable in casi di installazione patch) per fare gli aggiornamenti
o per un sistema di logging.. naturalmente aggiungete in pf.conf un pò di regole restrittive per quella interfaccia.
Inoltre possiamo fare un pò di debug su quello che passa per le schede di rete utilizzando il comando tcpdump:

#tcpdump dc0 -iii

oppure

#tcpdump pflog0 -iii


Riassunto:

#vi /etc/sysctl.conf Decommentare net.inet.ip.forwarding=1
#vi /etc/rc.conf Aggiungere o modificare la riga PF con PF=YES
#echo up > /etc/dc0.hostname
#echo up > /etc/dc1.hostname

#echo "add dc0 add dc1 up" > /etc/bridgename.bridge0
#reboot

#vi /etc/pf.conf
Configurare in base alle vostre esigenze
#pfctl -R /etc/pf.conf


Buon divertimento:

Ricordatevi di non fare danni e non provare nulla su una macchina in produzione.