Ermitteln, ob eine Uplink-Schnittstelle nutzbar ist

Ermitteln, ob eine Uplink-Schnittstelle nutzbar ist

Ich habe ein Firewall-System, das von zwei Uplinks zu verschiedenen ISPs bedient wird. Ich verwende Shorewall zur Verwaltung der Firewall. Es gleicht den Verkehr über beide Schnittstellen mit Verbindungsverfolgung aus. Das funktioniert alles gut.

Ich habe einige Skripte erstellt, um Schnittstellen hoch-/herunterzufahren, wenn festgestellt wird, dass eine davon nicht mehr verwendbar ist. Das von Shorewall vorgeschlagene LSM gefiel mir nicht (es ist nicht in Ubuntu enthalten) und ich entschied mich stattdessen für netplugd zur Schnittstellenüberwachung und ein Ping-Skript in Cron zum Testen der Konnektivität.

Das Ping-Skript führt im Grunde einen einzelnen Ping aus ping -I eth[01] 8.8.8.8. Wenn der Ping fehlschlägt, wird es erneut versucht und wenn auch dieser fehlschlägt, wird Shorewall angewiesen, die Schnittstelle abzuschalten.

Mein Problem tritt auf, wenn die Firewall die Schnittstelle außer Betrieb setzt. Dann kann ich das nicht mehr tun ping. Es antwortet immer mit, Destination Host Unreachableaußer wenn ich das unmittelbare Gateway anpinge.

Gibt es eine Möglichkeit, die tatsächliche Internetverbindung über eine Schnittstelle zu testen, ohne normalen Datenverkehr darüber zu senden?

Hier sind die Skripte, die ich geschrieben habe:

check_schnittstellen: (wird von Cron und bei Netplugd-Ereignissen ausgeführt)

#!/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

(Ich weiß, dass man mit Shorewall eine Schnittstelle herunterfahren kann, /var/lib/shorewall/firewall disable eth1aber ich habe dabei einige Instabilitäten festgestellt, deshalb verwende ich einfach „Refresh“)

/etc/shorewall/verwendbar:

# 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

verwandte Informationen