Redundância de links dedicados

Publicado por Rodrigo Garcia (última atualização em 23/01/2013)

[ Hits: 13.537 ]

Homepage: www.unix4life.blogspot.com

Download redundancia2.sh

Download redundancia4.sh (versão 2)

Download redundancia.sh (versão 3)




Eu não gosto de pegar as coisas prontas na Internet. Devem ter milhares de scripts que fazem redundância de links por aí, mas eu gosto de criar os meus. No máximo busco informações sobre comandos ou coisas do tipo. Esse script foi criado a partir da necessidade de haver redundância entre os links dedicados que interligam as unidades da empresa em que eu trabalho. Sei que existem muitas formas de se fazer isso, talvez até mais fáceis, mas essa foi a minha maneira.

Esse script trabalha o shell e o "awk", e utiliza basicamente os comandos ping e route para controlar os links. Ele captura a rota padrão atual e compara com a variável do gw primário, se ambos forem idênticos, então ele testa os ips de teste pre definidos no próprio script.

Caso haja resposta do primeiro ip de teste, ele simplesmente não faz mais nada. Caso não haja, ele faz o teste com o segundo ip. Se esse também não responder, ele troca o gateway padrão para o gateway secundário, conforme é demonstrado no função "GATEWAY()", e gera uma saída para o arquivo "gateway.log". Além de trocar o gateway padrão, ele troca todas as rotas que saem pelo gateway primário para saírem pelo gateway secundário e vice-versa.

Se no momento da comparação do gateway atual com o gateway primário eles não forem idênticos, então ele vai comparar o gateway atual com o secundário e o processo continua o mesmo. Daí é necessário agendar a execução do script para que a verificação seja contínua e automatizada.

Espero que gostem e que seja bem útil!

  



Versões atualizadas deste script

Versão 2 - Enviado por Rodrigo Garcia em 09/01/2013

Changelog: Testa agora apenas o link principal, caso não esteja respondendo ele muda para o segundo. Quando o link principal volta a responder, o script volta para ele.

Download redundancia4.sh


Versão 3 - Enviado por Rodrigo Garcia em 16/01/2013

Changelog: Nessa versão, o script testa apenas o link principal, se ele não estiver ativo a troca é feita. Quando o link principal voltar, o script troca novamente para ele.

Download redundancia.sh


Esconder código-fonte

#!/bin/bash
# Script de redundancia de links NipCable e Vivo
# Desenvolvido por Rodrigo Manzzato Alves Garcia em 08/10/2012
PATH=/sbin:/usr/sbin:/bin:/usr/bin
# Informe abaixo o gateway primario
GW_PRIMARIO=""
# Informe abaixo os IPs de teste do gateway primario
IP_TESTE_PRIMARIO1=""
IP_TESTE_PRIMARIO2=""
# Informe abaixo o gateway secundario
GW_SECUNDARIO=""
# Informe abaixo os IPs de teste do gateway secundario
IP_TESTE_SECUNDARIO1=""
IP_TESTE_SECUNDARIO2=""

# Armazenar gateway padrao na variavel GW_ATUAL
GW_ATUAL=`netstat -nr | awk '$1 ~ /^[0.0.0.0]/ {print $2}'`

# ATENCAO!!! A secao abaixo so deve ser alterada com absoluta certeza de que sabe o que esta fazendo!!!

# Funcao para troca do gateway
function GATEWAY()
{
        netstat -nr | awk -v gw2="$GW2" -v gw="$GW" 'NR >= 2 {if ($2 == gw2) print "route add -net " $1 FS "netmask " $3 " gw " gw > "/etc/network/gateway";}'
        netstat -nr | awk -v gw2="$GW2" 'NR >= 3 {if ($2 == gw2) print "route del -net " $1 FS "netmask " $3 " gw " gw2 > "/etc/network/gateway_del";}'
   while read ROTA2
        do
                echo -e "`$ROTA2`"
        done < /etc/network/gateway_del
   while read ROTA
        do
                echo -e "`$ROTA`"
        done < /etc/network/gateway
}

# Backup das rotas existentes
echo "#!/bin/bash" > /etc/network/rotas.sh
echo "# Rotas Atuais coletadas pelo /etc/init.d/roteamento.sh" >> /etc/network/rotas.sh
netstat -nr | awk 'length($2) > 7' | awk 'NR > 2 {print "route add -net " $1 FS "netmask " $3 " gw " $2}' >> /etc/network/rotas.sh

# Teste das redes
if [ $GW_ATUAL = $GW_PRIMARIO ]
   then
      ping -c4 $IP_TESTE_PRIMARIO1 >> /dev/null
      if [ $? = "0" ]
         then   
            echo `date` "Rede Primaria OK" >> /etc/network/gateway.log
         else   
            ping -c4 $IP_TESTE_PRIMARIO2 >> /dev/null
            if [ $? = "0" ]
               then   
                  echo `date` "Rede Primaria OK" >> /etc/network/gateway.log
               else   # Troca de Gateway   
                  GW=$GW_SECUNDARIO
                  GW2=$GW_PRIMARIO
                  GATEWAY
                  echo `date` "Rede Secundaria Ativada" >> /etc/network/gateway.log
                  exit
            fi
      fi
   elif [ $GW_ATUAL = $GW_SECUNDARIO ]; then   
      ping -c4 $IP_TESTE_SECUNDARIO1 >> /dev/null
      if [ $? = "0" ]
         then   
            echo `date` "Rede Secundaria OK" >> /etc/network/gateway.log
         else   
            ping -c4 $IP_TESTE_SECUNDARIO2 >> /dev/null
            if [ $? = "0" ]
               then   
                  echo `date` "Rede Secundaria OK" >> /etc/network/gateway.log
               else   # Troca de Gateway
                  GW=$GW_PRIMARIO
                  GW2=$GW_SECUNDARIO
                  GATEWAY
                  echo `date` "Rede Primaria Ativada" >> /etc/network/gateway.log
                  exit
            fi
      fi
fi

Scripts recomendados

Barra de progresso em Dialog

Data e Hora (Observatório Nacional) usando o "Lynx"

diario

SquidAdmin

Script para enviar put para uma API usando curl e dados no formato json


  

Comentários
[1] Comentário enviado por Neo_X em 08/01/2013 - 12:22h

Olá Rodrigo, tudo bem? Muito bom o artigo, estou seguindo-o e queria saber se o arquivo /etc/network/rotas.sh é criado automático ou tem que ser manual?

Rodei o exec. /redundancia2.sh:

Output from command /etc/redundancia/redundancia2.sh ..
/etc/redundancia/redundancia2.sh: line 37: /etc/network/rotas.sh: No such file or directory
/etc/redundancia/redundancia2.sh: line 38: /etc/network/rotas.sh: No such file or directory
/etc/redundancia/redundancia2.sh: line 39: /etc/network/rotas.sh: No such file or directory

Utilizo o CentOS 5.8

[2] Comentário enviado por r.garcia em 09/01/2013 - 08:54h


[1] Comentário enviado por pedrophsp em 08/01/2013 - 12:22h:

Olá Rodrigo, tudo bem? Muito bom o artigo, estou seguindo-o e queria saber se o arquivo /etc/network/rotas.sh é criado automático ou tem que ser manual?

Rodei o exec. /redundancia2.sh:

Output from command /etc/redundancia/redundancia2.sh ..
/etc/redundancia/redundancia2.sh: line 37: /etc/network/rotas.sh: No such file or directory
/etc/redundancia/redundancia2.sh: line 38: /etc/network/rotas.sh: No such file or directory
/etc/redundancia/redundancia2.sh: line 39: /etc/network/rotas.sh: No such file or directory

Utilizo o CentOS 5.8


O arquivo /etc/network/rotas.sh é criado automaticamente e sobrescrito sempre que o script é executado. No CentOS não existe o diretório /etc/network, pois ele utiliza outra estrutura de diretórios. Você pode alterar o script nas linhas 38 e 39 para ao invés de criar o rotas.sh no diretório original, ele ser criado em um diretório de sua preferência (esse é o espirito Free Software e Open Source).

Estarei enviando em breve uma nova versão que testa sempre o link principal, que se estiver fora ele faz a troca para o secundário. Após a troca ele continua pingando o principal, qe quando voltar, ele troca novamente.

[3] Comentário enviado por mtllc22 em 09/01/2013 - 15:50h

valeu pelo script

[4] Comentário enviado por jetkid em 23/01/2013 - 22:41h

Boa noite!

Vc tem ideia de como ficaria para dois links adsl?

Obrigado!

[5] Comentário enviado por Neo_X em 05/02/2013 - 17:47h

Muito bom o script, porém como eu tenho dois links (Telefonica e ALGAR). Quando o link da ALGAR - Rede Secundária Ativada - todos os acessos de clientes da Telefônica não conseguem acessam meu firewall.

Se o link fica na Rede Primária, todos conseguem acessar ou pingar os IPs da Telefonica que estão no meu firewall, menos os IPs da ALGAR, a interface não responde.

Se o link fica na Rede Secundária, todos acessam os IPs da ALGAR, inclusive da Telefonica, porém clientes que tem link da mesma operadora (Telefonica/Speed) não acessam.

Se puder me ajudar agradeço, estou há 3 dias tentando desvendar isso.


Tue Feb 5 17:06:14 BRST 2013 Rede Primaria Ativada
Tue Feb 5 17:07:04 BRST 2013 Rede Primaria OK
Tue Feb 5 17:12:04 BRST 2013 Rede Primaria OK
Tue Feb 5 17:13:01 BRST 2013 Rede Secundaria Ativada

[6] Comentário enviado por r.garcia em 05/02/2013 - 22:10h

Bom, o script é para LPs de dados entre unidades, mas me explique melhor seu ambiente, talvez possamos encontrar juntos a solução...

www.unix4life.blogspot.com

[7] Comentário enviado por luques em 22/02/2013 - 15:36h

Quando o link Principal voltar, ele volta para o link principal?

[8] Comentário enviado por r.garcia em 22/02/2013 - 22:14h


[7] Comentário enviado por luques em 22/02/2013 - 15:36h:

Quando o link Principal voltar, ele volta para o link principal?


Sim, ele testa sempre o link principal por padrão (de acordo com o agendamento no Cron que deve ser feito por você). Quando o principal volta, ele automaticamente chaveia novamente para o principal.

[9] Comentário enviado por Neo_X em 08/03/2013 - 16:53h

Rodrigo, pode me ajudar? O meu segundo link é adsl (ppoe). Neste caso não dá né...

[10] Comentário enviado por r.garcia em 09/03/2013 - 19:49h


[9] Comentário enviado por Neo_X em 08/03/2013 - 16:53h:

Rodrigo, pode me ajudar? O meu segundo link é adsl (ppoe). Neste caso não dá né...


Até dá... mas PPPoE trabalha de forma dinâmica, e i script deveria ser alterado de acordo...

[11] Comentário enviado por Neo_X em 18/03/2013 - 12:32h

Olá Rodrigo, Sobre a minha dúvida referente a conexão PPoE. Configurei o modem para discar automático e coloquei um IP na LAN - 192.168.0.100. Este IP coloquei na DMZ do modem e inseri na interface eth2 do Linux. Como o meu link primário o IP é fixo, configurei seu script para ficar testando o link principal. O script não funcionou adequadamente, pois não ficava estável. Diante disso fiz um teste sem rodar o script. Eth1 link principal e o Eth2 (PPoE com o IP fixo 192.168.0.100). Deixei os dois links conectados no CentOS, e o gateway padrão ficou a eth1. Quando desliguei a eth1, o eth2 assumiu a conexão e funcionou tudo, até a VPN. Quando retornou o link da eth1, a conexão voltou para a eth1. Neste caso não usei nenhum scrip para testar a conexão.

Como você disse (Script para testar links dedicados IP Fixo), em um outro ambiente que tenho com IP Fixo (LP) o script funciona normalmente.
Estou postando para tirar futuras dúvidas que alguém que tem esse ambiente (PPoE)

Abraço.

[12] Comentário enviado por dgnonline em 21/06/2013 - 16:08h

Rodrigo Garcia parabéns pelo artigo !!! funciona 100%

[13] Comentário enviado por mcaxambu em 22/06/2013 - 00:03h

onde esta o arquivo roteamento.sh que nao achei

[14] Comentário enviado por lppbrito em 04/12/2013 - 16:32h

01 No campo do script GW_PRIMARIO, só que no meu caso eu uso link da net dinâmico como posso esta preenchendo esta campo
o segundo link que tenho já é estático.

No script, campo /etc/init.d/roteamento.sh este arquivo (roteamento.sh) ele cria automático ?

[15] Comentário enviado por marcusmendes em 26/04/2014 - 09:21h


[14] Comentário enviado por lppbrito em 04/12/2013 - 16:32h:

01 No campo do script GW_PRIMARIO, só que no meu caso eu uso link da net dinâmico como posso esta preenchendo esta campo
o segundo link que tenho já é estático.


Se a sua internet é dinâmica você provavelmente tem uma conexão "ppp", para pegar o "gateway" que seria a máquina destino onde você conecta,
tente usar esse comando, eu fiz aqui e se tornou muito funcional:

ifconfig >ppp0< | awk '/P-a-P:/{print $4}'| cut -d: -f2

Substituindo o >ppp0< pela sua conexão ppp (Exemplo: ppp0, ppp1, ppp2, etc...).

Abraço

[16] Comentário enviado por l1p3 em 20/10/2014 - 09:45h

Parabéns pelo seus scripts:

Rodrigo eu tenho uma dúvida à cerca dos mesmos.

Por exemplo tenho 2 placas de redes etho(internet) eth1(interna) ambas configuradas no firewall, supostamente a empresa aderiu a mais um link dedicado adicionei mais uma placa no servidor eth2(link_backup) e configurei conforme IP da prestadora.
Preciso alterar a configuração no firewall para o correto funcionamento desse script?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts