Determinar se uma interface de uplink é utilizável

Determinar se uma interface de uplink é utilizável

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 Unreachableexceçã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 eth1mas 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

informação relacionada