Redundância de link de internet
Este artigo tem por finalidade apresentar um script de redundância de links, onde, em caso de falha do link principal, o script automaticamente faz a troca para o link secundário. A necessidade surgiu, quando por diversas vezes, ocorreram falhas no link de internet, afetando diretamente os serviços da empresa, que depende diretamente da internet. O servidor é um firewall de rede, o mesmo tem que ter alta disponibilidade de acesso.
[ Hits: 14.580 ]
Por: Edir Arnaldo de Oliveira Bonametti em 20/07/2015
#=============================================================================== #!/bin/bash #=============================================================================== # @author Edir Bonametti # @since 2015-07-03 # @version 1.0 # Description: Este script foi desenvolvido com o intuito de monitorar o link # de internet, e realizar a troca do gateway em caso de falha do link principal. #=============================================================================== #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Modo de Usar: # # Existe um daemon que roda e monitora esse script, o mesmo esta localizado em # # /etc/init.d/monitor_link ( status, stop, start, restart) # # Esse daemon, executa a função monitor, que faz a verificação de estado de # link a cada 10 segundos. # #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Início do Script (Declaração das Variáveis) # Verificação de qual gateway está ativado na tabela de roteamento. GWUP=`ip route show | grep ^default | cut -d " " -f 3` # Gateway Principal GW1=<IP DO GATEWAY PRINCIPAL> # Gateway backup GW2=<IP DO GATEWAY SECUNDÁRIO> #Interface da NET INTNET=eth2 #Interface Embratel INTEBT=eth3 # IP de teste de conexão IPTESTE=8.8.8.8 # Arquivo de log LOG=/var/log/redundancia.log COMANDO=$1 TEMPO=$2 # Função que gera os logs function log() { MSG="[`date`] $@" echo $MSG >> $LOG } # Função utilizada para testar a conectividade do link Principal (NET) function testa_NET () { route add $IPTESTE gw $GW1 # Adiciona rota para sair pelo link NET ping -I $INTNET $IPTESTE -c 10 -A > /dev/null # Pinga o IP de teste pingok=$? # Guarda o retorno do comando anterior. route del $IPTESTE gw $GW1 # Remove a rota do IP de teste [ $pingok -eq 0 ] && return 0 || return 1 # Retorna 0 se link NET OK OU 1 se Não OK } # Função para ativar o link 1 (NET) function ativa_link1() { log "Iniciando link Principal..." add_GW_NET # Chama a funcao add_GW_NET } # Função que adiciona rota para GATEWAY (NET) function add_GW_NET() { log "Removendo Rota da Embratel" route del default gw $GW2 # Remove rota para Embratel caso ela exista. log "Adicionando Rota para a NET" route add default gw $GW1 # Adiciona rota para NET } # Função que desativa link 1 function desativa_link1 () { #log "Removendo Rota da NET" route del default gw $GW1 # Remove gateway do link 1 } # Função que ativa link 2 function ativa_link2() { desativa_link1 # Chama função desativa_link1 route add default gw $GW2 # Adiciona rota para o link 2 ping -I $INTEBT $IPTESTE -c 5 -A > /dev/null # Testa conectividade do link Embratel if [[ $? -eq 0 ]]; then # Retorna 0 se o link OK OU 1 SE NÃO OK # log "Link EMBRATEL Ativo" return 0; fi return 1; } # Função que desativa link 2 function desativa_link2() { # log "Removendo Gateway da Embratel" route del default gw $GW2 # Remove Gateway da Embratel return 0; return 1; } # ATENÇÃO...!!! Função Principal do script, quaisquer alterações nessa função devem ser feitas com precaução, # caso contrario poderá comprometer o funcionamento do mesmo. function monitor() { while true # Enquanto as condições abaixo forem verdadeiras, ele vai executar. do #Busca o default gateway na tabela de rotas local GWUP=`ip route show | grep ^default | cut -d " " -f 3` # Verifica se o gateway atual e a NET if [ $GWUP == $GW1 ]; then # Se essa condição for verdadeira...continua no IF, se não entra no ELSE log "Gateway atual apontando para NET" # log "Realizando verificacao de estado do LINK" if( ! testa_NET); then # Se a função testa net retornar falha, entra IF log "Link NET indisponivel, ativando Gateway da EMBRATEL" if(ativa_link2); then # Se função ativa link retornar OK, entra no if, caso der falha, entra no ELSE. log "Link EMBRATEL ativado com Sucesso" else log "Problema ao ativar Gateway da Embratel" fi fi else log "Gateway atual apontando para EMBRATEL" # # Ativa rota NET se ela estiver disponível if(testa_NET ); then # Se link NET voltou, desativa o link 2 (EMBRATEL) log "Link NET disponivel, desativando GATEWAY da EMBRATEL e retornando para da NET" if( desativa_link2 ); then # ativa_link1 fi fi fi sleep $TEMPO done } case "$1" in monitor) echo "`date` - Monitorando Link Principal: intervalo $TEMPO segs" monitor ;; status) if [ $GWUP == $GW2 ]; then echo "Utilizando EMBRATEL" else echo "Utilizando NET" fi ;; link1) if [ $GWUP == $GW2 ]; then desativa_link2 ativa_link1 else echo "Link1 ja em uso" fi ;; link2) if [ $GWUP == $GW1 ]; then ativa_link2 else echo "Link2 ja em uso" fi ;; *) echo $"Usage: $prog { monitor + segundos | link1 | link2 | status }" exit 1 ;; esac exit $?
#!/bin/bash #============================================================== # @author Edir Bonametti # @since 2015-07-03 # @version 1.0 # Description: Daemon do script link_redundante # process name: link_redundante #============================================================== # Source function library. . /etc/init.d/functions # Verifica se o arquivo de configuração existe [ -f /etc/init.d/link_redundante ] || exit 0 # Comando utilizado para rodar o script de monitoramento COMMAND="/etc/init.d/link_redundante" RETVAL=0 # função para pegar o PID do processo. getpid() { pid=`ps -eo pid,comm | grep link_redundante | awk '{ print $1 }'` } # Função para iniciar o script link_redundate start() { echo $"Iniciando o Monitoramento de LINK: " getpid if [ -z "$pid" ]; then rm -rf /var/run/link_redundate.sock # Caso o processo já exista limpa o sock # Inicializa o monitoramento no intervalo de 10 segundos $COMMAND monitor 10 & > /dev/null RETVAL=$? fi # Se o retorno do comando anterior for verdadeiro, cria o arquivo link_redundate if [ $RETVAL -eq 0 ]; then touch /var/lock/subsys/link_redundante echo_success else # Caso retorne falso echo_falhou fi echo # return $RETVAL } # Função que para o monitoramento' stop() { echo $"Parando Monitoramento do LINK: " getpid RETVAL=$? if [ -n "$pid" ]; then $COMMAND link1 > /dev/null kill -9 $pid sleep 2 getpid if [ -z "$pid" ]; then rm -f /var/lock/subsys/link_redundante echo_success else echo_failure fi else echo_failure fi echo return $RETVAL } case "$1" in start) start ;; stop) stop ;; status) getpid if [ -n "$pid" ]; then echo "Monitoramento de link (PID $pid) está Rodando...." $COMMAND status else RETVAL=1 echo "Monitoramento de link está parado...." fi ;; restart) stop start ;; *) echo $"Usage: $0 {start|stop|status|restart}" exit 1 ;; esac exit $RETVAL
Receba seu IP externo via e-mail ou ensine o bash a ler e enviar e-mails
Assinatura de documentos PDF em lote via Bash
Script com muitas utilidades para arquivos e pastas
Backup automatizado com HD externo
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Não to conseguindo resolver este problemas ao instalar o playonelinux (1)
Excluir banco de dados no xampp (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta