default gateway failover / redundant gateway
Szenario / Aufgabenstellung:
In einem vorhandenen LAN soll zur Lastverteilung ein weiterer Zugang zum Internet eingebaut werden. Die beiden Internetzugänge müssen über zwei verschiedene Geräte laufen und sind auch räumlich getrennt. Der Einsatz teurer Load-Balance Lösungen ist aus Kostengründen ausgeschlossen.
Die Clients im LAN laufen mit Windows XP oder Windows Vista.
Lösungsweg:
Es wird in dem LAN zwei default-gateways geben. Ein Teil der Clients benutzt den einen Gateway und ein anderer Teil den anderen. Für den Fall dass ein Gateway ausfällt sollen die jeweiligen Clients aber über den anderen Gateway geleitet werden, ohne das der Benutzer etwas ändern muss. Ist der Gateway wieder vorhanden, musss der Client wieder automatisch zurück umschalten.
Dazu habe ich ein kleines BATCH-Script geschrieben. Dieses Script wird einfach per Autostart ausgeführt und läuft im Hintergrund mit.
@echo off rem: ist das WLAN an und im richtigen NETZ? rem: das Script soll nur in dem eigenen Netzt ausgeführt werden rem: wenn der Benutzer sich mit seinem Laptop in ein anderes Netzt hängt darf das Script nicht rem: ausgeführt werden :start ipconfig | find "174.111.33.1" if errorlevel 1 (goto sleep) set GATEWAY1=174.111.33.10 set GATEWAY2=174.111.33.1 rem: die Adresse, die zur Überprüfung des Gateways gepingt werden soll set PINGDEST="174.112.1.2" rem: GATEWAY1 als default setzen call route delete 0.0.0.0 mask 0.0.0.0 call route add 0.0.0.0 mask 0.0.0.0 %GATEWAY1% set CURRENTGATEWAY=%GATEWAY1% :CheckGateway ping -n 3 %PINGDEST% | find "TTL=" rem: wenn der Ping nicht ankommt Gateway wechseln if errorlevel 1 (goto ChangeGateway2) else (goto ChangeGateway1) :ChangeGateway1 rem: wenn dieser Gateway gesetzt ist, dann warte ab und beginne von vorn rem: 174.111.254.254 sollte nicht erreichbar sein, aber im selben Netz liegen if "%GATEWAY1%"=="%CURRENTGATEWAY%" ( ping 174.111.254.254 -n 1 -w 60000 > NULL goto CheckGateway ) rem: wieder prüfen ob wir nicht zwischenzeitlich in einem anderen Netz sind, oder gar keine Verbindung haben ipconfig | find "174.111.33.1" if errorlevel 1 (goto sleep) rem: sonst ändere den Gateway set CURRENTGATEWAY=%GATEWAY1% echo failover to %CURRENTGATEWAY% call route delete 0.0.0.0 mask 0.0.0.0 call route add 0.0.0.0 mask 0.0.0.0 %CURRENTGATEWAY% goto CheckGateway :ChangeGateway2 rem: wenn dieser Gateway gesetzt ist, dann warte ab und beginne von vorn rem: 174.111.254.254 sollte nicht erreichbar sein, aber im selben Netz liegen if "%GATEWAY2%"=="%CURRENTGATEWAY%" ( ping 174.111.254.254 -n 1 -w 6000 > NULL goto CheckGateway ) rem: sonst ändere den Gateway set CURRENTGATEWAY=%GATEWAY2% rem: wieder prüfen ob wir nicht zwischenzeitlich in einem anderen Netz sind, oder gar keine Verbindung haben ipconfig | find "174.111.33.1" if errorlevel 1 (goto sleep) rem: Gateway wechseln echo failover to %CURRENTGATEWAY% call route delete 0.0.0.0 mask 0.0.0.0 call route add 0.0.0.0 mask 0.0.0.0 %CURRENTGATEWAY% goto CheckGateway :sleep rem: da es bei batch leider keinen ordentlichen sleep gibt, diese Krücke echo waiting for WLAN ping -n 65 localhost >NULL goto start