Eu tenho um sistema de firewall que é servido por dois uplinks para diferentes ISPs. Estou usando o shorewall para gerenciar o firewall; equilibra a carga de tráfego em ambas as interfaces com rastreamento de conexão. Tudo isso funciona bem.
Eu preparei alguns scripts para trazer as interfaces para cima / baixo quando detectou que um deles não é mais utilizável. Eu não gostei do LSM que o shorewall propõe (não é no Ubuntu) e, em vez disso, optei pelo netplugd para monitoramento de interface e um script ping no cron para testes de conectividade.
O script ping basicamente faz um único ping -I eth[01] 8.8.8.8
. Se o ping falhar, ele tentará novamente e se isso falhar, ele informará ao shorewall para derrubar a interface.
Meu problema acontece quando o firewall desativa a interface, então não consigo mais fazer o ping
. Ele sempre responde com Destination Host Unreachable
, exceto pelo ping no gateway imediato.
Existe uma maneira de testar a conectividade real da Internet em uma interface sem enviar tráfego regular sobre ela?
Aqui estão os scripts que escrevi:
check_interfaces : (roda do 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ê baixe uma interface com /var/lib/shorewall/firewall disable eth1
, mas eu experimentei alguma instabilidade com isso, então estou apenas usando a atualização)
/ etc / shorewall / isusable :
# 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