Ecco uno script da utilizzare in caso di doppia connessione WAN su un server linux in modo da poter switchare da una all’altra in caso di down della linea.

è pensata per essere impostato come cron ad esempio con una configurazione del genere

*/1 * * * *     root    /opt/internetGatewayFailover

Ecco lo script:

#!/bin/bash

CHECK_IP=${CHECK_IP:-8.8.4.4}
PRIMARY_IF=${PRIMARY_IF:-eth0}
PRIMARY_GW=${PRIMARY_GW:-172.16.0.1}
BACKUP_IF=${BACKUP_IF:-eth1}
BACKUP_GW=${BACKUP_GW:-192.168.3.20}

# Compare arg with current default gateway interface for route to healthcheck IP
getGwInterface() {
       # parametro 1 interfaccia
       [[ "$1" = "$(ip route get "$CHECK_IP" | sed -rn 's/^.*dev ([^ ]*).*$/\1/p')" ]]
}
checkConnectivity() {
       # parametro 1 interfaccia  
       # parametro 2 gateway
       ip route add "$CHECK_IP" via $2 dev $1
       PING_res=`ping -I $1 -c1 "$CHECK_IP"|grep 'packet loss'|cut -d ' ' -f4`
       #echo $PING_res
       ip route del "$CHECK_IP" via $2 dev $1
}
switchGw(){
       # parametro 1 attuale gateway da rimuovere
       # parametro 2 attuale interfaccia gateway da rimuovere
       # parametro 3 nuovo gateway
       # parametro 4 interfaccia nuovo gateway
       ip route del default via "$1" dev "$2"
       ip route add default via "$3" dev "$4"
}


if ping -c1 "$CHECK_IP" &>/dev/null
then
       if getGwInterface "$PRIMARY_IF"
       then
               echo "Connessione attiva su gateway primario"
               exit
       else
               echo "Connessione attiva su gateway backup"
               echo "Switch se possibile su connessione primaria"
               checkConnectivity "$PRIMARY_IF" "$PRIMARY_GW"
               if [[ "$PING_res" = "1" ]]  
               then
                       echo "Switch possibile su primario"
                       switchGw "$BACKUP_GW" "$BACKUP_IF" "$PRIMARY_GW" "$PRIMARY_IF"
               else
                       echo "Switch non possibile.... rimango su backup ed esco"
                       exit
               fi
       fi
else
       echo "Connessione NON attiva"
       if getGwInterface "$PRIMARY_IF"
       then
               echo "Switch comunque su backup"
               switchGw "$PRIMARY_GW" "$PRIMARY_IF" "$BACKUP_GW" "$BACKUP_IF"
               exit
       else
               echo "Switch comunque su primario"       
               switchGw "$BACKUP_GW" "$BACKUP_IF" "$PRIMARY_GW" "$PRIMARY_IF"
       fi
fi


exit