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.107 ]

Por: Edir Arnaldo de Oliveira Bonametti em 20/07/2015


Descrição do script



Pessoal,

Eu comecei a escrever scripts há muito pouco tempo, então, não sou muito bom em fazê-los, sou iniciante nessa área, portanto, podem haver coisas que vocês saibam fazer diferente e melhor.

Este script está funcionando perfeitamente nesse cliente, porém, caso vocês tenham novas ideias, novas formas de fazer as funções e processos aqui apresentados, conto com a ajuda e colaboração de vocês a fim de melhorar e aprimorar esse script.

Espero ajudar quem um dia vir a ter a mesma necessidade que eu tive.

Este script foi construído para suprir a necessidade de ter alta disponibilidade de internet. O mesmo está rodando em um servidor de firewall (CentOS 5).

O script é divido em dois arquivos, o link_rendundante e o monitor_link:
  • link_redundante - esse arquivo contém todas as funções e a lógica do script.
  • monitor_link - esse arquivo é o daemon, que roda e monitora o arquivo link_redundante.

Obs.: lembre-se de dar permissão de execução aos scripts:

# chmod +x link_redundate
# chmod +x monitor_link

Segue abaixo o script link_redundante. O mesmo deverá estar localizado em /etc/init.d/link_redundante:

#===============================================================================
#!/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 $?

Abaixo, o script monitor_link:

#!/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

   

Páginas do artigo
   1. Descrição do script
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Extracttext - como extrair texto de uma área selecionada da tela

Aprendendo a melhorar os seus scripts

Receba seu IP externo via e-mail ou ensine o bash a ler e enviar e-mails

Relatório de conexão Wi-Fi com dados de usuários conectados nos POPs

Script GitPratico para criar repositórios remotos sem logar no GitHub

  
Comentários
[1] Comentário enviado por wagnerfs em 20/07/2015 - 21:36h

Parabéns por compartilhar o conhecimento. Gostei da forma escrita do script: bem organizada e de fácil entendimento. Vou marcar nos favoritos e fazer testes. Valeu!
_________________________
Wagner F. de Souza
Técnico/Instrutor de Informática
"GNU/Linux for human beings."
LPI ID: LPI000297782

[2] Comentário enviado por EddyBin em 20/07/2015 - 23:33h


Boa noite Wagner.

Que isso, é sempre um prazer poder ajudar e contribuir, assim como eu sou ajudado muitas e muitas vezes com os artigos aqui da pagina, os comentários e as dúvidas sanadas, nada mais justo do que compartilhar o pouco conhecimento que tenho.

Espero mesmo poder ajudar e contribuir cada vez mais.

Á três caminhos para o (FRACASSO): 1) Não ensinar o que se sabe; 2) Não praticar o que se ensina; 3) Não perguntar o que se ignora.

Atenciosamente,
Edir

[3] Comentário enviado por repetile em 21/07/2015 - 15:22h

Parabéns pelo script, creio que ajudará muita gente.

Grande abraço

Att
Repetil3

[4] Comentário enviado por danniel-lara em 22/07/2015 - 09:51h


Parabéns muito bom o artigo , muito útil

[5] Comentário enviado por EddyBin em 23/07/2015 - 12:26h

Valeu Danniel.

Posso fazer uma pergunta, eu esto querendo enviar e-mail para o ADM da rede, quando cair o link 1, vocês sabem o melhor jeito de proceder neste caso?

Quais os processos: ?

Desde já agradeço.

Att,
Edir

[6] Comentário enviado por Uchiha Beyond em 23/07/2015 - 15:09h


Nao entendi, tipo, se eu entrar em www.vivaolinux.com e o gateway que eu estiver usando nao conseguir me conectar, então um segundo gateway ira tentar me conectar?

OBS: Desculpa pela minha burrice.

[7] Comentário enviado por EddyBin em 23/07/2015 - 19:14h


Boa noite Uchiha (MADARA) kkk , Magina, não tem nada de burrice.

Então meu caro, esse script esta rodando em um servidor de Firewall, ao qual existem dois links de internet(EMBRATEL,NET), por default o link principal é o NET, caso esse link venha a ficar DOWN, o script troca a rota default para o IP da Embratel (LINK secundário).

Deste modo, a empresa não fica sem acesso a internet.

Qualquer dúvida, por favor, poste.

Att,
Edir


[8] Comentário enviado por sergeimartao em 23/07/2015 - 21:49h


[5] Comentário enviado por EddyBin em 23/07/2015 - 12:26h

Posso fazer uma pergunta, eu esto querendo enviar e-mail para o ADM da rede, quando cair o link 1, vocês sabem o melhor jeito de proceder neste caso?

Quais os processos: ?

Desde já agradeço.

Att,
Edir


Eddy,

Voce pode implementar no script para enviar um e-mail quando o link cair, leia esse artigo que vai ajudar.
http://tombuntu.com/index.php/2008/10/21/sending-email-from-your-system-with-ssmtp/

Vlw por compartilhar o script.

[9] Comentário enviado por EddyBin em 24/07/2015 - 00:50h


Achei interessante o link, porem, como ajudar apenas para enviar a parte do log
que avisa quando cai ? Algum Alerta ? Já fez algo parecido ?

Desde já agradeço a Ajuda.

Att,
Eddy

[10] Comentário enviado por Lwkas em 27/07/2015 - 13:47h

Muito bom artigo. Obrigado por compartilhar

[11] Comentário enviado por marcelll0 em 30/07/2015 - 07:35h

Ótimo artigo!

Muito obrigado por compartilhar!!!!

[12] Comentário enviado por bestmoor em 06/06/2016 - 22:14h

otimo script, testado e aprovado.
tambem achei interessante mandar um email para o adm quando o link principal cair.

[13] Comentário enviado por bestmoor em 09/07/2018 - 12:06h


[12] Comentário enviado por bestmoor em 06/06/2016 - 22:14h

otimo script, testado e aprovado.
tambem achei interessante mandar um email para o adm quando o link principal cair.


Pena que nas versoes novas (debian 9) o script nao funcione ...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts