Gestione automatica link primario e backup

Introduzione

Disponendo già di un computer con linux a bordo, anche di dimensioni ridotte (es: raspberry), è possibile gestire una doppia connessione wan, una primaria e una secondaria. Con questo semplice sistema è in grado di passare dalla connessione primaria alla secondaria in caso di un fail del collegamento primario e di ritornare su di essa in caso di ripristino, il tutto in maniera automatica.

Il trucco è molto semplice!

Partiamo assegnando alle due interfacce wan due metriche diverse, una più bassa al link primario ed una più alta al link secondario. Questo serve per far si che sia possibile dirottare il traffico da e verso la lan e, contemporaneamente, monitorare l’interfaccia primaria. Per monitorare il corretto funzionamento dell’interfaccia, risulta essere sufficiente eseguire un ping, da essa, verso un host esterno, per esempio il classico dns Google 8.8.8.8. In caso di ping negativo viene dirottato il traffico sull’altra interfaccia. Se il traffico è stato deviato sulla seconda interfaccia e ritorna online i link primario, viene ripristinato nuovamente il traffico sul link principale.  Per spostare il traffico da un’interfaccia ad un’altra, non si fa altro che giocare con la metrica dell’interfaccia primaria, alzandola in caso di fail e abbassandola in caso di ripristino.

Ovviamente, il valore della metrica dell’interfaccia primaria deve superare o sottostare a quello dell’interfaccia secondaria. Per modificare le metriche a dispositivo acceso si usa il pacchetto ifmetric. Con uno script si andrà a gestire gli instradamenti in automatico.

Nelle prossime pagine inserirò la configurazione di partenza delle interfacce, uno script base ed un altro script con l’invio di una notifica via email.

Configurazione iniziale

L’esempio è basato su Debian, ma può essere facilmente modificato per funzionare anche con altre disto.

Supponiamo di avere tre interfacce chiamate eth0 (per la wan1), eth1 (per la wan2) e eth2 (per la lan) e di configurarle in questo modo:

auto eth0
iface eth0 inet static
    address 10.10.10.10
    netmask 255.255.255.0
    gateway 10.10.10.1
    metric 10

auto eth1
iface eth1 inet static

    address 10.10.11.10
    netmask 255.255.255.0
    gateway 10.10.11.1
    metric 20

auto eth2
iface eth2 inet static

    address 192.168.1.1
    netmask 255.255.255.0

Ricordo inoltre di abilitare il forwarding ipv4 in sysctrl.conf.

# /etc/sysctl.conf
# Togliere l'hashtag all'inizio della riga
net.ipv4.ip_forward=1

e il nat in iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -d 192.168.1.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT

Nella prossima pagina passiamo allo script.

Script base

Lo script è molto semplice da realizzare!

#!/bin/sh
OBIETTIVO=8.8.8.8
ATTESA=3
while [ 1 ] # creo un loop infinito

    do
        if ping -c 1 -W $ATTESA $OBIETTIVO -I eth0 > /dev/null
        then

            # link primario ok, ripristino il traffico
            ifmetric eth0 10

        else
            # link primario ko, passo al link secondario
            ifmetric eth0 50

        fi
    sleep 1m # attende 1 minuto (modificabile)
done

L’importante è richiamare lo script generato nel file /etc/rc.local per l’avvio automatico, inserendo alla fine della riga ‘&‘, in modo tale da non bloccare il boot.
Allo script si può aggiungere una funzione di invio di una notifica via email, ma che vedremo nell’ultima pagina.

Configurazione client di posta

Per l’invio in console di una email uso un programma di nome mutt.

Questo programma necessita di tre file di testo: uno per la configurazione dell’account e gli altri due per il corpo del messaggio.

Il primo file l’ho chiamato server.conf e lo userò per la configurazione del programma per sfruttare un’account Gmail. Per questioni di sicurezza, è fortemente consigliabile la creazione di una password dedicata.

set from = @gmail.com
set use_from = yes
set envelope_from = yes
set realname = "nome utente"
set imap_user = @gmail.com
set imap_pass = 
set spoolfile = imaps://imap.gmail.com:993/INBOX
set smtp_url = smtp://@smtp.gmail.com:587/
set smtp_pass = 
set folder = imaps://imap.gmail.com:993
set record = "+[Gmail]/Sent Mail"
set postponed = "+[Gmail]/Drafts"
set header_cache = /etc/mutt/cache/headers
set message_cachedir = /etc/mutt/cache/bodies
set certificate_file = /etc/mutt/certificates
set move = no

Gli altri file conterranno il corpo del messaggio. Ad esempio, per quanto riguarda messaggio1.txt:

Connessione primaria down. Si prega di verificare!

e l’altro (messaggio2.txt):

Connessione primaria ripristinata.

Script avanzato

A questo punto lo script diventa:

#!/bin/sh
OBIETTIVO=8.8.8.8
ATTESA=3
while [ 1 ] # creo un loop infinito
    do
        if ping -c 1 -W $ATTESA $OBIETTIVO -I eth0 > /dev/null
        then

            # link primario ok, ripristino il traffico
            mutt -s "Stato connessione primaria" -F ./server.conf  < ./messagio1.txt
            ifmetric eth0 10

        else
            # link primario ko, passo al link secondario
            mutt -s "Stato connessione primaria" -F ./server.conf  < ./messagio2.txt
            ifmetric eth0 50

        fi
    sleep 1m # attende 1 minuto (modificabile)
done
Questa voce è stata pubblicata in Mini tutorial e contrassegnata con , , , . Contrassegna il permalink.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.