Sei sulla pagina 1di 7

Italian OpenBSD Users Group

Cluster di Firewall
con OpenBSD
Ver. 0.1
13 Febbraio 200
by
fabioFVZ
fabio@opengeeks.it
www.opengeeks.it
Introdu!ione
Dopo l'uscita della release 3.5 di OpenBD costruire un !luster di Firewall e' di"entato #olto
se#plice e alla portata di tutti. $uesto gra%ie al tea# di OpenBD c&e &a introdotto due nuo"i
protocolli di rete c&ia#ati' !()* + !o##on (ddress )edundancy *rotocol e *F,-!.
.l !luster/ in 0uesto caso/ "iene inteso co#e ad 1 (lta Disponibilita' 2.
*er ese#plificare faccia#o un'ese#pio' collegando 3 Firewall assie#e 4"edi fig.56/ in caso di
rottura del Firewall principale/ tutto il traffico passera' sul secondario/ in #aniera "eloce e del
tutto trasparente/ #antenendo tutte le connessioni c&e erano in atto in 0uel #o#ento.
Il "rotocollo C#$"
.l protocollo !()* deri"a dal protocollo V))* di !isco/ #igliorandolo in #olti aspetti. 7e
differen%e piu'interessanti sono 0uattro/ "edia#ole'
!()*/ a differen%a di V))*/ e' esente da Bre"etti8
9a la possibilita' di a"ere un singolo .* Virtuale con piu' :(! address "irtuali 4uno
per ogni &ost.6 $uesta fun%ione "iene definita 1(rp Balance2
;tili%%a la crittografia 9(5+9:(! all'interno dei pacc&etti !()* di (d"ertise#ent
rendendo #olto difficile la crea%ione di pacc&etti (D+9O!.
upporta sia .*V< c&e .*V= ed e' registrato con il nu#ero 553 .* *rotocol
!()* la"ora a layer 3 e 3 dello stack O. "irtuali%%ando sia il :(! address c&e l'.* address
appartenenti allo stesso gruppo !()*
Vedia#o ora in dettaglio l'&eader di un pacc&etto !()*
Dal file ip>carp.&
/*
* The CARP header layout is as follows:
*
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |Version| Type | VirtualHostID | AdvSkew | Auth Len |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Reserved | AdvBase | Checksum |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Counter (1) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Counter (2) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | SHA-1 HMAC (1) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | SHA-1 HMAC (2) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | SHA-1 HMAC (3) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | SHA-1 HMAC (4) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | SHA-1 HMAC (5) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
*/
!o#e si puo' "edere l'&eader e' di 3= byte/ "edia#olo in dettaglio'
Version% Versione del *rotocollo !()*
&'pe% ?ipo !()*>(DV@)?.@:@-? settato a ABA5
Virtual(ostID' .D utili%%ato per i riconoscere i gruppi
#DVS)ew% )itardo in"io pacc&etti di (DV
#ut* +en% 7ung&e%%a dell'autentica%ione
$eser,ed% )iser"ato ad usi futuri
#d,Base% ?e#po di in"io pacc&etti
C*ec)su-% !ontrollo integrita dei pacc&etti
Counter 1 e 2% e#plice !ontatore
S(#1./#C% !odice !rittografato. 7a lung&e%%a della c&ia"e e' di 3A bytes
Il protocollo "FS01C
*F,-! e' il protocollo 4.* *rotocol 3<A6 fonda#entale per gestire il nostro Firewall. @'
necessario sola#ente se il Firewall "iene configurato per utili%%are lo tateful .nspection o
utili%%ia#o il Firewall anc&e co#e -(?. .n 0uesto caso penso ci interessi #antenere in piedi le
connessioni in atto durante il 1Fault2 del Firewall :aster.
!o#e si puo' intuire in tutti e due i casi 4tateful .nspection o -(?6 ser"e utili%%are la 1?abella
di tato2 la 0uale tiene traccia delle connessioni in corso. .l protocollo *F,-! ser"e proprio a
tenere sincroni%%ate le 1?abelle di tato2 delCi Firewall di Backup.
*er 0uestioni di sicure%%a si consiglia l'uso di una rete dedicata/ collegata con un apposito ca"o
cross 4nel caso di 3 Firewall6. $uesto per e"itare sia la perdita di pacc&etti c&e l'in"io di
pacc&etti fasulli in"iati ad+&oc c&e potrebbero andare a ca#biare le 1?abelle di tato2.
(nc&e *F,-! co#e !()* utili%%a #essaggi in"iati in broadcast/ #a/ a differen%a di !()*/
*F,-! per adesso non usa la crittografia per l'in"io dei #essaggi.
Costruia-o il nostro Firewall
*artia#o da un ese#pio di una piccola rete a%iendale co#e in figura 5.
!o#e siste#a d'ese#pio &o utili%%ato 3 oekris net<DA5 con una !*; Eeode 45D=6 a 3==:&%
e 3 c&ede di rete della -ational e#iconductor "iste da OpenBD co#e sisAC3.
7'(D7 entra in un router il 0uale &a una rete 5A.A.A.B nella sua parte 7(-. .l suo nu#ero .* e'
5A.A.A.5. )icordate"i di i#postare una static route nel )outer/ in 0uesto caso gli indic&ia#o di
instradare tutta la rete 5F3.5=D.5.AC3< "erso il gateway 5A.A.A.3 4l'ip Virtuale6.
Eli utenti lato 7(- de"ono settare il proprio Eateway su 5F3.5=D.5.5 4il "irtuale lato 7(-6.
Vedia#o la configura%ione del :aster
/etc/hostname.sis0
inet 10.0.0.200 255.255.255.0 NONE NONE
/etc/hostname.sis1
inet 192.168.1.200 255.255.255.0 NONE NONE
/etc/hostname.sis2
inet 192.168.254.200 255.255.255.0 NONE NONE
/etc/hostname.carp0
inet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 pass 12345
/etc/hostname.carp1
inet 192.168.1.1 255.255.255.0 192.168.1.255 vhid 2 pass 5678
/etc/hostname.pfsync0
up syncif sis2
Vedia#o la configura%ione del Backup
/etc/hostname.sis0
inet 10.0.0.201 255.255.255.0 NONE NONE
/etc/hostname.sis1
inet 192.168.1.201 255.255.255.0 NONE NONE
/etc/hostname.sis2
inet 192.168.254.201 255.255.255.0 NONE NONE
/etc/hostname.carp0
inet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 pass 12345
/etc/hostname.carp1
inet 192.168.1.1 255.255.255.0 192.168.1.255 vhid 2 pass 5678
/etc/hostname.pfsync0
up syncdev (syncif sis2
!o#e "edete la configura%ione e' pratica#ente la stessa. .n 0uesto caso all'a""io/ il pri#o
ser"er c&e tras#ette l'(d"ertise#ent di"enta :aster ed l'altro lo la"e. e si "uole i#porre
una #acc&ina co#e la"e 40uando il :aster fun%iona6 do"ete aggiungere il para#etro
ad"skew con un "alore c&e puo' "ariare da 5 a 355 nel ser"er di Backup'
/etc/hostname.carp0
inet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 advskew 100 pass 12345
/etc/hostname.carp1
inet 192.168.1.1 255.255.255.0 192.168.1.255 vhid 2 advskew 100 pass 5678
.noltre in tutti e due i ser"er de"e essere i#postato il seguente "alore nel kernel.
sysctl -w net.inet.carp.preempt=1
!on"iene inserire la riga nel "osto file CetcCsysctl.conf
net.inet.carp.preempt=1
*er capire il "alore ad"skew dobbia#o co#prendere 0uesta for#ula'
advbase + (advskew / 255 ) = Tempo in secondi tra 2 Advertise
(d"base di default e' settato a 5 secondo e ad"skew G A c&e significa a""iene una
tras#issione ogni secondo.
e il Backup non 1sente2 per 3 "olte di 0uesti inter"alli il pacc&etto di (d"ertise/ il backup
passa a :aster ed in"ia lui i pacc&etti.
Co-e 2un!iona3
-el nor#ale fun%iona#ento il :aster in"ia i suo #essaggi di !()* per infor#are c&e e'
fun%ionante. . #essaggi "engono in"iati ogni secondo 4se non a"ete specificato un "alore di
ad"skew6. ?utto il traffico passa attra"erso il :aster il 0uale oltre ad aggiornare la propria
tabella di stato/ in"ia dei pacc&etti sull'interfaccia di *F,-! di aggiorna#ento. . backup
prendono 0uesti pacc&etti ed aggiornano la propria tabella di stato.
$uando a""iene la rottura il Backup non rice"endo piu i pacc&etti di ad"ertise 4circa 3 secondi
per una configura%ione standard6 il Backup passa in :aster e si #ette ad in"iare pacc&etti
!()* ed a tenere aggiornata la tabella di stato. Vengono inoltre in"iati i segnali di *F,-!
perc&e' potrebbero esserci piu' Firewall di Backup e de"ono essere aggiornati.
(ppena il :aster 1Originale2 ritorna/ in"ia un pacc&etto *F,-! con il #essaggio di
B;7H>;*D(?@. $uesto fa in"iare dal 1(ttuale :aster2 una serie di pacc&etti *F,-! per
risincroni%%are la tabella. (lla fine della sincroni%%a%ione 4in"iando un pacc&etto *F,-! con
"alore @-D>B;7H>;*D(?@/ il #aster Originale rico#incia ad rein"iare pacc&etti !()* c&e
fanno tornare a Backup/ l'attuale :aster.
@se#pio di #essaggi !()*
# tcpdump -v -n -i sis0
tcpdump: listening on sis0
18:48:54.540660 carp 10.0.0.200 > 224.0.0.18: CARPv2-advertise 36: vhid=1
advbase=1 advskew=0 (DF) [tos 0x10] (ttl 255,)
18:48:55.550642 carp 10.0.0.200 > 224.0.0.18: CARPv2-advertise 36: vhid=1
advbase=1 advskew=0 (DF) [tos 0x10] (ttl 255,)
Ulteriori controlli
!o#e a"ete "isto il fun%iona#ento e' #olto se#plice e la configura%ione ancora di piu'. *er
rendere piu' raffinato il nostro Firewall e' utile c&e aggiungia#o alcune fun%ioni #olto utili.
)icordate"i di aggiungere alle "ostre regole di *F il passaggio dei pacc&etti !()* e *F,-!
co#e nell'ese#pio 0ui sotto'
# Riferendoci all'esempio di fig. 1
pass quick on { sis2 } proto pfsync
pass on { sis0 sis1 } proto carp keep state
)icordate"i c&e il file delle regole di *F de"e essere sincroni%%ato su tutti i ser"er. ;n siste#a
e' 0uello di utili%%are il progra##a rsync per copiare i file e risincroni%%are le regole ad ogni
#odifica. $uesto puo' essere fatto sia dal :aster "erso i Backup 4pus&6 o "ice"ersa.
.noltre e' utile sapere 0uando a""iene un F(;7? del :aster. .n 0uesto caso andre#o a creare
uno se#plice script c&e #onitori%%i lo stato in cui si tro"a il ser"er di 1riser"a2 c&e
nor#al#ente e' in stato di 1Backup2.
*er sapere lo stato di !()* basta utili%%are ifconfig carpI co#e nell'ese#pio seguente'
# ifconfig carp0
carp0: flags=41<UP,RUNNING> mtu 1500
carp: MASTER vhid 1 advbase 1 advskew 0
inet 192.168.1.1 netmask 0xffffff00
!o#e si puo "edere nella seconda riga si tro"a lo stato di !()* c&e in 0uesta situa%ione e'
settato in :aster.
7o script de"e #onitori%%are lo stato del Backup ed in"iare una #ail nel caso lo stato ca#bi in
:(?@). @' inutile a"ere il Fault ?olerance se poi non "enia#o a""ertiti c&e 0ualcosa non sta
fun%ionando.
Conclusione
!o#e a"ete "isto creare un !luster di Firewall e' #olto se#plice e con una spesa #olto
contenuta.
Visto il note"ole rispar#io #onetario rispetto l' ac0uisto di siste#i di ben 1nota #arca2/
potreste aiutate il tea# di OpenBD ac0uistando il cofanetto di !D originale presso il sito'
www.openbsd.org o dal grande J.: www.kdD5.co#

.n"iate#i pure suggeri#enti eCo corre%ioni.
$i2eri-enti
ito OpenBD' &ttp'CCwww.openbsd.org
!arp su OpenBD' &ttp'CCwww.openbsd.orgClyrics.&t#lK35
Euida in .nglese' &ttp'CC www.countersiege.co#CdocC pfsync+carp C
#an' carp4<6 L pfsync4<6 L pf4<6 L pfctl4D6 L ifconfig4D6