Determinar si se puede utilizar una interfaz de enlace ascendente

Determinar si se puede utilizar una interfaz de enlace ascendente

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 Unreachableexcepto 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 eth1pero 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

información relacionada