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 Unreachable
auß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 eth1
aber 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