Redundância de dois links de internet

Publicado por Roberto Costa (última atualização em 11/07/2013)

[ Hits: 21.108 ]

Homepage: www.asparion.com.br

Download 5826.redundancia.sh




Esse script tem por finalidade a redundância de dois links de internet, você usa o link1 com gateway padrão, se o link1 cair o link2 assume, ficando como gateway padrão, assim que o link1 voltar o script faz com que ele assuma novamente e tenha por padrão o link1.

Deve-se criar uma pasta no diretório /var/log ou onde você achar melhor para salvar os logs que serão criados. No meu caso:

# mkdir /var/log/reduncancia

Em seguida criar o arquivo de log:

# touch /var/log/redundancia/redundancia.log

Espero que ajude... Testado com sucesso no CentOS 5.9.

Abraços.

  



Esconder código-fonte

#!/bin/bash
# Observacoes
#
# Esse script prove de forma simples e eficiente uma redundancia entre
# dois links de internet (sem load balance), sendo um link principal e o outro de backup.
#
# Crie o arquivo com o nome que quiser, no nosso caso como redundancia.sh
# Torne-o um executavel com o comando chmod +x redundancia.sh
# Adicione a linha abaixo no crontab   crontab -e
# * * * * *   /etc/script/redundancia.sh

# Gateway ativo
# Esse comando vefirica qual o link esta como padrao, se o link tiver como padrao o GW1
# ele vai pingar no ip externo e se responde e porque o link esta normal e nao faz mais nada
export LC_ALL=C
export PATH=/bin:/usr/bin:/sbin:/usr/sbin

GWUP=`ip route show | grep ^default | cut -d " " -f 3`

# Gateway Principal
GW1=192.168.25.1; export GW1 # Substitua pelo gateway do seu link principal

# Gateway Slave
GW2=192.168.24.1; export GW2 # Substitua pelo gateway do seu link backup

# Etapa 1 = Verifica se o gateway e o principal, ser for ele vai pra etapa 2 se nao for ele vai pra etapa 2.1
if [ $GWUP == $GW1 ]; then

# Etapa 2 = Informa com log que a rota principal e o gateway 1 e vai para a etapa 6
   echo "`date` - Rota default e a Principal! Link 35 megas Gateway 192.168.25.1" >> /var/log/redundancia/redundancia.log

else

# Etapa 2.1 = Informa com log que a rota principal e o gateway 2 e vai para a etapa 3
   echo "`date` - Rota default e a Slave! Link 10 megas Gateway 192.168.24.1" >> /var/log/redundancia/redundancia.log

# Etapa 3 = Verifica a disponibilidade do link com gateway 1
   echo "`date` - Verificando a disponibilidade do link principal de 35 megas..." >> /var/log/redundancia/redundancia.log
   route add -net 0.0.0.0 gw $GW1
   ping -I eth1 200.160.2.3 -c 5 -A > /dev/null
   if [ $? -eq 0 ]; then

# Epata 4 = Se o gateway principal voltou ele exclui a rota do gateway 2 para manter o gatewy 1 ativo
      echo "`date` - Link pricipal voltou!" >> /var/log/redundancia/redundancia.log
      route del -net 0.0.0.0 gw $GW2
      exit 0

   else
# Etapa 5 = Agora se o gatewy principal nao voltou, ele deleta a rota o gatewy 1 e mantem a rota do gateway 2
      echo "`date` - Link principal ainda nao voltou..." >> /var/log/redundancia/redundancia.log
      echo "`date` - Link de backup sera mantido." >> /var/log/redundancia/redundancia.log
      route del -net 0.0.0.0 gw $GW1
      exit 0

   fi

fi

# Etapa 6 = Testando se o link principal com gateway 1 esta normal, se tiver ele vai pra etapa 7
echo "`date` - Testando Link Principal..." >> /var/log/redundancia/redundancia.log
ping -I eth1 200.160.2.3 -c 5 -A > /dev/null

if [ $? -eq 0 ]; then

# Etapa 7 = Diz que o link principal com gateway 1 esta normal e finaliza
   echo "`date` - Link Principal UP!" >> /var/log/redundancia/redundancia.log

else
# Etapa 8 = Diz que o link principal nao esta funcionado e deleta a rota do gateway um e adiciona rota ao gateway 2
   echo "`date` - Link Principal DOWN..." >> /var/log/redundancia/redundancia.log
   echo "`date` - Subindo Link de backup..." >> /var/log/redundancia/redundancia.log
   route del -net 0.0.0.0 gw $GW1
   ip route add default via $GW2

fi

Scripts recomendados

Status port

Firewall Iptables

Localizar e Matar Determinado Processo Pelo Nome

QOS com Iptables

Configuração do VNC Server no Display 0 (terminal que estiver na tela)


  

Comentários
[1] Comentário enviado por rafaelsteigleder em 08/11/2013 - 14:33h

oi tenho duas perguntas, no crontab, devo colocar o usuário SUDO (visto que estou aplicando em um ubuntu) ou posso deixar sem usuário mesmo??
e a outra é: Após colocado no crontab eu abro o meu redundancia.sh e escrevo estes scripts no arquivo e depois salvo e reincio o servidor correto?

[2] Comentário enviado por asparion em 08/11/2013 - 16:31h

No CentOS nao precisa colocar o usuario, agora no ubuntu nao tenho certeza nunca usei o ubuntu mas creio que deva colcoar o root ex:
voce noa tem nenhum script que ja esta rodando com o cron se tiver é a mesma coisa so colcoar o caminho. ou usar como abaixo.
01 * * * * root /etc/script/redundancia.sh. quanto a reiniciar nao precisa. criando o arquivo e tornando-o exucutavel ja vai funicionar..

[3] Comentário enviado por linux.cunha em 21/11/2013 - 11:36h

Parabenizo pelo script simples e objetivo aonde já o uso com sucesso, mas vou precisar em um cliente acrescentar mais dois links, como ficaria o script neste caso?

Abraços.

[4] Comentário enviado por lppbrito em 06/12/2013 - 12:54h

Bom dia, gostei do script
No meu caso, tenho dois link um ip fixo e outro ip dinâmico, como ficaria este script.


Na linha route del -net 0.0.0.0 gw $GW2 onde esta 0.0.0.0 eu coloco que ip ou fica assim mesmo ?

[5] Comentário enviado por asparion em 06/12/2013 - 14:00h

Boa tarde. Creio eu que sim porque ele somente vai mudar o gateway que o servidor vai usar como default

[6] Comentário enviado por asparion em 06/12/2013 - 14:01h

Na verdade esse scritp esta rodando em meu servidor assim mesmo, um link dinamico e outro fixo. entao nao muda nada.

[7] Comentário enviado por guitarrasolo em 10/12/2013 - 08:04h

esta vindo esse erro no meu
crontab: installing new crontab
"/tmp/crontab.5qwDZE/crontab":24:bad minute erros in crontab file, can´t install.
do you want to retry the some edit?

[8] Comentário enviado por guitarrasolo em 10/12/2013 - 08:05h

o que eu escrevo no redundancia.log?

[9] Comentário enviado por asparion em 10/12/2013 - 11:50h

voce nao escreve nada no redundancia.log pois la sera salvo as informaçoes que esta dentro dos echo " " informando o que esta acontecendo no script, se o link principal cair ele vai salvar o log dizendo a hora que link caiu e que subiu o link de backup

[10] Comentário enviado por cleitonsb em 10/12/2013 - 15:04h

Amigo, muito bom seu script, porém estou com algumas dúvidas.

Na configuração das interfaces de rede, eu preciso colocar algum gateway no link principal?
Precisa de alguma configuração no IPTABLES?

Estou com esse stript funcionando no meu servidor, porém quando o link principal cai, ele não chama o link backup.

Eu consultei a rota default com o comando ip route show | grep ^default | cut -d " " -f 3 e vieram dois gateways...

Grato pela ajuda.



[11] Comentário enviado por asparion em 10/12/2013 - 15:56h

nao precisa liberar nada no iptables.

de um route -n no seu servidor se tiver mais de um gateway padrao voce tem de deletar um e deixar somente o gateway principal.

exempo: a regra no script ta assim.
# Gateway Principal
GW1=192.168.25.1; export GW1 # <----- aqui voce coloca o gateway do seu link 1 ou seja o link principal

# Gateway Slave
GW2=192.168.24.1; export GW2 # <----- aqui voce coloca o gateway do seu link 2 ou seja o link de step

quando essa regra abaixo rodar.
if [ $GWUP == $GW1 ]; then

tem de ter apenas um gateway padrao. se tiver 2 o script nao vai funcionar.

se tiver o link 1 padrao e nao tiver funcionando ele vai pingar com esse comando
ping -I eth1 200.160.2.3 -c 5 -A > /dev/null

se pingar beleza ele continua assim e depois de um minuto vai rodar o script denovo

se nao tiver ok o link 1 ele vai rodar esses comandos
route del -net 0.0.0.0 gw $GW1
ip route add default via $GW2

ou seja deletando a rota do gateway 1 e colocando o 2 ta bem comentadinho rsrsrsrs

faz um teste ai

abrços

[12] Comentário enviado por cleitonsb em 10/12/2013 - 16:16h

Então mano, entendi.

Outra dúvida: Na linha 39 ao executar o comando route add -net 0.0.0.0 gw $GW1 o Servidor não vai ficar com 2 gateway?


[13] Comentário enviado por asparion em 10/12/2013 - 17:09h

nao, porque essa linha so sera executada se o link que estiver ativo for o link de backup ou seja o link 2
o script adiciona o link 1 e faz um ping, se nao pingar ele deleta novamente essa rota e deixa o link 2 continuando como principal

[14] Comentário enviado por cleitonsb em 10/12/2013 - 17:40h

Então devo estar com algum erro de configuração no meu server.

Exatamente nessa linha, o log do script para no "Verificando a disponibilidade do link principal de 35 megas..."

Então dou um route -n e aparece 2 gateway, e a net não funciona mais...

A interface que eu uso é a mesma do gateway, correto? Tipo:

eth1 - Principal
eth2 - Segundario

o ping quando estou utilizando o segundário (eth2), é na interface do principal (eth1), correto?




[15] Comentário enviado por fernandodenardin em 05/01/2014 - 22:23h

asparion.

Parabéns pelo script, usei ele e adaptei para meu servidor, rodando ele manualmente funcionou 100%.

Meu problema agora é, quando coloco na cron ele não funciona, coloquei ele para rodar como você falou e nada, coloquei ele para rodar de minuto x minuto seguindo o código abaixo:

*/1 * * * * /etc/script/redundancia.sh

... verifico o redundancia.log e nada escrito, o que significa que o script não rodou.

Você pode me ajudar com isso?

Desde já agradeço sua ajuda.

Fernando Denardin

[16] Comentário enviado por asparion em 06/01/2014 - 20:28h

Boa noite....
voce esta usando CentOS?
Tira essa barra ai no cron e deixo como esta abaixo:
01 * * * * /etc/script/redundancia.sh

[17] Comentário enviado por lafiera em 07/06/2014 - 19:49h

Opa. Acabei de testar num ambiente virtual: Centos 5.10 com 2 links de WAN, funcionou perfeitamente(pelo menos nos testes). Ai para funcionar o squid tive que fazer o masquerading para as duas interfaces(principal e backup), pois senao, quando ativar o link backup nao ira sair para a internet:


iptables -A INPUT -s 10.85.0.0/16 -p tcp --dport 80 -j REJECT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A PREROUTING -s 10.85.0.0/16 -p tcp --dport 80 -j REDIRECT --to-port 3128

no contrab fiz assim:

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
* * * * * root sh /etc/rc.d/scripts/redundancia.sh(de 1 em 1 minuto ele roda o script).


Obrigado Roberto Costa e a todos que contribuíram nesse script. Abraco.


[18] Comentário enviado por lafiera em 15/06/2014 - 23:37h

Depois de mais testes vi o seguinte: quando o link backup esta ativo..no teste para ver se o link principal voltou ele derruba a conexao..pois ele adiciona a rota do link principal pra testar o ping(ficando com duas rotas)..ai no momento desse teste a internet cai(nos clientes)..mesmo sendo por pouco tempo ocasiona problemas se houverem requisições ou mesmo resposta de requisições ja executadas.. alguém passou por isso?

Vi que o cleitonsb questionou la em cima sobre ficar com 2 gateways..e realmente ocorre, pois ele adiciona a rota do link principal para fazer o teste se o mesmo retornou, ai nesse momento ocorre queda do link para os clientes...

sera se nao há forma de testar sem ocasionar essa queda?

[19] Comentário enviado por ziasrodrigues em 17/06/2014 - 08:00h

bom dia, compartilho da dúvida do amigo Lafiera, o script esta funcionando mas fica esta questão de derrubar a internet pra testar o funcionamento do link principal.. de qq forma parabéns ao autor!

[20] Comentário enviado por eng_ividal em 20/06/2014 - 20:11h

Fiz pequenas alterações ficando dessa forma.
Não consegui utilizar a opção "ping -I" ela sempre gera erro.
Estava com dúvidas em relação as duas rotas mas fiz uns testes manualmente e o link passa a utilizar a ultima rota adicionada.

Caso alguem tenha alguma dúvida nas alterações abaixo estou à disposição.

GWUP=`ip route show | grep ^default | cut -d " " -f 3`

# Gateway Principal
GW1=172.20.1.29; export GW1 # Gateway Principal

# Gateway Slave
GW2=192.168.1.1; export GW2 # Gateway Secundário

# Etapa 1 = Verifica se GW1 está funcionando
if [ $GWUP == $GW1 ];
then
ping 8.8.8.8 -c 5 -A > /dev/null
if [ $? -eq 0 ];
then
echo "`date` - Net Virtua" >> /var/log/redundancia/redundancia.log
exit 0
else
# Link principal nao esta funcionado e deleta a rota do gateway um e adiciona rota ao gateway 2
echo "`date` - OI Velox" >> /var/log/redundancia/redundancia.log
route del -net 0.0.0.0 gw $GW1
ip route add default via $GW2
exit 0
fi
fi



# Etapa 2 = Com GW2 funcionando tenta retornar ao GW1
if [ $GWUP == $GW2 ]; then
route add -net 0.0.0.0 gw $GW1
ping 8.8.8.8 -c 5 -A > /dev/null
if [ $? -eq 0 ]; then
echo "`date` - Net Virtua" >> /var/log/redundancia/redundancia.log
route del -net 0.0.0.0 gw $GW2
exit 0
else
route del -net 0.0.0.0 gw $GW1
echo "`date` - OI Velox" >> /var/log/redundancia/redundancia.log
exit 0
fi
fi

[21] Comentário enviado por carlinhoscomp em 25/06/2014 - 11:14h

Bom dia!

As alterações do script do nosso amigo eng_ividal, me caiu muito bem!

Acabei fazendo algumas alterações no meu script tbm que ficou uma solução 100% no meu caso.

Eu criei 2 scripts de redundância.

O script 1(Executa de 1 em 1 min) verifica se o gw setado (gw1 ou gw2) tem internet, se está ok ele não faz nada simplesmente mantém a internet funcionando. Senão sobe o outro link.
Nos scripts acima ele sempre derruba a conexão Secundária para testar se a Principal voltou (Caso a Secundária está ativa). Para quem trabalha direto com a internet, não vai conseguir trabalhar com quedas em curto intervalo de tempo.
...
# Etapa 1 = Verifica se GW1 esta funcionando
if [ $GWUP == $GW1 ];then
ping www.google.com.br -c 5 -A > /dev/null
if [ $? -eq 0 ];then
echo "`date` - Net Virtua" >> /var/log/redundancia/redundancia.log
exit 0
else
# Link principal nao esta funcionado e deleta a rota do gateway um e adiciona rota ao gateway 2
route del -net 0.0.0.0 gw $GW1
route add -net 0.0.0.0 gw $GW2
#ip route add default via $GW2 esta linha foi comentada pois ele demora em torno de 40seg ativar a rede, a linha acima funciona perfeitamente sem perder tempo
echo "`date` - OI Velox" >> /var/log/redundancia/redundancia.log
exit 0
fi
fi


# Etapa 2 = Verifica se GW2 esta funcionando
if [ $GWUP == $GW2 ]; then
ping www.google.com.br -c 5 -A > /dev/null
if [ $? -eq 0 ]; then
echo "`date` - OI Velox" >> /var/log/redundancia/redundancia.log
exit 0
else
# Link Secundario nao esta funcionando e deleta a rota do gateway dois e adiciona rota ao gateway 1
route del -net 0.0.0.0 gw $GW2
route add -net 0.0.0.0 gw $GW1
#ip route add default via $GW1
echo "`date` - Net Virtua" >> /var/log/redundancia/redundancia.log
exit 0
fi
fi


Já o script 2 ele verifica se o Principal voltou (Eu configurei para verificar a cada 3 horas em horário comercial)

...
# Etapa 1 = Verifica se GW1 esta funcionando
if [ $GWUP == $GW1 ];then
ping www.google.com.br -c 5 -A > /dev/null
if [ $? -eq 0 ];then
echo "`date` - Net Virtua" >> /var/log/redundancia/redundancia.log
exit 0
else
# Link principal nao esta funcionado e deleta a rota do gateway um e adiciona rota ao gateway 2
route del -net 0.0.0.0 gw $GW1
ip route add default via $GW2
echo "`date` - OI Velox" >> /var/log/redundancia/redundancia.log
exit 0
fi
fi


# Etapa 2 = Com GW2 funcionando tenta retornar ao GW1
if [ $GWUP == $GW2 ]; then
route add -net 0.0.0.0 gw $GW1
ping www.google.com.br -c 5 -A > /dev/null
if [ $? -eq 0 ]; then
route del -net 0.0.0.0 gw $GW2
echo "`date` - Net Virtua" >> /var/log/redundancia/redundancia.log
exit 0
else
# Link Secundario nao esta funcionando e deleta a rota do gateway dois e adiciona rota ao gateway 1
route del -net 0.0.0.0 gw $GW1
echo "`date` - OI Velox" >> /var/log/redundancia/redundancia.log
exit 0
fi
fi


[22] Comentário enviado por edusite em 31/07/2014 - 18:04h

Ola amigos sou novo aqui, tenho interesse de usar este script mas tenho uma duvida em meu cliente são DOIs links dinâmicos o que eu coloco na variável gw1= e gw2 lá no inicio do script, levando em conta que os meus dois GW mudao de tempo em tempo

[23] Comentário enviado por asparion em 02/08/2014 - 10:07h

Bom dia...
Amigo edusite, o ips que vao no gw1 e gw2 sao os ips gateway dos modens, ele sao staticos. mesmo que seu link seja dinamico a ip para sua rede local sera statico.

[24] Comentário enviado por WagnerSPBH em 07/10/2014 - 03:29h

Amigos, estou com um problema, e não sei como resolver.

Tenho 3 links configurados em um Servidor Centos 5.10

Mas preciso que estes 3 links recebam conexões e possam navegar ao mesmo tempo. O Servidor não compartilha internet, é um Servidor Asterisk, então preciso que os 3 links estejam aptos para receber conexões, pois preciso dividir a carga entre links diferentes. Uma empresa se autentica pelo link 1, a outra pelo link 2, e outra pelo link 3. Consegui fazer a redundância funcionar até a queda do link 1, ele ativa o link 2, mas nunca volta para o link 1, pois o link não navega. E só consigo pingar de fora o link cujo o roteador é o Gateway do servidor. Os outros IPs não respondem a nada! Alguém pode me ajudar no que fazer?

[25] Comentário enviado por jmsb em 13/08/2015 - 18:55h


ola blz. o artigo e antigo mais me ajudou , eu tenho umas duvidas , o scripts ja ta rodando perfeito , mais como ele vai saber quando um dois link cair ,pos o script ta cron com agendamento
portanto ele so vai ser executado quando chegar o horário agendado , poderá me ajudar .

[26] Comentário enviado por Rafael.Schiavo em 04/11/2015 - 22:32h

Boa Noite Galera.
Primeiramente eu gostaria de reforçar a qualidade do artigo, muito bom mesmo, parabéns !

A minha dúvida esta com relação à variáveis:
1º) export LC_ALL=C
Esta variável serve para mudar as configurações regionais do computador para o padrão ANSI C ??

2º) export PATH=/bin:/usr/bin:/sbin:/usr/sbin
Pelo que eu entendo, define os diretórios de programas e a ordem de pesquisa.
Mas que programas?? este Script ou todos os programas do SO ??

Pelo que eu entendi, estas duas variáveis dão uma espécie de reset no SO, é isso ??

Obrigado.

[27] Comentário enviado por rodrigocontrib em 19/11/2018 - 22:21h


[26] Comentário enviado por Rafael.Schiavo em 04/11/2015 - 22:32h

Boa Noite Galera.
Primeiramente eu gostaria de reforçar a qualidade do artigo, muito bom mesmo, parabéns !

A minha dúvida esta com relação à variáveis:
1º) export LC_ALL=C
Esta variável serve para mudar as configurações regionais do computador para o padrão ANSI C ??

2º) export PATH=/bin:/usr/bin:/sbin:/usr/sbin
Pelo que eu entendo, define os diretórios de programas e a ordem de pesquisa.
Mas que programas?? este Script ou todos os programas do SO ??

Pelo que eu entendi, estas duas variáveis dão uma espécie de reset no SO, é isso ??

Obrigado.



Sobre essa variavel de ambiente:
"LC_ALL=C" servirá para o stdout dos comandos seja em ingles, e não em idioma local.

Sobre a variavel de ambiente PATH:
Essa outra variavel de ambiete "PATH" serve para a instancia do bash buscar os locais onde os programas estão.Isso serve porque
em algumas distribuições ou versões de distribuições, a variavel path não tem setada todo este caminho que é onde, normalmente, esses programas se encontram.Se, por exemplo, você compilar o programa utilitario "ip" em outro diretório, pode seta-lo nessa variavel.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts