Eu tenho um sistema de firewall que é servido por dois uplinks para diferentes ISPs. Estou usando o shorewall para gerenciar o firewall; ele equilibra a carga do tráfego em ambas as interfaces com rastreamento de conexão. Tudo isso funciona bem.
Elaborei alguns scripts para ativar/desativar interfaces quando detectar que uma delas não pode mais ser usada. Não gostei do LSM que o shorewall propõe (não está no Ubuntu) e optei pelo netplugd para monitoramento de interface e um script ping no cron para teste de conectividade.
O script ping basicamente faz um único arquivo ping -I eth[01] 8.8.8.8
. Se o ping falhar, ele tenta novamente e, se falhar, informa ao Shorewall para desativar a interface.
Meu problema acontece quando o firewall desativou a interface, então não consigo mais fazer o ping
. Ele sempre responde com Destination Host Unreachable
exceção do ping no gateway imediato.
Existe uma maneira de testar a conectividade real da Internet em uma interface sem enviar tráfego regular por ela?
Aqui estão os scripts que escrevi:
check_interfaces: (executado no cron e em eventos netplugd)
#!/bin/bash
#
# Verify state of interfaces
#
google_ping() {
if ! ping -I "$1" -n -c1 -w1 -q 8.8.8.8 >/dev/null 2>&1; then
# Try harder
ping -I "$1" -n -c2 -w5 -q 8.8.8.8 >/dev/null 2>&1
fi
}
REFRESH=
for i in eth0 eth1; do
if google_ping $i; then
if ! [ -e /tmp/shorewall-$i.up ]; then
echo Interface $i came up
touch /tmp/shorewall-$i.up
REFRESH=true
fi
else
if [ -e /tmp/shorewall-$i.up ]; then
echo Interface $i went down
rm /tmp/shorewall-$i.up
REFRESH=true
fi
fi
done
if [ -n "$REFRESH" ]; then
echo Kicking shorewall...
/sbin/shorewall refresh >/dev/null
fi
(Eu sei que o shorewall permite que você desative uma interface, /var/lib/shorewall/firewall disable eth1
mas experimentei alguma instabilidade com isso, então estou apenas usando a atualização)
/etc/shorewall/isusável:
# Used by shorewall to check if interface is usable
# This is sourced instead of executed so don't exit but return
# Interface is up
if [ -e "/tmp/shorewall-$1.up" ]; then
return 0
elif ls /tmp/shorewall-*.up >/dev/null 2>&1; then
return 1
else
# No interfaces are up - pretend they're up and hope for the best
return 0
fi