REDUNDÂNCIA DE LINK DE INTERNET

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
Rolar para cima