Tengo un sistema de firewall que cuenta con dos enlaces ascendentes a diferentes ISP. Estoy usando Shorewall para administrar el firewall; equilibra la carga del tráfico en ambas interfaces con seguimiento de la conexión. Todo eso funciona muy bien.
Preparé algunos scripts para activar o desactivar las interfaces cuando detecta que una de ellas ya no se puede utilizar. No me gustó el LSM que propone Shorewall (no está en Ubuntu) y en su lugar opté por netplugd para monitorear la interfaz y un script de ping en cron para pruebas de conectividad.
El script ping básicamente hace un solo archivo ping -I eth[01] 8.8.8.8
. Si el ping falla, lo intenta de nuevo y, si falla, le dice a Shorewall que elimine la interfaz.
Mi problema ocurre cuando el firewall dejó la interfaz fuera de servicio, entonces ya no puedo ejecutar el archivo ping
. Siempre responde Destination Host Unreachable
excepto cuando hace ping a la puerta de enlace inmediata.
¿Existe alguna forma de probar la conectividad real a Internet a través de una interfaz sin enviar tráfico regular a través de ella?
Aquí están los guiones que escribí:
comprobar_interfaces: (se ejecuta desde cron y en 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
(Sé que Shorewall te permite desactivar una interfaz, /var/lib/shorewall/firewall disable eth1
pero experimenté cierta inestabilidad con eso, así que solo estoy usando la actualización)
/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