1. Ce inseamna WAN failover?
WAN Failover este termenul folosit pentru ridicarea automata a unei conexiuni de backup in cazul in care nu mai functioneaza conexiunea principala la internet.2. Un exemplu concret.
Haideti sa luam un exemplu concret. Se da o locatie (ex.: cladire de birouri) cu 2 conexiuni la internet: Provider A – conexiunea 1 (fibra optica) / Provider B – conexiunea 2 (Backup ADSL), un server linux pentru routing si o retea de calculatoare in spatele serverului de routing.
Se doreste Provider A conexiune principal si Provider B conexiune secundata de backup. In cazul in care conexiunea cu Provider A se intrerupe din motive tehnice trebuie ca tot traficul sa fie redirectionat catre Provider B.
Se doreste Provider A conexiune principal si Provider B conexiune secundata de backup. In cazul in care conexiunea cu Provider A se intrerupe din motive tehnice trebuie ca tot traficul sa fie redirectionat catre Provider B.
3. Cum se face ?
Serverul de linux trebuie echipat cu 3 placi de retea: eth0 -> Provider A, eth1 -> Provider B, eth2 > LAN.
Eu voi realiza failover-ul cu ajutorul metricelor pe fiecare adaptor de retea in parte si cu ajutorul unui script care va verifica in mod constant disponibilitatea fiecarui Provider in parte.
Eu voi realiza failover-ul cu ajutorul metricelor pe fiecare adaptor de retea in parte si cu ajutorul unui script care va verifica in mod constant disponibilitatea fiecarui Provider in parte.
IP Provider A: 10.0.0.2 / GW: 10.0.0.1
IP Provider B: 10.0.1.2 / GW: 10.0.1.1
IP LAN: 192.168.0.1
Scriptul firewall_start
#!/bin/bash
echo "Starting Router Service..."
# Incarcare NAT
modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -I POSTROUTING -o eth1 -j MASQUERADE
# Detectare IP
IPA=`ifconfig eth0 | grep inet | awk '{ print $2 }' | awk -F: '{ print $2 }'`
IPB=`ifconfig eth1 | grep inet | awk '{ print $2 }' | awk -F: '{ print $2 }'`
IPLOCAL=`ifconfig eth2 | grep inet | awk '{ print $2 }' | awk -F: '{ print $2 }'`
GWA=10.0.0.1
GWB=10.0.1.1
echo "IP Provider A: $IPA"
echo "IP Provider B: $IPB"
echo "IP Local: $IPLOCAL"
# Rute Default
ip route add default via $GWA dev eth0 metric 0 # Conexiunea Principala
ip route add default via $GWB dev eth1 metric 1 # Conexiunea Secundara
echo "Done !"
Mai departe o sa folosim un script care va verifica disponibilitatea fiecarei conexiuni in parte si v-om schimba metricele in functie de acestea.
Ex: Daca Conexiunea Principala este down scriptul v-a modifica metricele din rutele default. Tabela va arata cam asa:
Daca Provider A down:
ip route del default
ip route del default
ip route add default via $GWA dev eth0 metric 1 # Conexiunea Principala
ip route add default via $GWB dev eth1 metric 0 # Conexiunea Secundara
Daca Provider A este din nou UP:
ip route del default
ip route del default
ip route add default via $GWA dev eth0 metric 0 # Conexiunea Principala
ip route add default via $GWB dev eth1 metric 1 # Conexiunea Secundara
Scriptul care face acest lucru este urmatorul:
#!/bin/bash
SLEEPTIME=10
TESTIP=193.19.192.2
TIMEOUT=4
EXTIF1=eth0
EXTIF2=eth1
IP1=`ifconfig eth0 | grep inet | awk '{ print $2 }' | awk -F: '{ print $2 }'`
IP2=`ifconfig eth1 | grep inet | awk '{ print $2 }' | awk -F: '{ print $2 }'`
GW1=10.0.0.1
GW2=10.0.1.1
W1=0
W2=1
NAME1=PROVA
NAME2=PROVB
SUCCESSREPEATCOUNT=3
FAILUREREPEATCOUNT=2
LLS2=1
LPS1=1
LPS2=1
CPS1=1
CPS2=1
CLS1=1
CLS2=1
COUNT1=0
COUNT2=0
while : ; do
ping -W $TIMEOUT -I $EXTIF1 -c 1 $TESTIP > /dev/null 2>&1
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
echo [`date +%x.%X`] $NAME1 Down
CPS1=1
else
CPS1=0
fi
if [ $LPS1 -ne $CPS1 ]; then
echo [`date +%x.%X`] Ping status changed for $NAME1 from $LPS1 to $CPS1
COUNT1=1
else
if [ $LPS1 -ne $LLS1 ]; then
COUNT1=`expr $COUNT1 + 1`
fi
fi
if [[ $COUNT1 -ge $SUCCESSREPEATCOUNT || ($LLS1 -eq 0 && $COUNT1 -ge $FAILUREREPEATCOUNT) ]]; then
echo [`date +%x.%X`] Uptime status will be changed for $NAME1 from $LLS1
CLS1=0
COUNT1=0
if [ $LLS1 -eq 1 ]; then
LLS1=0
else
LLS1=1
fi
else
CLS1=1
fi
LPS1=$CPS1
ping -W $TIMEOUT -I $EXTIF2 -c 1 $TESTIP > /dev/null 2>&1
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
echo [`date +%x.%X`] $NAME2 Down
CPS2=1
else
CPS2=0
fi
if [ $LPS2 -ne $CPS2 ]; then
echo [`date +%x.%X`] Ping status changed for $NAME2 from $LPS2 to $CPS2
COUNT2=1
else
if [ $LPS2 -ne $LLS2 ]; then
COUNT2=`expr $COUNT2 + 1`
fi
fi
if [[ $COUNT2 -ge $SUCCESSREPEATCOUNT || ($LLS2 -eq 0 && $COUNT2 -ge $FAILUREREPEATCOUNT) ]]; then
echo [`date +%x.%X`] Uptime status will be changed for $NAME2 from $LLS2
CLS2=0
COUNT2=0
if [ $LLS2 -eq 1 ]; then
LLS2=0
else
LLS2=1
fi
else
CLS2=1
fi
LPS2=$CPS2
if [[ $CLS1 -eq 0 || $CLS2 -eq 0 ]]; then
if [[ $LLS1 -eq 1 && $LLS2 -eq 0 ]]; then
echo [`date +%x.%X`] Ruta activa: $NAME2 ! $NAME1 loss 100%.
ip route del default
ip route del default
ip route add default via $GW2 dev $EXTIF2 metric $W1
ip route add default via $GW1 dev $EXTIF1 metric $W2
elif [[ $LLS1 -eq 0 && $LLS2 -eq 1 ]]; then
echo [`date +%x.%X`] Ruta activa: $NAME1 ! $NAME2 loss 100%.
ip route del default
ip route del default
ip route add default via $GW1 dev $EXTIF1 metric $W1
ip route add default via $GW2 dev $EXTIF2 metric $W2
elif [[ $LLS1 -eq 0 && $LLS2 -eq 0 ]]; then
echo [`date +%x.%X`] Toate conexiunile sunt UP. Rutele Default sunt active.
ip route del default
ip route del default
ip route add default via $GW1 dev $EXTIF1 metric $W1
ip route add default via $GW2 dev $EXTIF2 metric $W2
fi
fi
sleep $SLEEPTIME
done
Salvam scriptul de mai sus intr-un fisier ex: gwping.sh, il face executabil: chmod +x gwping.sh apoi il rulam: nohup gwping.sh &
4. Concluzia
Prin 2 scripturi simple se poate transforma un pc ieftin cu un sistem de operare gratuit intr-un router dual WAN destul de scump.

