LoadbalanceFAILOVER

Publicado por Marcelo Viana (última atualização em 27/03/2012)

[ Hits: 5.481 ]

Homepage: infSite.org

Download loadbalanceFAILOVER.sh




Loadbalance FAILOVER:
Em um servidor com dois links de Internet, este script atuará no gerenciamento dos links. Caso o link que estiver ativo no momento, apresente erro (ou perda de conexão com a Internet por algum motivo), o script mudará o tráfego automaticamente para outro link existente. E se os dois links apresentarem problemas, então o script tenta uma reparação, restartando a rede e setando novamente as configurações: variáveis, limpeza de tabelas (iptables), roteamento, NAT e gateways.

Obs.: É extremamente importante que cada gateway esteja configurado de acordo com sua interface nas VARIÁVEIS ("iface1" de acordo com "gw1" e "iface2" de acordo com "gw2") do script, para que o route trate corretamente as saídas.

Exemplo:  
  iface1=eth0 (interface)
  gw1="10.26.20.1" (gateway)

  iface2=eth1 (interface)
  gw2="10.15.20.1" (gateway)

  



Esconder código-fonte

#!/bin/bash
 
  ### CONFIGURE AS VARIÁVEIS AQUI:
  testeip="8.8.8.8"
  iface1=eth0
  iface2=eth1
  gw1="10.26.20.1"
  gw2="10.15.20.1"
  nomeGw1="CTBC"
  nomeGw2="EMBRATEL"
  ### FIM DA CONFIG.
  rota1=0
  rota2=0
  nomeScript="loadbalanceFAILOVER.sh"

iniciar(){
  ### LIMPEZA:
  iptables -t mangle -F
  iptables -t mangle -X
  iptables --flush
  iptables -F
  iptables -t nat -F
  iptables -X
  iptables -t nat -X
  ip route flush cache
  ### HABILITA ROTEAMENTO:
  echo "1" > /proc/sys/net/ipv4/ip_forward
  ### MASCARA OS PACOTES COM DESTINO A INTERNET (NAT):
  iptables -t nat -A POSTROUTING -o $iface1 -j MASQUERADE
  iptables -t nat -A POSTROUTING -o $iface2 -j MASQUERADE
  ### ADICIONA OS GATEWAYS NAS DEVIDAS INTERFACES:
  route add -net default gw $gw1 dev $iface1
  route add -net default gw $gw2 dev $iface2

### LINK 1 ATIVO
clear
echo "Link em atividade: $nomeGw1"
echo "Interface:$iface1"
echo "Gateway:$gw1"
echo "Status: Ok"
while [ $(ping -qc 3 $testeip -I $iface1 > /dev/null 2>&1 ; echo $? ) = 0 ]
  do
  if [ $rota1 = 0 ]
  then
  rota1=1
  route del -net default gw $gw2 dev $iface2
  fi
done

route add -net default gw $gw2 dev $iface2

### LINK 2 ATIVO
clear
echo "Link em atividade: $nomeGw2"
echo "Interface:$iface2"
echo "Gateway:$gw2"
echo "Status: Ok"
while [ $(ping -qc 3 $testeip -I $iface2 > /dev/null 2>&1 ; echo $? ) = 0 ]
  do
  if [ $rota2 = 0 ]
  then
  rota2=1
  route del -net default gw $gw1 dev $iface1
  fi
  done

### Se os links estiverem 'down', tenta uma reparação restartando a rede e chamando novamente o script:
if [ $(ping -qc 3 $testeip -I $iface1 > /dev/null 2>&1 ; echo $? ) != 0 ] || [ $(ping -qc 3 $testeip -I $iface2 > /dev/null 2>&1 ; echo $? ) != 0 ]
  then
  clear
  echo "Sem conexao!"
  echo "Tentando reparar..."
  /etc/init.d/networking stop
  /etc/init.d/networking start
  iniciar
fi
}
parar(){
kill -9 `ps aux | grep $nomeScript | awk '{print $2}'`
echo "Morto"
exit
}
helpp(){
echo "Para executar o script, usa-se a seguinte sintaxe:"
echo " "
echo "Iniciar:"
echo "sh $nomeScript start"
echo "Parar:"
echo "sh $nomeScript stop"
echo "Rodar em modo background:"
echo "sh $nomeScript start &"
echo "Após rodar em background, verifique se está rodando:"
echo "ps aux | grep $nomeScript"
echo "Obs.: Não esquecer de configurar as VARIÁVEIS  do script de acordo com sua rede."
echo " "
echo "Desenvolvido por: Marcelo Viana"
echo " "
exit
}
case $1 in
'start') iniciar ; exit ;;
'stop') parar ; exit ;;
'--help') helpp ; exit ;;
*) echo "Parâmetro desconhecido: '$1'" ; echo "Utilize --help para informações. Exemplo: sh $nomeScript --help"; exit ;;
esac
# É o Senhor que mostra os caminhos. Agradeço por me ajudar através de tantos exemplos.
# E que bom existe o vivaolinux!
# www.technocristo.com

Scripts recomendados

Simple AdAway para Android

Criação de servidores de arquivos simples com Samba

mountcp1.sh

Diferença entre datas

Script para renomear arquivos


  

Comentários
[1] Comentário enviado por tadeuef em 06/06/2012 - 19:57h

poxa marcelo muito legal este script estou procurando uma solução de load balance e quero que caso um link meu caia outro assume creio que esse script vai me ajudar muito pois sou iniciante em linux e por favor neste script eu nao estou indicando a minha saida para a rede local e assim mesmo ou esta configuração entra em outro local pois terei 3 placas de rede no meu srv duas com meus dois links ip fixo e outra minha rede local correto grato cara um abraço

[2] Comentário enviado por marceloviana em 07/06/2012 - 03:38h

Tadeuef, paz!
Espero que seja muito útil pra você este script.
Então, respondendo sobre sua dúvida, você não precisa especificar a rede local para o script. Ao chegar a requisição de sua rede local o script 'diz' para seu firewall(ou gateway) que haverá um roteamento (NAT) dos pacotes, por isso não é necessário especificar a rede local. Mas, tem que prestar bastante atenção em configurar corretamente as interfaces de saída de acordo com os gateways, como mostra o exemplo na descrição do script.
No mais, não tem mistério, ele é bem simples de usar. bom proveito!
Que o Senhor te acompanhe, fique em paz.

[3] Comentário enviado por marceloviana em 07/06/2012 - 03:45h

Se precisar, segue um exemplo para configuração do arquivo "interfaces":


Link1 (Internet)
auto eth0
iface eth0 inet static
address 201.99.91.10
netmask 255.255.255.240
broadcast 201.99.91.15
gateway 201.99.91.1

Link2 (Internet)
auto eth1
iface eth1 inet static
address 200.99.91.126
netmask 255.255.255.128
broadcast 200.99.91.127
gateway 200.99.91.1

Link3 (rede local)
auto eth2
iface eth2 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255

[4] Comentário enviado por tadeuef em 07/06/2012 - 10:37h

marcelo muito obrigado pela atenção e por me responder essa mesmo que era minha duvida valeu cara um abraço.

[5] Comentário enviado por marceloviana em 22/09/2013 - 00:00h

Em resposta a uma dúvida do net4fun:
"...gostaria que se possivel você analisa-se a situação da minha rede e me dissesse se o seu script pode ser utilizado para o meu objetivo sendo que eu utilizo o debian 7.1, o qual já esta instalado e configurado com: servidor dhcp, bind9, e ssh tudo funcionando, porem o mesmo esta navegando através de um link vivo speedy de 8mb ip dinâmico c/ modem roteado, e ainda me resta um outro link igual que esta sendo usado para as outras maquinas..."

RESPOSTA:
A respeito de sua mensagem, te recomendo fortemente usar como firewall o sistema pfSense (http://pfsense.org). Ele é gerenciado pelo browser e vem com uma gama de recursos de infra-estrutura, por exemplo LOADBALANCE COM FAILOUVER, alem de: DHCP, DNS, PROXY, Captive Portal (para WiFi), controle de banda e muitos outros recursos. Um detalhe é que o pfSense é pequeno (imagem em torno de 150MB) e leve, isso possibilita rodar até em uma máquina com hardware limitado.
Ou, se preferir se aventurar com o servidor que está montando e usar o Script que escrevi (http://www.vivaolinux.com.br/script/LoadbalanceFAILOVER), também é uma boa alternativa, a vantagem é que você vai adquirir bastante conhecimento neste processo, o que é ótimo, Segue a dica:
Para usar o Script no seu gateway, simplesmente altere as seguintes variáveis no Script:

testeip="8.8.8.8" # ip para testar os links
iface1=eth0 # Interface do link 1 de Internet.
iface2=eth1 # Interface do link 2 de Internet.
gw1="10.26.20.1" # IP do gateway do link 1 de Internet.
gw2="10.15.20.1" # IP do gateway do link 2 de Internet.
nomeGw1="CTBC" # Nome do link 1 de Internet.
nomeGw2="EMBRATEL" # Nome do link 2 de Internet.

De permissão para execução no script:
# chmod +x loadbalanceFAILOVER.sh


Rode o Script com seguinte comando:
# sh loadbalanceFAILOVER.sh start


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts