Script Internet Redundante - FALHA

1. Script Internet Redundante - FALHA

Igor Valsichi
IgorOV

(usa Debian)

Enviado em 20/11/2012 - 08:37h

Pessoal, baseado em varios posts de forum montei um script pra tornar a internet da empresa redundante, mas tem acontecido alguma coisa errada.

Na empresa temos o seguinte:

1 Debian
1 Link 20 megas IP Dinamico VIRTUA (dhcp) (eth2)
1 Link 15 megas IP Fixo SPEEDY FIBRA (pppoe) (ppp0/eth0)

Quando o Linux starta ele automaticamente sobe o link VIRTUA, pois eu nao rodo o comando 'pon dsl-provider'

ai dentro do /etc/network/interfaces eu tenho a seguinte linha de comando no fim do arquivo

pre-up /bin/script &

o script é assim:


### INICIO DO SCRIPT
INTERNET="virtua"
while : ; do

ping -c 1 www.yahoo.com
RETVAL=$?
echo $RETVAL

if [ $RETVAL -eq 0 ]; then
echo INTERNET OK
else

if [ INTERNET = "virtua" ]; then
ifdown eth2
pon dsl-provider
/etc/init.d/squid restart #é necessario fazer esse restart pois os usuarios que usam proxy(monitorados) param de navegar apos a troca
INTERNET="speedy"
else
poff -a
ifup eth2
/etc/init.d/squid restart
INTERNET="virtua"
fi

fi

sleep 10
done
### FIM DO SCRIPT

Teoricamente o script deve rodar infinitamente e a cada 10 segundos ele da 1 ping no www.yahoo.com
retornando 0 ele conta mais 10 segundos e tenta de novo
dando qualquer problema no ping ele verifica que internet esta e no caso de estar no virtua
ele desativa a interface dele e sobe o ppp0
no caso de estar no speedy, ele desconecta o ppp0 e ativa a interface do virtua

Eu testei o script por varios minutos, desligando o modem do virtua ou removendo o cabo coaxial(que mantem o link com a placa mas para a transmissao)
e ele pula pro virtua e funciona perfeitamente, mesma coisa removendo a fibra do modem ele volta pro virtua

Se as 2 internets tiverem DOWN, ele vai ficar pulando pra la e pra ca a cada 10 segundos até a primeira voltar a funcionar

(todos os testes foram rodados com o script sendo rodado manualmente e tbm dentro do /etc/network/interfaces)

Aparentemente estava perfeito, mas parece q depois de algumas horas o negocio desanda
A nao ser que o yahoo depois de levar varios pings mesmo que seja 1 a cada 10 segundos me bloqueie, sei la... mas tbm ja tentei o script pingando o terra por exemplo

Alguem ve alguma falha nesse script?

Aguardo uma dica

Abraços a todos,
IGor



  


2. Re: Script Internet Redundante - FALHA

Igor Valsichi
IgorOV

(usa Debian)

Enviado em 20/11/2012 - 08:47h

Sera q o script rodando nesse loop infinito, chega uma hora que [*****] com a memoria do servidor?

Ontem no fim da tarde tava bem [*****] de conseguir conectar nele, até pensei que fosse problema do virtua, mas mesmo mudando pro speedy continuava me desconectando...

até que consegui remover o script e reiniciar o servidor e voltou ao normal....

Ai tentei de novo com o script e parecia ter ficado bom de novo... inclusive tbm pensei "se o yahoo cair (o q é dificil) vai ferrar tbm" entao comecei a pingar os root-servers, por exemplo o a.root-servers.net... (nao significa que em algum momento ele nao caia tbm....)

mas seria temporario de qq forma.... hoje a acordei e nao tem nada online (os servidores windows tem TEAMVIEWER rodando)

Realmente tenho que estar comendo bola em algum lugar......


3. Re: Script Internet Redundante - FALHA

Igor Valsichi
IgorOV

(usa Debian)

Enviado em 20/11/2012 - 13:10h

Agora que consegui ir ate a empresa e reiniciar o servidor (TUDO VOLTOU A FUNCIONAR)

Copiei o script inteiro correto


Tem algum erro no metodo que usei????


Segue ele:

#INICIO DO SCRIPT

INTERNET="virtua"

while : ; do

#ping -c 1 www.yahoo.com
#ping -c 1 200.154.56.80
#ping -c 1 www.terra.com.br


ping -c 1 e.root-servers.net

RETVAL=$?

echo $RETVAL

if [ $RETVAL -eq 0 ]; then

echo INTERNET OK

else

if [ $INTERNET = "virtua" ]; then

echo MUDANDO PARA SPEEDY

INTERNET="speedy"

ifdown eth2 #DESATIVA VIRTUA

sleep 1 #PAUSE DE 1 SEGUNDO

pon dsl-provider #ATIVA SPEEDY

ddclient #ATUALIZA DYNDNS

/etc/init.d/squid restart #REINICIA SQUID


else


echo MUDANDO PARA VIRTUA

INTERNET="virtua"

poff -a #DESATIVA SPEEDY

sleep 1 #PAUSE DE 1 SEGUNDO

ifup eth2 #ATIVA VIRTUA POR DHCP

ddclient #ATUALIZA DYNDNS

/etc/init.d/squid restart #REINICIA SQUID



fi


fi


sleep 25 #ESPERA 25 SEGUNDOS


done #REFAZ LOOP INFINITO
# FIM DO SCRIPT


Deixei espacado assim pra ficar mais facil de voces visualizarem ja que a identacao nao funciona aqui


4. Re: Script Internet Redundante - FALHA

Perfil removido
removido

(usa Nenhuma)

Enviado em 20/11/2012 - 23:48h

Eu pingaria DNS



getNmServers(){
grep '^nameserver' /etc/resolv.conf |
sed 's/nameserver//'
}

for i in $(_getNmServers)
do
ping $i
done


BOA SORTE!!!


5. Re: Script Internet Redundante - FALHA

Perfil removido
removido

(usa Nenhuma)

Enviado em 20/11/2012 - 23:54h

Troque o sinal '=' - atribuição de valor - por '==' - teste de comparação entre valores.

BOA SORTE!!!



6. Re: Script Internet Redundante - FALHA

Igor Valsichi
IgorOV

(usa Debian)

Enviado em 21/11/2012 - 05:35h

./.ronin escreveu:

Eu pingaria DNS



getNmServers(){
grep '^nameserver' /etc/resolv.conf |
sed 's/nameserver//'
}

for i in $(_getNmServers)
do
ping $i
done


Voce sugere trabalhar com essa forma de pingar pois eh mais seguro pingar o proprio dns do que um site ou dominio externo que pode sair do ar por ele mesmo sem significar que na verdade fui eu que sai do ar?

No mais o script tem algum problema? Voce ve as formas de ativar e desativas as conexoes como um problema? Voce acha que os locais que sao pingados podem ter algum tipo de protecao que apos x vezes o firewall bloqueia? Apesar do que qdo reinicia o servidor parece que estabiliza e volta ao normal

Ainda nao consegui entender pq tudo vai bem nas primeiras horas e depois desanda tudo

O while ta correto e torna-se um loop infinito

Desde que o ping retorne 0 nao tem pq passar pelo primeiro else

No mais vou modificar pra sua sugestao e ver no que da

Obrigado


7. Re: Script Internet Redundante - FALHA

Igor Valsichi
IgorOV

(usa Debian)

Enviado em 21/11/2012 - 05:39h

./.ronin escreveu:

Troque o sinal '=' - atribuição de valor - por '==' - teste de comparação entre valores.

BOA SORTE!!!


Voce se refere aonde ele compara se INTERNET = "virtua" ou "speedy". ??

Voce acha que isso pode estar causando alguma falha apos essas horas de funcionamento?


De qq forma vou juntar com a sugestao acima e tentar tbm


8. Re: Script Internet Redundante - FALHA

Igor Valsichi
IgorOV

(usa Debian)

Enviado em 22/11/2012 - 21:32h

Pessoal,

Segue o script que montei

Com o suporte dos amigos acima, a ideia agora foi fazer o seguinte:

O servidor pinga os 2 DNS informado pelo "provedor"
Pinga 1x cada

Se retornar 0 da um loop infinito a cada 20 segundos
Se retornar "qq coisa diferente de 0" ele soma em um "counter" ... dando 3 falhas ele troca de conexao
Pensei no counter pois de repente apenas 1 dos DNS pode ter saido do ar entao ele pinga o primeiro e retorna "FALHA" (counter=1), pinga o segundo e retorna "0" entao como aparentemente a falha foi apenas do DNS e nao do meu link, apos o retorno "0" o counter tbm zera...
mas se a falha for continua que falhar 3x ele entra entao no script fazendo a troca do link

segue o codigo abaixo.

Gostaria das criticas dos colegas



getNmServers(){
grep '^nameserver' /etc/resolv.conf |
sed 's/nameserver//'
}

INTERNET="virtua"
COUNT=0

while [ "loop" == "loop" ]; do


for i in $(getNmServers)
do
ping -c 1 $i

if [ $? -eq 0 ]; then
COUNT=0
else
let COUNT=COUNT+1
fi

if [ $COUNT -eq 3 ]; then

if [ $INTERNET == "virtua" ]; then
echo MUDANDO PARA SPEEDY
INTERNET="speedy"
ifdown eth2
pon dsl-provider
sleep 1
ddclient #Dyndns update client
/etc/init.d/squid restart #Restart do squid por experiencia de que é necessario caso contrario nao funciona mais depois da troca
COUNT=0
else
echo MUDANDO PARA VIRTUA
INTERNET="virtua"
poff -a
ifup eth2
sleep 1
ddclient
/etc/init.d/squid restart
COUNT=0
fi

fi

sleep 2
done

sleep 20
done



9. Re: Script Internet Redundante - FALHA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/11/2012 - 23:30h

Há espaço para algumas pequenas melhorias. Por exemplo, você pode trocar a construção

ping -c 1 $i
if [ $? -eq 0 ]; then
# ...
fi


pelo seguinte bloco, totalmente equivalente (exceto por suprimir as mensagens do ping, o que pode ser interessante para você ou não).

if ping -q -n -c 1 $1 > /dev/null; then
# ...
fi


Vejo com muita frequência o primeiro pacote do ping falhar, mesmo em rede local. Eu consideraria enviar mais de um pacote, e eventualmente controlar os tempos de intervalo e de timeout com as opções "-i" (que aceita valores fracionários, expressos em decimal) e "-w", tomando como resultado positivo pelo menos um pacote de retorno. Faça testes. Dependendo do que você encontrar, isso pode até livrá-lo de ter de usar COUNT para acumular erros, simplificando ainda mais o script.

Alguns comandos aparecem repetidos tanto no bloco then quanto no else do if mais interno. Isso indica que eles não são realmente condicionais, podendo ser movidos para fora de ambos, e executados sempre (desde que atendida a condição do if externo, obviamente).

Quando usar condicionais e seu script usar ksh ou bash, em lugar do shell tradicional, você pode considerar a possibilidade de colocar as condições entre [[ e ]], em lugar de [ e ], pois este último é um comando externo (equivalente ao comando test). Principalmente em loops, não ter de fazer a criação de um novo processo e execução de programa externo apenas para testar valores de variáveis pode ajudar a economizar alguns ciclos de clock.

---

Não sei que restrições contratuais ou pecuniárias você pode ter, mas se quiser experimentar um cenário diferente, considere a possibilidade de deixar os dois links sempre ativos, controlando qual dos dois usar simplesmente pela alteração da rota default e reapontamento dos servidores DNS (por exemplo, tendo um resolv.conf-virtua e um resolv.conf-speedy, e uma maneira de fazer o resolv.conf normal ser apenas um link simbólico para o da conexão que você decidir usar). Num cenário desse tipo, eu _imagino_ que o downtime durante a comutação dos links será menor, e talvez você não precise nem de reiniciar o Squid.

Para testar qual link usar, eu imagino duas possibilidades. No primeiro caso, você poderia simplesmente ver o estado da conexão PPPoE com o ifconfig ou mesmo via /proc/net/dev, e o link com o Virtua inquirindo o cable-modem sobre o estado do uplink (via SNMP, por exemplo, ou HTTP). A segunda hipótese seria testar os servidores de DNS de cada provedor, obrigando os testes a passarem pelos links correspondentes (o que implica rotas estáticas para esses servidores, independentemente de qual link esteja ativo), não com ping, mas usando consultas reais ao DNS, mais ou menos como no exemplo tosco abaixo.

# Para isto funcionar, deve haver um rota estática para o IP do
# SRV_VIRTUA apontando para a eth2, e outra para SRV_SPEEDY saindo
# via ppp0.
SRV_VIRTUA=`grep ^nameserver /etc/resolv.conf-virtua | head -n 1 | awk '{ print $2 }'`
SRV_SPEEDY=`grep ^nameserver /etc/resolv.conf-speedy | head -n 1 | awk '{ print $2 }'`

dig www.yahoo.com @"$SRV_VIRTUA" | grep -q 'status: NOERROR' && virtua_ok=1 || virtua_ok=0
dig www.yahoo.com @"$SRV_SPEEDY" | grep -q 'status: NOERROR' && speedy_ok=1 || speedy_ok=0

# ... Continua o script de mudança de link, dependendo dos valores
# de $virtua_ok e $speedy_ok ...



10. Re: Script Internet Redundante - FALHA

Igor Valsichi
IgorOV

(usa Debian)

Enviado em 26/11/2012 - 09:11h

Pessoal,

Ainda nao pus em pratica nenhum pois nao consegui vir na empresa sabado para testar estando eu LOCAL e sem funcionarios no dia.

Mas estive pensando uma coisa.

Se eu pingar o DNS do meu provedor eu posso cair na situacao de MEU PROVEDOR passar por algum problema entre ELE e o LINK DELE, mas a infraestrutura dele estar funcionando normalmente, ou seja, vai continuar pingando com sucesso.

O script com isso nao vai detectar que a internet caiu.

O que acham desse cenario?

Abraços,

Igor



11. Re: Script Internet Redundante - FALHA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/11/2012 - 17:05h

Se você depender desses DNSs para navegar (costuma ser o caso, a não ser que o seu roteador utilize outros, que você porventura tenha definido na mão), pode ter problemas, mesmo que o restante da infraestrutura esteja de pé. Nesse caso, mudar de link talvez não fosse uma ideia ruim.


12. Re: Script Internet Redundante - FALHA

Igor Valsichi
IgorOV

(usa Debian)

Enviado em 02/12/2012 - 13:51h

PEssoal,

Testei o script e funcionou perfeito ... (ou seja, acontecia antigamente de deposi de algumas horas falhar o ping e agora nao falhou mais)

Entao decidi depois de 2 dias provocar uma falha no link (removi o cabo coaxial do modem NET)

Sendo assim ele pulou pro SPEEDY e tbm funcionou perfeito por alguns segundos e entao ele retornou pro VIRTUA

Depois de investigar, descobri o problema.

Os 2 DNSs da TELEFONICA 200.204.0.10 e 200.204.0.138 nao retornam ping.

Sendo assim, pingar o proprio DNS foi legal com o VIRTUA, mas falhou com o speedy

talvez, alem do counter seja interessante por exemplo
definir 2 ou 3 ips para ele pingar, por exemplo:





INTERNET="virtua"

COUNT=0
IP="www.google.com.br

while [ "loop" == "loop" ]; do

ping -c 1 $IP


if [ $? -eq 0 ]; then
COUNT=0
else
let COUNT=COUNT+1
fi

if [ $COUNT -eq 1 ]; then
IP="www.yahoo.com"
elif [ $COUNT -eq 2]; then
IP="www.terra.com.br"
elif [ $COUNT -eq 3 ]; then
IP="www.google.com.br"

if [ $INTERNET == "virtua" ]; then

echo MUDANDO PARA SPEEDY
INTERNET="speedy"
ifdown eth2
pon dsl-provider
sleep 1
ddclient #Dyndns update client
/etc/init.d/squid restart #Restart do squid por experiencia de que é necessario caso contrario nao funciona mais depois da troca
COUNT=0

else

echo MUDANDO PARA VIRTUA
INTERNET="virtua"
poff -a
ifup eth2
sleep 1
ddclient
/etc/init.d/squid restart
COUNT=0

fi



fi



sleep 20

done



O q acham?



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts