segunda-feira, 2 de janeiro de 2012

Contingencia com 2 links de Internet

Esse script é bem legal, a principio ele resolve o problema do acesso a internet com 2 links.
Lembrando que não faz balanceamento. seria um modelo active\standby. estamos falando de contingencia qualquer um dos 2 links pode segurar a onda sem depender do outro. lembre-se de contratar os provedores diferentes com terminações diferentes para lugares diferentes.

Exemplo:
LinkA - Fibra - Leste
LinkB - Antena - Sul

Se você só precisa que seus usuários acessem a internet o script já resolve tudo!
mas se precisar ser acessado (website,servidor de email, etc...) existem as opções:
1. Usar 2 servidores de DNS primários um em cada link, que resolvem o nome de acordo com o link que estão alocados.
2. Utilizar um provedor que venda link duplo com terminações distintas.
3. Se tornar um AS com BGP



LINKA = ip do link primario de internet
LINKB = ip do link reserva de internet
RTA=roteador do link primário
RTB=roteador do link secundario
LAN = rede local
mailserver=seu servidor de email
emaildosuporte=email da equipe de suporte

#!/bin/bash
N=`iptables -t nat -nL --line-numbers | grep SNAT| grep LAN | awk {'print $1'}`
DATA=`date`
STATUS=`cat /tmp/internet.status`
echo $N
echo $STATUS
echo $DATA
ping -w 5 -c 1 -I LINKA www.google.com
if [ $? -eq 0 ];then
echo "tudo ok nada a fazer"
if [ $STATUS -eq 1 ];then
echo "LINKA Reativando"
iptables -t nat -R POSTROUTING $N -s LAN -d 0/0 -j SNAT --to LINKA
route delete default gw RTB
route add default gw RTA
echo -n "SUBIU " >> /tmp/caiu.log
echo $DATA >> /tmp/caiu.log
echo 0 > /tmp/internet.status
else
echo "nada a fazer"
fi
else
echo "nao ok virando para LINKB"
iptables -t nat -R POSTROUTING $N -s LAN -d 0/0 -j SNAT --to LINKB
route delete default gw RTA
route add default gw RTB
echo -n "CAIU " >> /tmp/caiu.log
echo $DATA >> /tmp/caiu.log
echo 1 > /tmp/internet.status
(:
echo 'HELO mailserver';sleep 1
echo 'mail From: emaildosuporte';sleep 1
echo 'rcpt To: emaildosuporte';sleep 1
echo 'data';sleep 1
echo 'subject: ' "Atençao Problemas no Link A";sleep 1
echo 'Sender: emaildosuporte';sleep 1
echo 'To: emaildosuporte';sleep 1
echo '';sleep 1
echo "O Link A está fora! "
echo '.';sleep 1
echo 'quit' ;) | nc mailserver 25
fi
#

5 comentários:

  1. Leandro, você já implementou algo como dois links e um http server, sendo que ele responde por dois ips distintos ?
    Abraço.

    ResponderExcluir
    Respostas
    1. sim nesse caso deve-se usar 2 instancias de DNS em master, uma vai responder o httpserver para o ip do linkA, e a outra para o ip do linkB.

      No firewall ao invez de usar o prerouting use o rinetd
      aaa.aaa.aaa.aaa 80 httpserver 80
      bbb.bbb.bbb.bbb 80 httpserver 80

      pode ser no mesmo firewall ou em firewalls distintos

      Excluir
  2. Olá, gostei muito do seu script, mais por ainda ser novato no mundo linux fiquei com algumas duvidas:
    Tenho um servidor com duas placas de rede (eth0 e eth1) conectada a internet e uma placa para rede (eth2) interna.
    Nesse servidor tenho instalado o servidor DHCP, Squid e Samba 4, sendo que até o momento, os usuários da rede interne só consegue conectar a internet pela conexão eth0, e quando a conexão de internet cai nessa rede, altero manualmente para conexão de internet eth1.
    O que eu quero é:
    1-Que a troca entre a conexão eth0 e eth1 seja feita automaticamente.
    2-Que quando a conexão principal eth0, voltar a funcionar, que os usuários da rede interna, volte automaticamente a usar essa conexão.

    Poderia me ajudar a adaptar o seu link para minha necessidade, e como faço para iniciar o seu link, na inicialização do servidor.
    Antecipadamente agradeço!
    Contato WhatsApp (88) 99965-2625

    ResponderExcluir
  3. o script vc coloca no crontab para ele rodar uma vez por minuto.
    * * * * * /root/script.sh

    o script já faz a ida e volta, e deixa tudo documentado no arquivo /tmp/caiu.log vc só teria que colocar o ip da eth0 nos lugares que está LINKA, o roteador da eth0 no lugar de RTA, o ip da eth1 nos lugares que está LINKB, o roteador da eth1 no lugar de RTB, e usar uma regra de snat no padrao do script "iptables -t nat -R POSTROUTING -s LAN -d 0/0 -j SNAT --to LINKA" (onde LAN a rede local)... se estiver usando um MASQUERADE talvez nem precise comutar a regra...

    ou melhor de uma olhada nos comandos que ele executa de acordo com as situações, e compare com o que vc já executa manualmente para ajustar.

    ResponderExcluir