Monitorar links e fazer redundância
Publicado por Fábio de Souza (última atualização em 05/06/2012)
[ Hits: 7.967 ]
Homepage: www.quebec-linux.blogspot.com.br
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!
#!/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
Compactado e descompactador bem interessantee
Backup PostgreSql por DataBases
Criar backup do Diretorio /home
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? (7)
O programa assinador digital (5)









