Monitorar links e fazer redundância

Publicado por Fábio de Souza (última atualização em 05/06/2012)

[ Hits: 7.607 ]

Homepage: www.quebec-linux.blogspot.com.br

Download echanger.sh




Eu necessitava de um script que verificasse o status das duas interfaces de rede com saída para internet e trocasse os arquivos de configuração do firewall conforme o resultado, depois reiniciasse o firewall para efetuar as mudanças, entrando em loop de verificação novamente.

Portanto ele deve rodar em background e pelo "root" ou equivalente, se quiser coloque para iniciar automaticamente no init.

Se for utilizar, modifique as variáveis conforme seu gosto e distribuição, pois foi feito para SuSEfirewall2.

Você deverá ter 3 arquivos de configuração de firewall (iptables, susefirewall2-custom, etc):

- 1 para quando o link primário cair
- outro arquivo para quando o link secundário cair
- e outro original (especificando o caminho, ele fará automaticamente o backup deste)

Enviem suas dúvidas ou sugestões.

Fui!

  



Esconder código-fonte

#!/bin/bash

# Echanger versao 1.0
# Criado por Fabio de Souza - binho.tti@gmail.com
# Modificado em 21 Maio de 2012

# Variaveis - Modifique somente se souber o que esta fazendo.
DATE='date +%Y%m%d%H%M'
ECHNGDIR="/root/scripts-adm/echanger"
CFG_PRI="$ECHANGEDIR/SuSEfirewall2-custom-primario"
CFG_SEC="$ECHANGEDIR/SuSEfirewall2-custom-secundario"
CFG_ORI="$ECHANGEDIR/SuSEfirewall2-custom-original"
PATH_SYS="/etc/sysconfig/scripts/SuSEfirewall2-custom"
IP_A="200.100.50.25"
IP_B="189.187.186.40"
INT_A="eth0"
INT_B="eth1"
LOG="/var/log/echanger.log"
CHECK="nada"
INTERVAL="300"
QTD_PINGS=4
FW_RELOAD="/sbin/rcSuSEfirewall2 reload"
FW_RESTART="/sbin/rcSuSEfirewall2 restart"
NET_RESTART="/sbin/rcnetwork restart"

msgOK () {
echo -e "[ \e[00;32mOK\e[00m ]"
}

msgFAILED () {
echo -e "[ \e[00;31mFAILED\e[00m ]"
}

Linkstts_A () {
ethtool $INT_A | grep "Link detected" >> $LOG 2> /dev/null
ethtool -S $INT_A | grep -vw " 0" >> $LOG 2> /dev/null
}

Linkstts_B () {
ethtool $INT_B | grep "Link detected" >> $LOG 2> /dev/null
ethtool -S $INT_B | grep -vw " 0" >> $LOG 2> /dev/null
}
echo -e "\n\t `$DATE` : Script ECHANGER iniciado ---" >> $LOG

touch $LOG || (msgFAILED && exit 1)

for ip in $IP_A $IP_B
do
    REGEX=$(egrep -c "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" <<< ${IP_A})
    if [ $REGEX -eq 0 ]; then
         echo "Endereco IP $ip, que sera monitorado, esta inconsistente." >> $LOG
         exit 1
    else
        echo "Endereco IP $ip , que sera monitorado, esta consistente" >> $LOG
    fi
done

echo "Verificando existencia da $INT_A ..." >> $LOG
ifconfig $INT_A > /dev/null 2> /dev/null && msgOK >> $LOG || (msgFAILED >> $LOG && exit 1)
echo "Verificando existencia da $INT_B ..." >> $LOG
ifconfig $INT_B > /dev/null 2> /dev/null && msgOK >> $LOG || (msgFAILED >> $LOG && exit 1)

echo "Criando diretorio echanger ..." >> $LOG
mkdir -p $ECHNGDIR && msgOK >> $LOG || (msgFAILED >> $LOG && exit 1)

echo "Fazendo backup de $PATH_SYS para $ECHNGDIR$CFG_ORI ..." >> $LOG
[ -f $PATH_SYS ] && cp $PATH_SYS $ECHNGDIR$CFG_ORI 2> /dev/null && msgOK >> $LOG || (msgFAILED >> $LOG && exit 1)

# Inicio do looping de verificacao de links
while true
do
sleep $INTERVAL

ping $IP_A -I $INT_A -c $QTD_PINGS > /dev/null 2> /dev/null ; STAT_IP0=$?
ping $IP_B -I $INT_B -c $QTD_PINGS > /dev/null 2> /dev/null ; STAT_IP1=$?


# Problema no link secundario, joga trafego no link principal.
if [ $STAT_IP0 -eq 0 ] && [ $STAT_IP1 -ne 0 ] ; then
    if [ $CHECK == secdown ] ; then
        echo "`$DATE` : Nenhuma alteracao a fazer, $INT_B ainda esta down!" >> $LOG
        Linkstts_B
    else
        echo "`$DATE` : Link Secundario down!" >> $LOG
        cp $ECHNGDIR$CFG_PRI $PATH_SYS
        $FW_RELOAD > /dev/null 2> /dev/null
        INTERVAL="240" ; CHECK="secdown"
    fi

# Problema no link primario, joga trafego no link secundario.
elif [ $STAT_IP0 -ne 0 ] && [ $STAT_IP1 -eq 0 ] ; then
    if [ $CHECK == pridown ] ; then
        echo "`$DATE` : Nenhuma alteracao a fazer, $INT_A ainda esta down!" >> $LOG
        Linkstts_A
    else
        echo -e "`$DATE` : Link Primário down!" >> $LOG
        cp $ECHNGDIR$CFG_SEC $PATH_SYS
        $FW_RELOAD > /dev/null 2> /dev/null
        INTERVAL="240" ; CHECK="pridown"
    fi
# Dois links indisponiveis, reinicia interfaces para tentar resolver.
elif [ $STAT_IP0 -ne 0 ] && [ $STAT_IP1 -ne 0 ] ; then
    if [ $CHECK == alldown ] ; then
        echo "`$DATE` : Links $INT_A e $INT_B ainda estao DOWN!" >> $LOG
        INTERVAL="60" ; CHECK="alldown"
    else
        echo -e "`$DATE` : All links DOWN!" >> $LOG
        $NET_RESTART > /dev/null 2> /dev/null
        INTERVAL="30" ; CHECK="alldown"
fi

# Os dois links estao OK, mantem tabelas.
else
    if [ $CHECK == "allup" ] ; then
        echo -e "`$DATE` : Nenhuma alteracao a fazer, links $INT_A e $INT_B ainda estao UP." >>  $LOG
        INTERVAL="300" ; CHECK="allup"
    else
        echo -e "`$DATE` : Links $INT_A e $INT_B estao UP." >> $LOG
        cp $ECHNGDIR$CFG_ORI $PATH_SYS
        $FW_RELOAD > /dev/null 2> /dev/null
        INTERVAL="300" ; CHECK="allup"
    fi
fi
done

Scripts recomendados

Agenda Telefonica Básica

Start e parar serviço proftpd

Remover linhas duplicadas em arquivos

Transformador

Criando usuarios com DIALOG


  

Comentários
[1] Comentário enviado por davirodrigues em 19/07/2012 - 09:46h

Bom dia!

Esse IP_A e IP_B, são os gateways?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts