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.
#!/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
[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?
[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?
[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
[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
[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
[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.
[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:
[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.
# 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 ??
[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.