Troca de link em caso de queda de Internet (FAILOVER)

Publicado por Marcello Carvalho (última atualização em 09/08/2016)

[ Hits: 6.632 ]

Download 6438.failover.sh

Download 1469052792.failover.sh (versão 2)




Um simples script para troca de gateway de um firewall com duas wans em caso de queda do link ativo.

Adcione uma regra ao cron da seguinte forma:

*/1 * * * * /home/script/failover.sh

No meu caso meu script é executado a cada minuto e esta localizado dentro da pasta HOME.

  



Versões atualizadas deste script

Versão 2 - Enviado por Marcello Carvalho em 20/07/2016

Changelog: Adicionado
- Função que gera um script auxiliar para voltar para o Gateway principal quando este estiver ON novamente
Retirados
- LOG de monitoramento de testes

Download 1469052792.failover.sh


Esconder código-fonte

#!/bin/bash

Link1="192.168.0.1"
Link2="192.168.10.1"
Ver1="8.8.8.8"
Ver2="8.8.4.4"
arquivoLog='failover.log'
pastaLog='/var/log/failover/'
dataAtual=$(date | awk '{print $1, $2, $3, $4}')


function Verifica(){
   ping=$(ping -c 3 $1 | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
}

function getGateway(){
        #Identifica o Gateway Default do servidor
        gateway=$(/usr/sbin/route -n | grep UG | grep 0.0.0.0 | awk '{print $2}');
}

function setGatway(){
        #Deleta Gateway Default
        /usr/sbin/route del default gw $oGateway >> /home/script/LOG
        #Seta novo Gateway Default
        /usr/sbin/route add default gw $nGateway  >> /home/script/LOG
}

function down(){
   #verifica se ja existem rotas definidas para os Verificadores
   tVer1=$( /usr/sbin/route -n | grep $Ver1 | awk '{ print $1}' )
   tVer2=$( /usr/sbin/route -n | grep $Ver2 | awk '{ print $1}' )
   #Teste se a rota ja existe para não tentar criar duas vezes   
   if [ -z $tVer1 ]; then
      /usr/sbin/route add -net $Ver1 netmask 255.255.255.255 gw $Link1  >> /home/script/LOG
   fi

   if [ -z $tVer2 ]; then
      /usr/sbin/route add -net $Ver2 netmask 255.255.255.255 gw $Link2  >> /home/script/LOG
   fi

      getGateway
      case $gateway in
            "$Link1")
                Verifica $Ver1 $gateway  >> /home/script/LOG
                oGateway=$(echo $Link1)
                nGateway=$(echo $Link2);;
            "$Link2")
                Verifica $Ver2 $gateway  >> /home/script/LOG
                oGateway=$(echo $Link2)
                nGateway=$(echo $Link1);;
      esac

            if [ $ping -gt 0 ]; then
              echo "$dataAtual Conexão válida com a internet através do GW: $gateway" >> $pastaLog$arquivoLog #Caso não queira o log deste registro basta alterar a saida para "> /dev/null" 
            else
              if [ -d $pastaLog ]; then
                echo "$dataAtual Gateway Atual: $gateway sem conexão com a internet, mudando para o gateway: $nGateway" >> $pastaLog$arquivoLog  
              else
                mkdir $pastaLog
                echo "$dataAtual Gateway Atual: $gateway sem conexão com a internet, mudando para o gateway: $nGateway" >> $pastaLog$arquivoLog
              fi
            echo "Falha em obter conectividade com a internet através do GW: $gateway"
            echo "Alternando link"
            setGatway
          fi

        }

down

Scripts recomendados

Criando Autoridades Certificadoras e Certificados de Testes no Linux

Backup

speedy.sh - Wget no popup do speedy home :-)

epona-1.4.14

Bloquear Facebook no Linux Educacional 3


  

Comentários
[1] Comentário enviado por jaac em 22/08/2016 - 17:02h

Excelente ideia!
Vou testar aqui em minha rede. Será de uma utilidade tremenda!

[2] Comentário enviado por cloudnet em 24/03/2018 - 18:06h

Olá boa tarde
Pessoal tento executar e da erro, estou usando o debian 9

if [ $ping -gt 0 ]; then Ele sai disparando erro até o fim do arquivo.
Alguém usou de outra forma .

[3] Comentário enviado por mbrunoac em 17/06/2021 - 11:50h


[2] Comentário enviado por cloudnet em 24/03/2018 - 18:06h

Olá boa tarde
Pessoal tento executar e da erro, estou usando o debian 9

if [ $ping -gt 0 ]; then Ele sai disparando erro até o fim do arquivo.
Alguém usou de outra forma .


Altere a variável $ping ficando da seguinte forma - ping=$(ping -c 3 -w 3 $1 | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts