Andy_m4
Well-Known Member
Vielen Dank schon mal für eure informativen Postings.
Ich hab mich zumindest vorerst für die Skript-Lösung entschieden. Die ist nicht perfekt, aber einfach und schnell umzusetzen und für meine Zwecke sollte es auch gut genug sein.
Das Skript ist zwar als Bash angegeben, aber das auch nur, weil ich Syntax-Highlighting haben wollte. Es ist ein POSIX-Shell-Skript und läuft auch ohne das eine Bash installiert ist.
benutzte Befehle: ping, route, logger, grep, cut, sleep
Die Grundidee ist die bereits schon erwähnte, das man eine Testadresse anpingt und wenn das fehlschlägt, setzt man die defaulte-route halt auf ein Backup-Gateway und wenn das Haupt-Gateway wieder funktioniert (also ping durch geht), dann setzt man die default-route wieder zurück aufs Haupt-Gateway.
Jeweilige Änderungen werden im System-Log vermerkt.
Das Skript ist darauf ausgelegt durchgängig zu laufen (hat ne Endlosschleife).
Wenn man die while-Schleife (inkl. sleep) weglässt kann man es aber auch nehmen, um es beispielsweise regelmäßig per CRON-Job auszuführen.
Man muss ein wenig aufpassen, wenn man es zum Beispiel mit Strg-C abbricht. Wenn das Strg-C während des pings kommt, dann wird halt das ping mit Fehler abgebrochen was dann u.U. Nachfolgeoperationen in einer Weise beeinflusst, die man nicht haben will.
Mit dem netstat - Befehl kann man sich auch immer mal die Routing-Tabelle angucken:
Das Einzige was man dann halt machen muss ist, die Systemvariable
net.fibs
zu erhöhen (die steht Standardmäßig auf 1 - also nur eine Routing-Tabelle erlaubt).
Aber ja. Es ist ein interessantes Tool, was ich bis dato noch gar nicht kannte.
Ich hab mich zumindest vorerst für die Skript-Lösung entschieden. Die ist nicht perfekt, aber einfach und schnell umzusetzen und für meine Zwecke sollte es auch gut genug sein.
Bash:
#!/bin/sh
#
# Es gibt zwei Gateways zum Internet.
# Dieses Skript prüft via
# ping $TEST_IP_ADDR,
# ob $MAIN_GATEWAY funktioniert und falls nicht, wird das default gateway
# auf $BACKUP_GATEWAY gesetzt.
# Sobald dann $MAIN_GATEWAY wieder funktioniert, wird das default-gateway
# zurück auf $MAIN_GATEWAY gesetzt
# Das Prüfintervall beträgt $DELAY Sekunden
# ----------------------------------
# Konfiguration:
MAIN_GATEWAY="192.168.0.1"
BACKUP_GATEWAY="192.168.0.2"
TEST_IP_ADDR="8.8.8.8"
DELAY=30
# ----------------------------------
# Programm:
log()
{
logger -p $1 -t "Change-Default-Gateway" $2
}
log-notice()
{
log local0.notice "$1"
}
log-warning()
{
log local0.warning "$1"
}
setnewgateway()
{
route change default $1 >/dev/null
if [ $? -eq 0 ]
then
log-notice "Default Gateway is set to $1"
else
log-warning "Setting Default Gateway to $1 is failed."
fi
return $?
}
test_connection()
{
ping -q -c 3 $TEST_IP_ADDR >/dev/null
return $?
}
while true
do
CURRENT_DEFAULT_GATEWAY=$(route -4n get default|grep gateway:|cut -w -f 3)
test_connection
TEST_IP_REACHABLE=$?
if [ $TEST_IP_REACHABLE -eq 0 ]
then
if [ "$CURRENT_DEFAULT_GATEWAY" = "$BACKUP_GATEWAY" ]
then
route delete -host $TEST_IP_ADDR $MAIN_GATEWAY >/dev/null
setnewgateway $MAIN_GATEWAY
fi
else
if [ "$CURRENT_DEFAULT_GATEWAY" = "$MAIN_GATEWAY" ]
then
# sicherstellen das 'ping $TEST_IP_ADDR' über $MAIN_GATEWAY geht:
route add -host $TEST_IP_ADDR $MAIN_GATEWAY >/dev/null
setnewgateway $BACKUP_GATEWAY
fi
fi
sleep $DELAY
done
benutzte Befehle: ping, route, logger, grep, cut, sleep
Die Grundidee ist die bereits schon erwähnte, das man eine Testadresse anpingt und wenn das fehlschlägt, setzt man die defaulte-route halt auf ein Backup-Gateway und wenn das Haupt-Gateway wieder funktioniert (also ping durch geht), dann setzt man die default-route wieder zurück aufs Haupt-Gateway.
Jeweilige Änderungen werden im System-Log vermerkt.
Das Skript ist darauf ausgelegt durchgängig zu laufen (hat ne Endlosschleife).
Wenn man die while-Schleife (inkl. sleep) weglässt kann man es aber auch nehmen, um es beispielsweise regelmäßig per CRON-Job auszuführen.
Man muss ein wenig aufpassen, wenn man es zum Beispiel mit Strg-C abbricht. Wenn das Strg-C während des pings kommt, dann wird halt das ping mit Fehler abgebrochen was dann u.U. Nachfolgeoperationen in einer Weise beeinflusst, die man nicht haben will.
Mit dem netstat - Befehl kann man sich auch immer mal die Routing-Tabelle angucken:
netstat -rn
Ja. Das wäre auch ne elegante Lösung statt, wie ich es mache, da dem Test-Host ein festen Gateway zuzuweisen.Du kannst mehrere Routingtables definieren
Das Einzige was man dann halt machen muss ist, die Systemvariable
net.fibs
zu erhöhen (die steht Standardmäßig auf 1 - also nur eine Routing-Tabelle erlaubt).
Ja. Das ist ne gute Idee. So muss man für den Test-Ping nicht durchs halbe Internet.eignet sich auch der GW/DNS vom jeweiligen ISP der Leitung
ifstated könnte man im Prinzip nehmen. Letztlich würde ich damit aber auch nix anderes machen als in meinem einfachen Skript.unter OpenBSD gibt es ifstated
Aber ja. Es ist ein interessantes Tool, was ich bis dato noch gar nicht kannte.