[Precedente: Authpf: User Shell per Gateway di autenticazione] [Indice] [Successivo: Firewall domestico o per piccoli uffici]
CARP funziona consentendo a un gruppo di host sullo stesso segmento di rete di condividere un indirizzo IP. Questo gruppo di host e' definito come "gruppo ridondante". Al gruppo ridondante e' assegnato un indirizzo IP condiviso tra i membri del gruppo.Nel gruppo, un host e' il "master" mentre gli altri sono definiti "backups". L' host master e' quello che "detiene" l'indirizzo IP condiviso; risponde direttamente lui a tutto il traffico e a ogni richiesta ARP. Ogni host puo' appartenere contemporaneamente a piu' di un gruppo di redundancy.
Un utilizzo comune di CARP e' di creare un gruppo di firewall ridondanti. L'indirizzo IP virtuale assegnato al gruppo ridondante e' configurato sui client come gateway di default. Se il firewall master avesse dei problemi o venisse spento, l'IP verrebbe trasferito su un firewall di backup senza alcun disservizio.
CARP supporta l' IPv4 e l' IPv6.
E' possibile che sullo stesso segmento di rete esistano contemporaneamente piu' gruppi CARP. I segnali inviati da CARP contengono l'ID Virtual Host che consente ai membri del gruppo di identificare a quale gruppo ridondante appartiene il messaggio.
Per evitare un uso scorretto del segmento di rete utilizzando messaggi CARP contraffatti, ogni gruppo puo' essere configurato con una password. Ogni pacchetto CARP packet inviato al gruppo e' quindi protetto da un SHA1 HMAC.
Dato che CARP ha un protocollo proprietario, occorre una regola di filtraggio esplicita pass nelle regole di configurazione del filtro:
pass out on $carp_dev proto carp keep state
$carp_dev dovrebbe essere l'interfaccia fisica utilizzata da CARP per comunicare.
ifconfig carpN create
ifconfig carpN vhid vhid [pass password] [carpdev carpdev] \
[advbase advbase] [advskew advskew] [state state] ipaddress \
netmask mask
Il comportamento di CARP puo' essere controllato con sysctl(8).
# sysctl -w net.inet.carp.allow=1
# ifconfig carp1 create
# ifconfig carp1 vhid 1 pass mekmitasdigoat carpdev em0 \
advskew 100 10.0.0.1 netmask 255.255.255.0
L'esempio esegue la seguente configurazione:
Per mostrare lo stato dell'interfaccia si può utilizzare ifconfig su carp1.
# ifconfig carp1
carp1: flags=8802<UP,BROADCAST,SIMPLEX,MULTICAST> mtu 1500
carp: BACKUP carpdev em0 vhid 1 advbase 1 advskew 100
groups: carp
inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
Quando pfsync(4) e' configurato per inviare e ricevere update sulla rete, di default invia update multicast sulla rete. Tutti gli update sono inviati senza autenticazione. Pratica comune e':
Quando gli update sono stati inviati e ricevuti sulla rete, i pacchetti pfsync dovrebbero essere passati nelle regole di configurazione del filtro:
pass on $sync_if proto pfsync
$sync_if dovrebbe essere l'interfaccia fisica con la quale pfsync(4) comunica.
ifconfig pfsyncN syncdev syncdev [syncpeer syncpeer]
# ifconfig pfsync0 syncdev em1Questo abilita pfsync sull'interfaccia em1. Gli update in uscita saranno multicast inviati sulla rete consentendo ad ogni host con pfsync attivo di riceverli.
Un esempio di scenario. Due firewall, fw1 e fw2.
+----| WAN/Internet |----+
| |
em2| |em2
+-----+ +-----+
| fw1 |-em1----------em1-| fw2 |
+-----+ +-----+
em0| |em0
| |
---+-------Shared LAN-------+---
I firewall sono connessi back-to-back usando un cavo crossover su em1. Entrambi sono connessi alla LAN su em0 e alla connessione WAN/Internet su em2. Gli indirizzi IP sono i seguenti:
La policy della rete e' che fw1 sara' il master preferito.
Configurare fw1:
! abilita il preemption e l'interfaccia di gruppo failover
# sysctl -w net.inet.carp.preempt=1
! configura pfsync
# ifconfig em1 10.10.10.1 netmask 255.255.255.0
# ifconfig pfsync0 syncdev em1
# ifconfig pfsync0 up
! configura CARP su lato LAN
# ifconfig carp1 create
# ifconfig carp1 vhid 1 carpdev em0 pass lanpasswd \
172.16.0.100 netmask 255.255.255.0
! configura CARP su lato WAN/Internet
# ifconfig carp2 create
# ifconfig carp2 vhid 2 carpdev em2 pass netpasswd \
192.0.2.100 netmask 255.255.255.0
|
Configurare fw2:
! abilita la preemption e il failover del gruppo di interfaccia
# sysctl -w net.inet.carp.preempt=1
! configura pfsync
# ifconfig em1 10.10.10.2 netmask 255.255.255.0
# ifconfig pfsync0 syncdev em1
# ifconfig pfsync0 up
! configura CARP su lato LAN
# ifconfig carp1 create
# ifconfig carp1 vhid 1 carpdev em0 pass lanpasswd \
advskew 128 172.16.0.100 netmask 255.255.255.0
! configura CARP su lato WAN/Internet
# ifconfig carp2 create
# ifconfig carp2 vhid 2 carpdev em2 pass netpasswd \
advskew 128 192.0.2.100 netmask 255.255.255.0
|
Esempi:
Per il failover di un particolare gruppo CARP, disattivare l'interfaccia carp(4) sul nodo master. Il master inizierà a inviare messaggi con un advbase e advskew "infinito". Tra gli host di backup vi sarà un nuovo master.
# ifconfig carp1 down
Un'alternativa è di incrementare advskew a un valore più alto dell'advskew sugli host backup. Questo causa un failover del master che comunque continua a partecipare al grupppo CARP.
Un altro metodo per il failover è di allineare il contatore demotion. Il contatore demotion è una misura di quanto "pronto" sia un host a divenire master di un gruppo CARP. Per esempio, mentre un host sta facendo il boot è una cattiva idea farlo divenire master CARP fin quando non siano state configurate tutte le interfaccie, avviati tutti i servizi, ecc. Host che comunicano un valore elevato di demotion saranno i meno preferiti nel divenire master.
Un contatore demotion è conservato in ogni gruppo di interfaccie appartenenti a CARP. Per default, tutte le interfaccie CARP sono membri del gruppo "CARP" di interfaccie. Il valore corrente di un contatore demotion può essere visto usando ifconfig(8):
# ifconfig -g carp
carp: carp demote count 0
In questo esempio viene mostrato il contatore associato al gruppo interfaccia "carp". Quando un host CARP comunica se stesso sulla rete, esso prende la somma dei contatori demotion per ogni gruppo interfaccia alla quale l'interfaccia carp(4) appartiene e comunica questo valore come suo valore di demotion.
Consideriamo il seguente esempio: Due firewall con CARP con le seguenti interfaccie CARP:
L'obiettivo è di avere un failover dei gruppi carp1 e carp2 al secondo firewall.
Per prima cosa assegnamo ognuno ad un nuovo gruppo di interfaccia chiamata "internal":
# ifconfig carp1 group internal
# ifconfig carp2 group internal
# ifconfig internal
carp1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
carp: MASTER carpdev em0 vhid 1 advbase 1 advskew 100
groups: carp internal
inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
carp2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
carp: MASTER carpdev em1 vhid 2 advbase 1 advskew 100
groups: carp internal
inet 10.0.1.1 netmask 0xffffff00 broadcast 10.0.1.255
Ora incrementiamo il contatore demotion per il gruppo "internal" usando ifconfig(8):
# ifconfig -g internal
internal: carp demote count 0
# ifconfig -g internal carpdemote 50
# ifconfig -g internal
internal: carp demote count 50
Ora il firewall effettuerà un failover sui gruppi carp1 e carp2 per l'altro firewall del cluster, mentre continua ad essere master per i gruppi carp3 e carp4. Se l'altro firewall dovesse iniziare a promuovere se stesso con un valore di demotion più alto di 50, oppure se l'altro firewall smettesse a un tratto di inviare messaggi, questo firewall riprenderebbe ad essere master per carp1 e carp2.
Per tornare al firewall primario occorre invertire i comandi:
# ifconfig -g internal -carpdemote 50
# ifconfig -g internal
internal: carp demote count 0
Servizi di rete come OpenBGPD e sasyncd(8) usano il demotion counter per assicurarsi che il firewall non diventi master finchè non si sia stabilita la sessione BGP e sia sincronizzato l'IPsec.
pass in on fxp0 inet proto tcp from any to carp0 port 22ma sostituendo fxp0 con carp0 non funziona come desiderato.
NON dimenticare di far passare proto carp e proto pfsync!
[Precedente: Authpf: User Shell per Authenticating Gateway] [Indice] [successivo: Firewall domestico o per piccoli uffici]