johannesschwenzer
Goto Top

Failover mit Mikrotik Router ab OS 7

Hallo werte community,

ich möchte ein Failover auf einem Mikrotik Router mit dem RouterOS7 einrichten. Leider gibt es dafür noch keine Dokumentation (oder ich habe sie nicht gefunden), der alte Weg mittels Packet tagging funktioniert nicht mehr.
Was soll erreicht werden:
Ich habe 2 Wan Interfaces Eth1 und Eth2 zu 2 Fritzboxen mit den respektiven gateways 192.168.178.1 & 192.168.179.1 .
Und 2 Routen mit Distance 1 zu Eth1 und Distance 2 zu Eth2. Wenn die Mainroute ausfällt soll der traffic über die andere Route laufen und wenn sie wieder up ist wieder über die Mainroute.

routes

Ich habe ein Script gefunden das nach erfolglosem ping auf eine definierte Adresse die Distanz der Route erhöht, sodass die andere Route genommen wird. Eigentlich sehr einfach und straight forward.

# ------------------- header -------------------
# Script by Tomas Kirnak, version 1.0.7
# If you use this script, or edit and
# re-use it, please keep the header intact.
#
# For more information and details about
# this script please visit the wiki page at
# http://wiki.mikrotik.com/wiki/Failover_Scripting
# ------------------- header -------------------



# ------------- start editing here -------------
# Edit the variables below to suit your needs

# Please fill the WAN interface names
:local InterfaceISP1 ether1
:local InterfaceISP2 ether2

# Please fill the gateway IPs (or interface names in case of PPP)
:local GatewayISP1 192.168.178.1
:local GatewayISP2 192.168.179.1

# Please fill the ping check host - currently: resolver1.opendns.com
:local PingTarget 8.8.8.8

# Please fill how many ping failures are allowed before fail-over happends
:local FailTreshold 3

# Define the distance increase of a route when it fails
:local DistanceIncrease 2

# Editing the script after this point may break it
# -------------- stop editing here --------------



# Declare the global variables
:global PingFailCountISP1
:global PingFailCountISP2

# This inicializes the PingFailCount variables, in case this is the 1st time the script has ran
:if ([:typeof $PingFailCountISP1] = "nothing") do={:set PingFailCountISP1 0}  
:if ([:typeof $PingFailCountISP2] = "nothing") do={:set PingFailCountISP2 0}  

# This variable will be used to keep results of individual ping attempts
:local PingResult



# Check ISP1
:set PingResult [ping $PingTarget count=1 interface=$InterfaceISP1]
:put $PingResult

:if ($PingResult = 0) do={
	:if ($PingFailCountISP1 < ($FailTreshold+2)) do={
		:set PingFailCountISP1 ($PingFailCountISP1 + 1)
		
		:if ($PingFailCountISP1 = $FailTreshold) do={
			:log warning "ISP1 has a problem en route to $PingTarget - increasing distance of routes."  
			:foreach i in=[/ip route find gateway=$GatewayISP1 && static] do=\
				{/ip route set $i distance=([/ip route get $i distance] + $DistanceIncrease)}
			:log warning "Route distance increase finished."  
		}
	}
}
:if ($PingResult = 1) do={
	:if ($PingFailCountISP1 > 0) do={
		:set PingFailCountISP1 ($PingFailCountISP1 - 1)
		
		:if ($PingFailCountISP1 = ($FailTreshold -1)) do={
			:log warning "ISP1 can reach $PingTarget again - bringing back original distance of routes."  
			:foreach i in=[/ip route find gateway=$GatewayISP1 && static] do=\
				{/ip route set $i distance=([/ip route get $i distance] - $DistanceIncrease)}
			:log warning "Route distance decrease finished."  
		}
	}
}



# Check ISP2
:set PingResult [ping $PingTarget count=1 interface=$InterfaceISP2]
:put $PingResult

:if ($PingResult = 0) do={
	:if ($PingFailCountISP2 < ($FailTreshold+2)) do={
		:set PingFailCountISP2 ($PingFailCountISP2 + 1)
		
		:if ($PingFailCountISP2 = $FailTreshold) do={
			:log warning "ISP2 has a problem en route to $PingTarget - increasing distance of routes."  
			:foreach i in=[/ip route find gateway=$GatewayISP2 && static] do=\
				{/ip route set $i distance=([/ip route get $i distance] + $DistanceIncrease)}
			:log warning "Route distance increase finished."  
		}
	}
}
:if ($PingResult = 1) do={
	:if ($PingFailCountISP2 > 0) do={
		:set PingFailCountISP2 ($PingFailCountISP2 - 1)
		
		:if ($PingFailCountISP2 = ($FailTreshold -1)) do={
			:log warning "ISP2 can reach $PingTarget again - bringing back original distance of routes."  
			:foreach i in=[/ip route find gateway=$GatewayISP2 && static] do=\
				{/ip route set $i distance=([/ip route get $i distance] - $DistanceIncrease)}
			:log warning "Route distance decrease finished."  
		}
	}
}

Leider funktioniert es bei mir noch nicht, da der Ping vom Ether2 immer failed.

:set PingResult [ping $PingTarget count=1 interface=$InterfaceISP2]
:put $PingResult

Woran könnte das liegen? Ich habe Ether2 wie Ether1 konfiguriert nur auf ein anderes Gateway. Muss ich den Port noch explizit als WAN Schnittstelle definieren?
Internetzugriff über das Gateway von Ether2 ist da und wenn ich die mainroute per hand auf ether2 umstelle funktioniert auch alles.


Danke und Grüße,
Johannes

Content-Key: 1407215357

Url: https://administrator.de/contentid/1407215357

Printed on: April 27, 2024 at 00:04 o'clock

Member: aqui
aqui Oct 19, 2021 updated at 17:47:49 (UTC)
Goto Top
Ich habe Ether2 wie Ether1 konfiguriert nur auf ein anderes Gateway
Ein WinBox Screenshot dazu wäre hier für alle sehr hilfreich gewesen. Leider hat es ja dazu nicht gereicht. face-sad
Wenn man dich jetzt beim Wort nimmt ist das schon falsch, denn schon IP Adresseitig darf eth2 natürlich niemals wie eth1 konfiguriert sein, also NICHT gleich !
Beispiel wie es auszusehen hat:
  • eth1 = IP: 192.168.178.254, Maske: /24
  • eth2 = IP: 192.168.179.254, Maske: /24
  • Default Route 0.0.0.0/0 auf 192.168.178.1
  • Default Route 0.0.0.0/0 auf 192.168.179.1
Member: JohannesSchwenzer
JohannesSchwenzer Oct 19, 2021 at 17:58:00 (UTC)
Goto Top
Hallo,

hmmm ja das ist klar. Genau wie in deinem Beispiel ist es auch konfiguriert.

screenshot 2021-10-19 195726
Member: aqui
Solution aqui Oct 19, 2021 updated at 18:06:51 (UTC)
Goto Top
Dann hast du alles richtig gemacht !
Ein Ping über das Ping Tool des MT sollte dann jeweils beide FritzBox LAN Adressen pingen können !
Über beide Links muss auch ein Pingen von 8.8.8.8 möglich sein.
Das kannst du linkweise erzwingen indem du in den Advanced Settings als Absender IP einmal die .178.254 und einmal die .179.254 angibst.
Ohne Scripting bzw. Ausfall würde der Router im Default bei statischer Default Route gleicher Cost ein Session basiertes Load Balancing über beide Links machen.
Member: JohannesSchwenzer
JohannesSchwenzer Oct 19, 2021 at 18:22:58 (UTC)
Goto Top
Hier noch der output der pings

screenshot 2021-10-19 202148
Member: JohannesSchwenzer
JohannesSchwenzer Oct 19, 2021 at 18:33:08 (UTC)
Goto Top
Zitat von @aqui:

Ohne Scripting bzw. Ausfall würde der Router im Default bei statischer Default Route gleicher Cost ein Session basiertes Load Balancing über beide Links machen.

Genau da war der Fehler, ich habe der einen Route höhere Priorität gegeben und dadurch kam der Ping über das Interface mit der Route niedrigerer Priorität nicht durch. Wenn beide Routen die gleiche Distance haben funktioniert es problemlos.
Ich lasse das Script mal stehen, falls jemand ein Setup mit einer designierten Failoverleitung ohne load balancing damit realisieren will.

Danke für die Hilfe!
Member: aqui
aqui Oct 20, 2021 at 15:17:43 (UTC)
Goto Top
Deshalb stand ja auch oben "...statischer Default Route gleicher Cost " face-wink
Member: JohannesSchwenzer
JohannesSchwenzer Oct 20, 2021 at 15:26:50 (UTC)
Goto Top
Genau. Deshalb ist dieser Beitrag an der Stelle zitiert und als Lösung markiert ^^
Mitglied: 149569
149569 Oct 23, 2021 updated at 10:07:15 (UTC)
Goto Top
Für's Failover und dem Check von externen Hosts statt dem direkt vorgelagerten Gateway (was ja bei lokalen Devices wenig Sinn macht) gibt es auch Lösungen ohne Skript mittels rekursiven Routen in der Routing-Table
https://help.mikrotik.com/docs/pages/viewpage.action?pageId=26476608
https://forum.mikrotik.com/viewtopic.php?t=157048
der alte Weg mittels Packet tagging funktioniert nicht mehr.
Natürlich funktioniert das auch mittels tagging, wieso auch nicht?!
Failover With Firewall Marking
Member: JohannesSchwenzer
JohannesSchwenzer Oct 23, 2021 updated at 11:10:03 (UTC)
Goto Top
Natürlich funktioniert das auch mittels tagging, wieso auch nicht?!
[https://help.mikrotik.com/docs/display/ROS/Firewall+Marking Failover With Firewall Marking

Das ist für Router OS6. Ab Router OS 7 ist die in deinem Link beschriebene Vorgehensweise nicht mehr möglich. Recursive routing und firewall marking funktionieren in OS7 noch nicht.
Mitglied: 149569
149569 Oct 23, 2021 updated at 11:38:40 (UTC)
Goto Top
Zitat von @JohannesSchwenzer:
Das ist für Router OS6. Ab Router OS 7 ist die in deinem Link beschriebene Vorgehensweise nicht mehr möglich. Recursive routing und firewall marking funktionieren in OS7 noch nicht.
Für Recursive Routing stimmt das , aber das markieren via mangle funktioniert hier auch in der 7.1 rc4 problemlos, oder verwendest du ROS7.0 auf einem RB5009?. Es ist nur so das hier ein paar Befehle in ROS7 zu Routen anders sind weil dort die Routing-Tabellen erst angelegt werden müssen.
Member: JohannesSchwenzer
JohannesSchwenzer Oct 23, 2021 at 11:57:20 (UTC)
Goto Top
Es ist nur so das hier ein paar Befehle in ROS7 zu Routen anders sind weil dort die Routing-Tabellen erst angelegt werden müssen.

Hast du einen Link mit Dokumentation dazu?
Ich glaube ich hatte irgendwo einen Thread gelesen, indem das auch mit neu angelegten Routing Tabellen nicht gelöst werden konnte und habe mich dann deshalb für die Scriptvariante entschieden.
Mitglied: 149569
149569 Oct 23, 2021 updated at 13:59:29 (UTC)
Goto Top
Zitat von @JohannesSchwenzer:
Hast du einen Link mit Dokumentation dazu?
Du musst ja nur mal versuchen ein Routing-Tag zu verwenden ohne das du vorher die Routing-Tabelle über /routing/table" angelegt hast, funktioniert nämlich nicht. Ab Router OS7 muss man zwingend die Table immer erst anlegen bevor man in Routing-Rules oder Firewall-Mangle-Regeln. In RouterOS6 brauchte man das nicht, aber ROS7 ist das Pflicht.
https://help.mikrotik.com/docs/pages/viewpage.action?pageId=59965508