Laboratorio

Modulo 8 - Reti di reti: VRRP

Esperienza su Virtual Router Redundancy Protocol (VRRP)

Per la realizzazione di questo modulo useremo Netkit4TIC. Scarica il tarball (100KB) contenente la configurazione e lo script lab per la costruzione dell'esperienza.

La realizzazione di reti ad alta affidabilità si attua adottando percorsi ridondati e duplicazioni di apparati di reti ma questo può non essere sufficiente soprattutto per quanto riguarda i nodi finali. Infatti in questi nodi viene configurato staticamente un defalt gateway che nel caso si guasti isola di fatto la stazione. Questioni di sicurezza, semplicità di configurazione e consumo di risorse sconsigliano l'utilizzo di protocolli di routing dinamici in queste stazioni. Da alcuni anni sono state proposte delle soluzioni che si chiamano HSRP e il suo derivato VRRP. Per una trattazione completa si rimanda al libro "Switched LAN" di Baldi e Nicoletti, Mc-Graw-Hill Italia Associates capitolo 7 pagina 216 e oltre.

L'implementazione di VRRP che utilizziamo è quella realizzata dal pacchetto keepalived disponibile sia in Debian che in LEAF/Bering uClibc. In particolare l'esperienza è basata su quest'ultima distribuzione.

Per la documentazione di questa implementazione ci sono due ottimi riferimenti:

Per l'utilizzo del pacchetto kpalived.lrp occorre specificare nel file di configurazione leaf.cfg, oltre a kpalived stesso, i pacchetti di cui ha bisogno: libpopt.lrp libssl.lrp libcrpto.lrp.

Nella mappa (pdf, xml) della rete dell'esercizio viene simulata una LAN (192.168.42.0/24) connessa ad una WAN (192.168.43.0/24) tramite una coppia di router in cui è configurato il VRRP. Abbiamo voluto provare una configurazione di "load sharing" per utilizzare contemporaneamente entrambe i router. Infatti in mancanza di guasti il traffico entrante passa per il router rA e il traffico uscente per il router rB.

La configurazione di VRRP costruisce rispettivamente l'IP virtuale 192.168.42.1 per la rete LAN e l'IP virtuale 192.168.43.1 per la rete WAN. Il primo risulta il default gateway per la LAN rappresentata dal nodo int. Il secondo rappresenta il nodo della WAN utilizzabile dal nodo ext per l'inoltro dei pacchetti sulla LAN (detto anche next-hop).

Per la distribuzione del carico (Load sharing) abbiamo pensato che il nodo rA sia di transito per il flusso entrante nella LAN e che il nodo rB sia di transito per il flusso uscente dalla LAN.

La configurazione per il nodo rA è la seguente:

! /etc/keepalived/keepalived.conf

vrrp_instance VI_1             ! Defines a new instance of VRRP
{
    state MASTER               ! This VRRP instance will attempt to start in master state
    interface eth0             ! This VRRP instance operates on the eth0 interface
    virtual_router_id 1        ! The VRID this VRRP instances belongs to.
    priority 250               ! The priority ot this VRRP router in this virtual router
    advert_int 2               ! VRRP advertisements will occur ever 2 seconds
    authentication {           ! Defines the type of authentications
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {        ! The list of VIP that are managed by this VRID
        192.168.43.1/24        !
    }
    notify_master "/etc/keepalived/email-master.sh VI_1 master"
    notify_backup "/etc/keepalived/email-backup.sh VI_1 backup"
    notify_fault "/etc/keepalived/email-fault.sh VI_1 fault"
    smtp_alert                 ! Send email notif during state transition
}

vrrp_instance VI_2
{
    state BACKUP               ! This VRRP instance will attempt to start in backup state
    interface eth1
    virtual_router_id 2
    priority 10
    advert_int 2
    smtp_alert
    authentication {
        auth_type PASS
        auth_pass 5678
    }
    virtual_ipaddress {
        192.168.42.1/24
    }
    notify_master "/etc/keepalived/email-master.sh VI_2 master"
    notify_backup "/etc/keepalived/email-backup.sh VI_2 backup"
    notify_fault "/etc/keepalived/email-fault.sh VI_2 fault"
    smtp_alert  
}

La configurazione per il nodo rB ` simile tranne che per lo stato di VI_1 che passa da MASTER a BACKUP e per lo stato di VI_2 che passa da BACKUP a MASTER.
Dopo aver settato correttamente l'ambiente Netkit lancia lo script che genera la rete interamente configurata:

realhost$ lstart

(screenshot)

Le attività eseguite dal programma vengono registrate nel file /var/log/messages (nell'esempio dal router rA):

Keepalived_vrrp: Using MII-BMSR NIC polling thread...
Keepalived_vrrp: Registering Kernel netlink reflector
Keepalived_vrrp: Registering Kernel netlink command channel
Keepalived_vrrp: Registering gratutious ARP shared channel
Keepalived_healthcheckers: Watchdog: Starting listener on /tmp/.healthcheckers wdog socket
Keepalived_vrrp: Configuration is using : 76341 Bytes
Keepalived_vrrp: Watchdog: Starting listener on /tmp/.vrrp wdog socket
Keepalived_vrrp: VRRP_Instance(VI_2) Entering BACKUP STATE
Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE

Nel caso di un fault del router rB simulato da:

realHost$ lcrash rB

nel file (di rA) compariranno anche le seguenti tracce:

Keepalived_vrrp: VRRP_Instance(VI_2) Transition to MASTER STATE
Keepalived_vrrp: VRRP_Instance(VI_2) Entering MASTER STATE

e al ripristino del router rB simulato da:

realHost$ lstart rB

nel file (sempre di rA) compariranno anche le seguenti tracce:

Keepalived_vrrp: VRRP_Instance(VI_2) Received higher prio advert
Keepalived_vrrp: VRRP_Instance(VI_2) Entering BACKUP STATE

Per controllare quali IP sono assegnati alle interfacce eth0 ed eth1 utilizziamo i comandi:

rA# ip addr show eth0; ip addr show eth1
4: eth0: <BROADCAST,MULTICAST,ALLMULTI,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether fe:fd:c0:a8:2b:08 brd ff:ff:ff:ff:ff:ff
    inet 192.168.43.8/24 brd 192.168.43.255 scope global eth0
    inet 192.168.43.1/24 scope global secondary eth0
    inet6 fe80::fcfd:c0ff:fea8:2b08/64 scope link 
5: eth1: <BROADCAST,MULTICAST,ALLMULTI,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether fe:fd:c0:a8:2a:08 brd ff:ff:ff:ff:ff:ff
    inet 192.168.42.8/24 brd 192.168.42.255 scope global eth1
    inet6 fe80::fcfd:c0ff:fea8:2a08/64 scope link

dove è evidenziato in colore la riga dell'IP virtuale per l'interfaccia nella WAN. Nell'altro router rB i valori sono:

rB# ip addr show eth0; ip addr show eth1
4: eth0: <BROADCAST,MULTICAST,ALLMULTI,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether fe:fd:c0:a8:2b:09 brd ff:ff:ff:ff:ff:ff
    inet 192.168.43.9/24 brd 192.168.43.255 scope global eth0
    inet6 fe80::fcfd:c0ff:fea8:2b09/64 scope link 
5: eth1: <BROADCAST,MULTICAST,ALLMULTI,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether fe:fd:c0:a8:2a:09 brd ff:ff:ff:ff:ff:ff
    inet 192.168.42.9/24 brd 192.168.42.255 scope global eth1
    inet 192.168.42.1/24 scope global secondary eth1
    inet6 fe80::fcfd:c0ff:fea8:2a09/64 scope link

Nel caso di guasto del router rB l'output diventa:

rA# ip addr show eth0; ip addr show eth1
4: eth0: <BROADCAST,MULTICAST,ALLMULTI,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether fe:fd:c0:a8:2b:08 brd ff:ff:ff:ff:ff:ff
    inet 192.168.43.8/24 brd 192.168.43.255 scope global eth0
    inet 192.168.43.1/24 scope global secondary eth0
    inet6 fe80::fcfd:c0ff:fea8:2b08/64 scope link 
5: eth1: <BROADCAST,MULTICAST,ALLMULTI,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether fe:fd:c0:a8:2a:08 brd ff:ff:ff:ff:ff:ff
    inet 192.168.42.8/24 brd 192.168.42.255 scope global eth1
    inet 192.168.42.1/24 scope global secondary eth1
    inet6 fe80::fcfd:c0ff:fea8:2a08/64 scope link

È stato catturato il traffico sia sul segmento (File ACP) WAN che nel segmento (File ACP) LAN.

Configurazione "Sync Group"

Per evitare casi di "dead route" il pacchetto keepalive permette la configurazione "sync grouping". Infatti nel caso precedente quando ad esempio non si guasta l'intero router rA ma solo l'interfaccia eth1 il traffico entrante dall'interfaccia eth0 non riesce a raggiungere la LAN.
Per garantire il funzionamento per questi casi dobbiamo abbandonare la configurazione "load sharing" e quindi eleggere il nodo rA come MASTER per tutte le sue interfacce e il nodo rB come BACKUP per tutte le sue interfacce.
Inoltre occorre aggiungere nel file di configurazione:

! /etc/keepalived/keepalived.conf
[...]
vrrp_sync_group SG {         ! VRRP sync group declaration
    group {                  ! group of instance to sync together
        VI_1
        VI_2
    }
    notify_master "/etc/keepalived/email-master.sh SG master"
    notify_backup "/etc/keepalived/email-backup.sh SG backup"
    notify_fault "/etc/keepalived/email-fault.sh SG fault"
    smtp_alert               ! send email notif during state transit
}
[...]

Per attivare questa modalità di configurazione occorre fare le seguenti modifiche:

rA# /etc/init.d/keepalived stop
rB# /etc/init.d/keepalived stop
rA# cp /etc/keepalived/keepalived.conf.no-SPoF /etc/keepalived/keepalived.conf
rB# cp /etc/keepalived/keepalived.conf.no-SPoF /etc/keepalived/keepalived.conf
rA# /etc/init.d/keepalived start
rB# /etc/init.d/keepalived start

Simuliamo il caso di guasto:

rA# ip link set dev eth1 down

Osserviamo il contenuto del file /var/log/messages del nodo rB:

Keepalived_vrrp: VRRP_Instance(VI_2) Transition to MASTER STATE
Keepalived_vrrp: VRRP_Group(SG) Syncing instances to MASTER state
Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Keepalived_vrrp: VRRP_Instance(VI_2) Entering MASTER STATE

e quello del nodo rA:

[...]
Keepalived_vrrp: Kernel is reporting: interface eth1 DOWN
Keepalived_vrrp: VRRP_Instance(VI_2) Entering FAULT STATE
Keepalived_vrrp: VRRP_Instance(VI_2) Now in FAULT state
Keepalived_vrrp: VRRP_Group(SG) Syncing instances to FAULT state
Keepalived_vrrp: VRRP_Instance(VI_1) Entering FAULT STATE
Keepalived_vrrp: VRRP_Instance(VI_1) Now in FAULT state

Creative Commons License FREE THE MOUSE Valid HTML! Sandro Doro (email me)
Ultima modifica: $Date: 2007-02-03 12:49:31 $