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: 15.198 ]
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
Script com muitas utilidades para arquivos e pastas
GNU Parallel: criando atividades em paralelo com shell script
Relatório de sistema via browser (shell script + CGI)
Piano Gripe 3 - Caracteres de controle
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (6)
O programa assinador digital (5)









