Determine se uma interface de uplink é utilizável

2

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
    
por w00t 05.03.2014 / 16:01

0 respostas