OpenBSD: Firewall ridondanti con CARP e Chris Gamboni CISSP [email protected] TiLug.ch, Bellinzona, 9 aprile 2005 Cos'è OpenBSD ?

● OpenBSD: – Nasce da un fork di nel 1995 – Secure by default (1 remote exploit in 8 anni) – Progetto basato in Canada, nessuna restrizione sull’esportazione di crittografia – Una release ogni 6 mesi (3.7 al 1.6.2005) – Si finanzia con la vendita di CD e di gadgets – Progetti collegati: OpenSSH, OpenNTPd, OpenBGPd, OpenOSPFd, etc… Alta disponibilità: CARP e pfsync ● Il firewall è un single point of failure – Quando il firewall è fermo nessuno accede ad internet, gli e-mail sono bloccati, ecc… – Non si può fermare il firewall per aggiornarlo ● OpenBSD, dalla versione 3.5, offre CARP e pfsync che permettono di avere firewalls in parallelo. Quando un firewall si ferma, il firewall di backup ne assume l’identità in modo trasparente. CARP (1)

● Common Address Redundancy Protocol: è il protocollo che si occupa di gestire il failover a livello 2 ed a livello 3. ● Ogni gruppo CARP possiede: – Un indirizzo MAC virtuale – Un indirizzo IP virtuale – Una password CARP (2)

● Ogni interfaccia CARP può avere 3 stati: MASTER, BACKUP e INIT (ifconfig) ● Il master manda messaggi Multicast (224.0.0.18) usando il protocollo IP 112 ● La frequenza di invio dei messaggi è configurabile (default = 1 sec) ● Chi invia messaggi più frequentemente diventa master CARP (3)

● CARP funziona sia con IPv4 sia con IPv6 ● CARP ha anche una funzione arp-balance che può servire per load-balancing, ma solo nella rete locale. ● CARP spedisce messaggi cifrati con SHA-1 HMAC ● CARP, a differenza di HSRP e VRRP, è esente da licenze e brevetti. CARP: configurazione

● Configurazione IP reali: – paguro: /etc/hostname.fxp0 ● Inet 10.0.0.2 255.255.255.0 NONE – lemuro: /etc/hostname.xl0 ● Inet 10.0.0.3 255.255.255.0 NONE ● Configurazione IP virtuale: – paguro+lemuro: /etc/hostname.carp0 ● Inet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 pass abcd1234 CARP: stato

● paguro# ifconfig carp0 carp0: flags=41 mtu 1500 carp: MASTER vhid 1 advbase 1 advskew 0 inet 10.0.0.1 netmask 0xffffff00 ● lemuro# ifconfig carp0 carp0: flags=41 mtu 1500 carp: BACKUP vhid 1 advbase 1 advskew 100 inet 10.0.0.1 netmask 0xffffff00 Esempio1: servizio ridondante ● paguro ha il numero IP 10.0.0.2, mentre lemuro ha il numero IP 10.0.0.3. ● paguro segnala tramite CARP ogni secondo (configurabile) di avere l’indirizzo 10.0.0.1 ● Dopo 3 mancate segnalazioni di paguro, lemuro diventa MASTER annunciando CARP e rispondendo all’IP virtuale 10.0.0.1 CARP: preemption (1)

● Con CARP preemption è possibile definire chi è MASTER e chi è BACKUP. ● Configurazione per il server di backup: – /etc/hostname.carp0 ● Inet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 advskew 100 – In questo caso si aumenta il tempo tra gli annunci CARP (1sec + advskew/255). CARP preemption (2)

● Nei sistemi con diverse interfaccie CARP è auspicabile che in caso di malfunzionamento di un’interfaccia fisica, tutti i gruppi CARP vengano passati al server di Backup ● Con “preempt” in caso di problemi ad un’interfaccia il valore advskew di tutti i gruppi CARP del sistema viene portato a 240, causando un failover generale. Pfsync (1)

● Pfsync si occupa di comunicare ad altri firewall le modifiche alla tabella di stato delle sessioni (annuncia i cambiamenti ed inserisce nella propria tabella i cambiamenti annunciati da altri) ● Al momento pfsync non usa autenticazione, è quindi altamente consigliato l’utilizzo di una rete dedicata Pfsync (2)

● Configurazione dell’interfaccia di sincronizzazione: – /etc/hostname.fxp2 ● Inet 192.168.255.254 255.255.255.0 NONE – /etc/hostname.pfsync0 ● Up syncif fxp2 Integrazione +CARP+pfsync

● Le regole dei firewall dovranno lasciare passare i pacchetti pfsync e CARP: – /etc/pf.conf ● Pass quick on { $syncif } proto pfsync ● Pass on { $intif $extif } proto carp keep state Pfctl: visualizzare le sessioni

# pfctl -ss self tcp 10.5.0.1:22 <- 10.0.1.168:1168 ESTABLISHED:ESTABLISHED self carp 224.0.0.18 <- 10.5.0.2 NO_TRAFFIC:SINGLE self carp 10.5.0.2 -> 224.0.0.18 SINGLE:NO_TRAFFIC Esempio2: firewall ridondante

● paguro e lemuro hanno 3 interfacce ● paguro è configurato come MASTER ● In caso di problemi a paguro, lemuro diventa master (dopo 2-3 secondi) ● Tutte le sessioni, grazie a pfsync, vengono mantenute poiché già trasferite ad lemuro. ● Quando paguro riparte chiede un “bulk update” della tabella degli stati a lemuro e poco dopo ridiventa master Esempio2: schema

Rete esterna

carp0

Lemuro Paguro pfsync Backup Firewall Master Firewall

carp1

Rete interna Referenze

● OpenBSD: http://www.openbsd.org ● Firewall failover with pfsync and CARP: http://www.cuntersiege.com/doc/pfsync-carp/ ● Italian OpenBSD user group: http://www.opengeeks.it/docs/carpepfsync.pdf ● OpenBSD man pages: man carp, ifconfig, pfsync, pf.conf, ecc…