MANUAL: Mikrotik, dual WAN failover, con rutas recursivas

Nada, sin prisa.

Lo estuve revisando un rato más después de escribir el mensaje y también he visto que, comparando con las rutas del manual del PCC, esas tenían ambas distancia 1 y las de este manual, las de la conexión principal van con distancia 1 y las del respaldo con distancia 2.

La cabeza no me daba para más ya y lo dejé en ese punto pero supongo que tengo que ajustar alguna cosilla más con respecto a esto.

Pero bueno, mañana es otro día jejeje
 
Tu configuración quedaría algo así:
Código:
# Routing tables
/routing table
add fib name=wan1
add fib name=wan2

# Routes (las dos primeras las metería el script)
/ip route
# add comment=recursive-wan1 dst-address=1.1.1.1 gateway=$gatewayWAN1 scope=10
# add comment=recursive-wan2 dst-address=9.9.9.9 gateway=$gatewayWAN2 scope=10

add check-gateway=ping comment=default-wan1 distance=1 gateway=1.1.1.1 scope=10 target-scope=11
add check-gateway=ping comment=default-wan2 distance=2 gateway=9.9.9.9 scope=10 target-scope=11

add check-gateway=ping comment=balanced-wan1 distance=1 gateway=1.1.1.1 scope=10 target-scope=11 routing-table=wan1
add check-gateway=ping comment=balanced-wan2 distance=1 gateway=9.9.9.9 scope=10 target-scope=11 routing-table=wan2

# Mangle
/ip firewall mangle
add action=accept chain=prerouting comment="bypass wan1 segment" dst-address=192.168.10.0/24 \
    in-interface=bridge
add action=accept chain=prerouting comment="bypass wan2 segment" dst-address=192.168.0.0/24 \
    in-interface=bridge

add action=mark-connection chain=prerouting comment="mark connections" \
    connection-mark=no-mark in-interface=wan1 \
    new-connection-mark=wan1_conn passthrough=yes
add action=mark-connection chain=prerouting connection-mark=no-mark \
    in-interface=wan2 new-connection-mark=wan2_conn passthrough=yes
add action=mark-connection chain=prerouting connection-mark=no-mark \
    dst-address-type=!local in-interface=bridge new-connection-mark=\
    wan1_conn passthrough=yes per-connection-classifier=both-addresses:2/0
add action=mark-connection chain=prerouting connection-mark=no-mark \
    dst-address-type=!local in-interface=bridge new-connection-mark=wan2_conn \
    passthrough=yes per-connection-classifier=both-addresses:2/1

add action=mark-routing chain=prerouting comment="mark routing" \
    connection-mark=wan1_conn in-interface=bridge new-routing-mark=\
    wan1 passthrough=no
add action=mark-routing chain=prerouting connection-mark=wan2_conn in-interface=\
    bridge new-routing-mark=wan2 passthrough=no
add action=mark-routing chain=output connection-mark=wan1_conn \
    new-routing-mark=wan1 passthrough=no
add action=mark-routing chain=output connection-mark=wan2_conn new-routing-mark=\
    wan2 passthrough=no

Como ves, la única ruta que tenemos que trabajar a nivel de script DHCP es la ruta recursiva, que es la que lleva el gateway que no conocemos. El script te quedaría algo así:

Para la WAN1
Código:
{
  :local scope 10
  :local rmonitor 1.1.1.1
  :local rcomment "recursive-wan1"
  :local rcount [/ip route print count-only where comment=$rcomment]
  :if ($bound=1) do={
    :if ($rcount = 0) do={
      /ip route add dst-address=$rmonitor gateway=$"gateway-address" comment=$rcomment scope=$scope
    } else={
        :if ($rcount = 1) do={
          :local test [/ip route find where comment=$rcomment]
          :if ([/ip route get $test gateway] != $"gateway-address") do={
            /ip route set $test gateway=$"gateway-address"
          }
        } else={
            :error "Multiple routes found with the same comment!"
        }
    }
  } else={
      /ip route remove [find comment=$rcomment]
  }
}

Para la WAN2
Código:
{
  :local scope 10
  :local rmonitor 9.9.9.9
  :local rcomment "recursive-wan2"
  :local rcount [/ip route print count-only where comment=$rcomment]
  :if ($bound=1) do={
    :if ($rcount = 0) do={
      /ip route add dst-address=$rmonitor gateway=$"gateway-address" comment=$rcomment scope=$scope
    } else={
        :if ($rcount = 1) do={
          :local test [/ip route find where comment=$rcomment]
          :if ([/ip route get $test gateway] != $"gateway-address") do={
            /ip route set $test gateway=$"gateway-address"
          }
        } else={
            :error "Multiple routes found with the same comment!"
        }
    }
  } else={
      /ip route remove [find comment=$rcomment]
  }
}

Las otras 4 rutas puedes darlas de alta a mano, ya que conoces todos sus parámetros. Las balanceadas son copia de las rutas por defecto que definimos en el manual de recursivas, pero con la misma distancia=1 y cada una apuntando a su routing table correspondiente.

Saludos!
 
Uhmmmmm leyendo el código por encima creo que puedo seguirlo bien para ajustarlo a mi config jejeje

A ver si saco un ratillo más tarde y lo pruebo.

Pero tiene buena pinta!

Mil gracias por tu ayuda, @pokoyo! Te comentaré con lo que sea.
 
Vale. Creo que lo tengo funcionando todo correctamente (a esperas de que en un par de semanas lo monte en el sitio definitivo y pase la prueba de fuego jeje).

Esta última parte, la de las rutas recursivas, no hubiese sido capaz de no ser por tu inestimable ayuda, @pokoyo!

Sólo por curiosidad, me llama la atención la cantidad de rutas que me aparecen ahora (es cierto que la mayoría son dinámicas):

1664490254942.png


A diferencia del otro día, hoy estoy probando con otro equipo y en otra ubicación, por lo que tengo simulando a mis dos ISPs una red en la 172.16.0.0/24 y otra en la 192.168.0.1/24, por eso no coinciden con mis mensajes anteriores.

Entiendo que está todo ok, no? Es que aquí ya me empiezo a hacer un lío con las recursivas. Aunque a grandes rasgos entiendo el funcionamiento me falta terminar de asimilar cómo está montada toda esta parte. Y las horas a las que posteo no ayudan jajaja.

Además, tampoco puedo desconectar la fibra y ver si fuerzo a salir por el otro ISP porque en realidad ambas redes simulando los ISPs están en mi mikrotik de cabecera. Pero probando a tirar las interfaces sí veo que se borran las rutas asociadas a ellas.

También he observado que tanto la wan1 como la wan2 siguen cursando tráfico indistintamente así que el balanceo está correcto.

1664490818587.png

La diferencia también es porque ahora mismo tengo una limitación de caudal en la wan2, por eso cursa menos tráfico a la hora de hacer test de velocidad.

Por último, pongo por aquí un export de mi config. Parte de un reset y valores de fábrica. Más que para que me digáis si está bien o mal (que también será bienvenida cualquier corrección), por si a alguien le sirve de ayuda o por si se puede/quiere currar un manual para integrar el balanceo de carga y el failover con rutas recursivas. Sinceramente, a mí mientras no me estudie bien las rutas recursivas me queda un pelín grande jeje.

La diferencia con los pasos del manual de @pokoyo es que me he saltado la parte del bypass en el mangle porque no lo necesitaba para mi escenario, pero no es difícil de añadir a ese futuro manual. Todo lo demás creo que es calcado (bueno, y que no tengo un pppoe).

Código:
/interface ethernet
set [ find default-name=ether1 ] name=wan1
set [ find default-name=ether2 ] name=wan2
/interface list
add comment=defconf name=WAN
add comment=defconf name=LAN
/interface wireless security-profiles
set [ find default=yes ] supplicant-identity=MikroTik
/ip pool
add name=dhcp_pool1 ranges=192.168.88.10-192.168.88.254
/ip dhcp-server
add address-pool=dhcp_pool1 interface=bridge name=dhcp1
/port
set 0 name=serial0
/routing table
add disabled=no fib name=to_wan1
add disabled=no fib name=to_wan2
/interface bridge port
add bridge=bridge comment=defconf interface=ether3
add bridge=bridge comment=defconf interface=ether4
add bridge=bridge comment=defconf interface=ether5
add bridge=bridge comment=defconf interface=ether6
add bridge=bridge comment=defconf interface=ether7
add bridge=bridge comment=defconf interface=ether8
add bridge=bridge comment=defconf interface=ether9
add bridge=bridge comment=defconf interface=ether10
add bridge=bridge comment=defconf interface=sfp1
/ip neighbor discovery-settings
set discover-interface-list=LAN
/interface list member
add comment=defconf interface=bridge list=LAN
add comment=defconf interface=wan1 list=WAN
add interface=wan2 list=WAN
/ip address
add address=192.168.88.1/24 comment=defconf interface=bridge network=\
    192.168.88.0
/ip dhcp-client
add interface=wan1 script="{\r\
    \n  :local scope 10\r\
    \n  :local rmonitor 1.1.1.1\r\
    \n  :local rcomment \"recursive-wan1\"\r\
    \n  :local rcount [/ip route print count-only where comment=\$rcomment]\r\
    \n  :if (\$bound=1) do={\r\
    \n    :if (\$rcount = 0) do={\r\
    \n      /ip route add dst-address=\$rmonitor gateway=\$\"gateway-address\"\
    \_comment=\$rcomment scope=\$scope\r\
    \n    } else={\r\
    \n        :if (\$rcount = 1) do={\r\
    \n          :local test [/ip route find where comment=\$rcomment]\r\
    \n          :if ([/ip route get \$test gateway] != \$\"gateway-address\") \
    do={\r\
    \n            /ip route set \$test gateway=\$\"gateway-address\"\r\
    \n          }\r\
    \n        } else={\r\
    \n            :error \"Multiple routes found with the same comment!\"\r\
    \n        }\r\
    \n    }\r\
    \n  } else={\r\
    \n      /ip route remove [find comment=\$rcomment]\r\
    \n  }\r\
    \n}\r\
    \n"
add default-route-distance=2 interface=wan2 script="{\r\
    \n  :local scope 10\r\
    \n  :local rmonitor 9.9.9.9\r\
    \n  :local rcomment \"recursive-wan2\"\r\
    \n  :local rcount [/ip route print count-only where comment=\$rcomment]\r\
    \n  :if (\$bound=1) do={\r\
    \n    :if (\$rcount = 0) do={\r\
    \n      /ip route add dst-address=\$rmonitor gateway=\$\"gateway-address\"\
    \_comment=\$rcomment scope=\$scope\r\
    \n    } else={\r\
    \n        :if (\$rcount = 1) do={\r\
    \n          :local test [/ip route find where comment=\$rcomment]\r\
    \n          :if ([/ip route get \$test gateway] != \$\"gateway-address\") \
    do={\r\
    \n            /ip route set \$test gateway=\$\"gateway-address\"\r\
    \n          }\r\
    \n        } else={\r\
    \n            :error \"Multiple routes found with the same comment!\"\r\
    \n        }\r\
    \n    }\r\
    \n  } else={\r\
    \n      /ip route remove [find comment=\$rcomment]\r\
    \n  }\r\
    \n}"
/ip dhcp-server network
add address=192.168.8.0/24 dns-server=8.8.8.8,8.8.4.4 gateway=192.168.8.1
add address=192.168.88.0/24 comment=defconf dns-server=192.168.88.1 gateway=\
    192.168.88.1
/ip dns
set allow-remote-requests=yes
/ip dns static
add address=192.168.88.1 comment=defconf name=router.lan
/ip firewall filter
add action=accept chain=input comment=\
    "defconf: accept established,related,untracked" connection-state=\
    established,related,untracked
add action=drop chain=input comment="defconf: drop invalid" connection-state=\
    invalid
add action=accept chain=input comment="defconf: accept ICMP" protocol=icmp
add action=accept chain=input comment=\
    "defconf: accept to local loopback (for CAPsMAN)" dst-address=127.0.0.1
add action=drop chain=input comment="defconf: drop all not coming from LAN" \
    in-interface-list=!LAN
add action=accept chain=forward comment="defconf: accept in ipsec policy" \
    ipsec-policy=in,ipsec
add action=accept chain=forward comment="defconf: accept out ipsec policy" \
    ipsec-policy=out,ipsec
add action=fasttrack-connection chain=forward comment="defconf: fasttrack" \
    connection-state=established,related disabled=yes hw-offload=yes
add action=accept chain=forward comment=\
    "defconf: accept established,related, untracked" connection-state=\
    established,related,untracked
add action=drop chain=forward comment="defconf: drop invalid" \
    connection-state=invalid
add action=drop chain=forward comment=\
    "defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \
    connection-state=new in-interface-list=WAN
/ip firewall mangle
add action=mark-connection chain=prerouting comment="mark connections" \
    connection-mark=no-mark in-interface=wan1 new-connection-mark=wan1_conn \
    passthrough=yes
add action=mark-connection chain=prerouting connection-mark=no-mark \
    in-interface=wan2 new-connection-mark=wan2_conn passthrough=yes
add action=mark-connection chain=prerouting connection-mark=no-mark \
    dst-address-type=!local in-interface=bridge new-connection-mark=wan1_conn \
    passthrough=yes per-connection-classifier=both-addresses:2/0
add action=mark-connection chain=prerouting connection-mark=no-mark \
    dst-address-type=!local in-interface=bridge new-connection-mark=wan2_conn \
    passthrough=yes per-connection-classifier=both-addresses:2/1
add action=mark-routing chain=prerouting comment="mark routing" \
    connection-mark=wan1_conn in-interface=bridge new-routing-mark=to_wan1 \
    passthrough=no
add action=mark-routing chain=prerouting connection-mark=wan2_conn \
    in-interface=bridge new-routing-mark=to_wan2 passthrough=no
add action=mark-routing chain=output connection-mark=wan1_conn \
    new-routing-mark=to_wan1 passthrough=no
add action=mark-routing chain=output connection-mark=wan2_conn \
    new-routing-mark=to_wan2 passthrough=no
/ip firewall nat
add action=masquerade chain=srcnat comment="defconf: masquerade" \
    ipsec-policy=out,none out-interface-list=WAN
/ip route
add check-gateway=ping comment=default-wan1 distance=1 gateway=1.1.1.1 scope=\
    10 target-scope=11
add check-gateway=ping comment=default-wan2 distance=2 gateway=9.9.9.9 scope=\
    10 target-scope=11
add check-gateway=ping comment=balanced-wan1 distance=1 gateway=1.1.1.1 \
    routing-table=to_wan1 scope=10 target-scope=11
add check-gateway=ping comment=balanced-wan2 distance=1 gateway=9.9.9.9 \
    routing-table=to_wan2 scope=10 target-scope=11
add comment=recursive-wan2 disabled=no distance=1 dst-address=9.9.9.9/32 \
    gateway=192.168.0.1 pref-src="" routing-table=main scope=10 \
    suppress-hw-offload=no target-scope=10
add comment=recursive-wan1 dst-address=1.1.1.1 gateway=172.16.0.1 scope=10
/ipv6 firewall address-list
add address=::/128 comment="defconf: unspecified address" list=bad_ipv6
add address=::1/128 comment="defconf: lo" list=bad_ipv6
add address=fec0::/10 comment="defconf: site-local" list=bad_ipv6
add address=::ffff:0.0.0.0/96 comment="defconf: ipv4-mapped" list=bad_ipv6
add address=::/96 comment="defconf: ipv4 compat" list=bad_ipv6
add address=100::/64 comment="defconf: discard only " list=bad_ipv6
add address=2001:db8::/32 comment="defconf: documentation" list=bad_ipv6
add address=2001:10::/28 comment="defconf: ORCHID" list=bad_ipv6
add address=3ffe::/16 comment="defconf: 6bone" list=bad_ipv6
/ipv6 firewall filter
add action=accept chain=input comment=\
    "defconf: accept established,related,untracked" connection-state=\
    established,related,untracked
add action=drop chain=input comment="defconf: drop invalid" connection-state=\
    invalid
add action=accept chain=input comment="defconf: accept ICMPv6" protocol=\
    icmpv6
add action=accept chain=input comment="defconf: accept UDP traceroute" port=\
    33434-33534 protocol=udp
add action=accept chain=input comment=\
    "defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=\
    udp src-address=fe80::/10
add action=accept chain=input comment="defconf: accept IKE" dst-port=500,4500 \
    protocol=udp
add action=accept chain=input comment="defconf: accept ipsec AH" protocol=\
    ipsec-ah
add action=accept chain=input comment="defconf: accept ipsec ESP" protocol=\
    ipsec-esp
add action=accept chain=input comment=\
    "defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec
add action=drop chain=input comment=\
    "defconf: drop everything else not coming from LAN" in-interface-list=\
    !LAN
add action=accept chain=forward comment=\
    "defconf: accept established,related,untracked" connection-state=\
    established,related,untracked
add action=drop chain=forward comment="defconf: drop invalid" \
    connection-state=invalid
add action=drop chain=forward comment=\
    "defconf: drop packets with bad src ipv6" src-address-list=bad_ipv6
add action=drop chain=forward comment=\
    "defconf: drop packets with bad dst ipv6" dst-address-list=bad_ipv6
add action=drop chain=forward comment="defconf: rfc4890 drop hop-limit=1" \
    hop-limit=equal:1 protocol=icmpv6
add action=accept chain=forward comment="defconf: accept ICMPv6" protocol=\
    icmpv6
add action=accept chain=forward comment="defconf: accept HIP" protocol=139
add action=accept chain=forward comment="defconf: accept IKE" dst-port=\
    500,4500 protocol=udp
add action=accept chain=forward comment="defconf: accept ipsec AH" protocol=\
    ipsec-ah
add action=accept chain=forward comment="defconf: accept ipsec ESP" protocol=\
    ipsec-esp
add action=accept chain=forward comment=\
    "defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec
add action=drop chain=forward comment=\
    "defconf: drop everything else not coming from LAN" in-interface-list=\
    !LAN
/system clock
set time-zone-name=Europe/Madrid
/tool mac-server
set allowed-interface-list=LAN
/tool mac-server mac-winbox
set allowed-interface-list=LAN

Como siempre, mil gracias a todos los que hacéis que cosas como esta sean posibles para gente como yo!
 

Adjuntos

  • 1664490795252.png
    1664490795252.png
    38.5 KB · Visitas: 25
Última edición:
Entiendo que está todo ok, no? Es que aquí ya me empiezo a hacer un lío con las recursivas. Aunque a grandes rasgos entiendo el funcionamiento me falta terminar de asimilar cómo está montada toda esta parte. Y las horas a las que posteo no ayudan jajaja.
Casi. Has creado las rutas recursivas dos veces: una vez a mano (en /ip routes, las últimas dos que aparecen en tu lista), otra desde el script del dhcp (primeras dos rutas). Además, no debes setear las distancias en ellas desde el cliente DHCP, ya que ambas irían con distancia = 1 (la segunda la tienes con distancia 2).

Pero, para el caso que te ocupa, en lugar de meterlas por DHCP, las puedes meter a mano, ya que conoces las IP's del gateway. No obstante, está bien que conozcas cómo se hace el script vía DHCP, porque es como te tocará hacerlas en verdad cuando conectes eso a una ONT.

La diferencia con los pasos del manual de @pokoyo es que me he saltado la parte del bypass en el mangle porque no lo necesitaba para mi escenario, pero no es difícil de añadir a ese futuro manual. Todo lo demás creo que es calcado (bueno, y que no tengo un pppoe).
Pues justo te has saltado la parte más importante, me explico: cuando en ambas WAN tengas IP públicas, esas reglas de bypass no serán interesantes, puesto que tú rara vez vas a querer llegar a la subred del operador que tienes por encima. Pero, si lo que tienes encima son dos subredes privadas, esas reglas de bypass es lo que hacen que desde tu loca cuando vayas a por un equipo de la subred A siempre salgas por ether1, mientras que si vas a por B, siempre salgas por ether2. Sin ellas, el balanceo entra en juego, y saldrías para arriba por A o B indistintamente de a dónde quisieras ir (y tendrías un 50% de posibilidades de acertar). Esas dos reglas de bypass lo que hacen es saltarse todo el resto del mangle, para que cuando vayas a la subred del router que tienes en ether1, siempre vayas por esa interfaz, y no por la otra (es decir, NO balancees).

Cuando tengas eso conectado a IP's públicas, entonces sí puedes omitir esas dos reglas, puesto que no te añadirían nada.

Saludos!
 
Madre mía, la que estaba liando... Y yo pensando que lo tenía listo!

Después desde casa edito el post anterior para que nadie se lleve a confusión si no sigue leyendo, que desde el móvil es un engorro.

Y corregiré la config, claro.

En serio, mil gracias @pokoyo!
 
Madre mía, la que estaba liando... Y yo pensando que lo tenía listo!

Después desde casa edito el post anterior para que nadie se lleve a confusión si no sigue leyendo, que desde el móvil es un engorro.

Y corregiré la config, claro.

En serio, mil gracias @pokoyo!
De nada hombre. Ya me dirás cuando lo montes en el sitio final qué tal te funciona, y si lo podemos mejorar en algo. Cuando hagas la instalación definitiva, me pasas si quieres un export como este (si ves algo sensible, por privado) y le damos un vistazo general para asegurar que no hay nada raro.

Ah, y recuerda algo muy importante: las sondas que elijas (los DNS públicos) que sean IP's que no se usen dentro de esa red. Es decir, que ni el router ni ningún servidor DNS tenga esas mismas IP's como servidores de upstream, o la lias parda (esa IP siempre se resolverá por una de las WAN en concreto, no por la otra, así que puedes dejar efectivamente sin DNS a la red, si la usas también dentro).

Saludos!
 
Casi. Has creado las rutas recursivas dos veces: una vez a mano (en /ip routes, las últimas dos que aparecen en tu lista), otra desde el script del dhcp (primeras dos rutas). Además, no debes setear las distancias en ellas desde el cliente DHCP, ya que ambas irían con distancia = 1 (la segunda la tienes con distancia 2).
Vale, me habían ido quedando cosillas de mezclar los dos manuales jejeje. Tenía marcadas ambas casillas de Add Default Route -> yes. Más la que mete el script, resultado: duplicadas. Creo que con esto queda resuelto.

1664576091112.png



Pero, para el caso que te ocupa, en lugar de meterlas por DHCP, las puedes meter a mano, ya que conoces las IP's del gateway. No obstante, está bien que conozcas cómo se hace el script vía DHCP, porque es como te tocará hacerlas en verdad cuando conectes eso a una ONT.
Ok. Entendido también.

dremi dijo:
La diferencia con los pasos del manual de @pokoyo es que me he saltado la parte del bypass en el mangle porque no lo necesitaba para mi escenario, pero no es difícil de añadir a ese futuro manual. Todo lo demás creo que es calcado (bueno, y que no tengo un pppoe).

Pues justo te has saltado la parte más importante, me explico: cuando en ambas WAN tengas IP públicas, esas reglas de bypass no serán interesantes, puesto que tú rara vez vas a querer llegar a la subred del operador que tienes por encima. Pero, si lo que tienes encima son dos subredes privadas, esas reglas de bypass es lo que hacen que desde tu loca cuando vayas a por un equipo de la subred A siempre salgas por ether1, mientras que si vas a por B, siempre salgas por ether2. Sin ellas, el balanceo entra en juego, y saldrías para arriba por A o B indistintamente de a dónde quisieras ir (y tendrías un 50% de posibilidades de acertar). Esas dos reglas de bypass lo que hacen es saltarse todo el resto del mangle, para que cuando vayas a la subred del router que tienes en ether1, siempre vayas por esa interfaz, y no por la otra (es decir, NO balancees).
Ahm, vale! La verdad que cuando vi las reglas en el código que posteaste en respuesta a mis dudas, pensé que este bypass era por el mismo motivo que en el otro manual de PCC + failover, que hacías referencia a la VoIP de Movistar/O2. Y como en mi escenario no tengo servicio de voz, por eso la estaba saltando.

Pero ahora, una vez comprendido el verdadero motivo, ya lo he metido. Al menos mientras esté detrás de routers de operadora me puede venir bien jeje.

Estoy peleándome un poquillo con unos scripts que estoy creando para automatizar ésto último y cuando lo tenga listo pongo por aquí el export, a ver si es la definitiva jeje
 

Adjuntos

  • 1664575498555.png
    1664575498555.png
    36.9 KB · Visitas: 25
Bueno. Creo que ahora sí tengo integrados los dos manuales de balanceo de carga y failover con rutas recursivas.

En algún que otro rato libre he seguido haciendo cambios para añadir unos scripts para automatizar alguna cosilla pero creo que se exceden de lo comentado en este hilo.

Así que para no desviarlo demasiado ni hacerlo más confuso pego por aquí mi export completamente limpio y con unas pequeñas anotaciones por si alguien lo quiere utilizar de base. Las explicaciones completas están en ambos manuales de @pokoyo. Contra eso no puedo competir jejeje. Si alguien va a seguir los pasos que pongo a continuación, le recomiendo encarecidamente que primero lea esos otros dos posts para entender qué estamos haciendo.

Como siempre, partimos de un reset y una configuración por defecto. Además, en mi caso concreto, al tenerlo montado en un escenario de pruebas, estoy detrás de sendos routers de operadora (en realidad detrás de un Mikrotik y un router de Vodafone pero ambas son conexiones independientes). Si alguien lo monta obteniendo directamente unas ips públicas (Módem, ONT o router en modo bridge) deberá configurar su tipo de conexión en el DHCP-Client.

Cualquier aportación, sugerencia, crítica o correción siempre será bienvenida.

Por falta de tiempo no puedo crear estos días un manual completo en un hilo aparte. Pero si alguien quiere hacerlo, el siguiente código también está a su disposición. Si más adelante encuentro algún hueco intentaré hacerlo yo (pero no prometo nada jajaja).

Sin más, aquí va el código autocomentado:

Código:
#Deshabilitamos la regla de fasttrack.
#REQUIERE REINICIO PARA QUE SEA EFECTIVO.

/ip firewall filter
set [find where comment="defconf: fasttrack"] disabled=yes

############################################
# Reiniciar el Mikrotik antes de continuar #
############################################




#Sacamos el puerto ether2 del bridge ya que ahora será la wan2.
#La wan1 seguirá siendo el puerto ether1.

/interface bridge port
remove [find where interface="ether2"]




#Renombramos las interfaces ether1 y ether2 para facilitar la lectura de los comandos

/interface ethernet
set [ find default-name=ether1 ] name=wan1
set [ find default-name=ether2 ] name=wan2




#Metemos la segunda WAN en la lista por defecto

/interface list member
add interface=wan2 list=WAN




#Creamos las rutas.

/routing table
add disabled=no fib name=to_wan1
add disabled=no fib name=to_wan2




#Configuramos el marcado de paquetes (mangle).
#Para el bypass, si queremos llegar a las subredes de los routers de operadora
#que tenemos por encima de nuestro Mikrotik debemos configurar el rango
#según nuestros requisitos.
#Si obtenemos directamente una IP pública (ONT, router de operadora en bridge, etc)
#podemos omitir las siguientes dos reglas.

/ip firewall mangle
add action=accept chain=prerouting comment="bypass wan1 segment" dst-address=\
    192.168.10.0/24 in-interface=bridge
add action=accept chain=prerouting comment="bypass wan2 segment" dst-address=\
    192.168.11.0/24 in-interface=bridge




#Marcamos los paquetes entrantes según la WAN por la que lo hagan.

/ip firewall mangle
add action=mark-connection chain=prerouting comment="mark connections" \
    connection-mark=no-mark in-interface=wan1 new-connection-mark=wan1_conn \
    passthrough=yes
add action=mark-connection chain=prerouting connection-mark=no-mark \
    in-interface=wan2 new-connection-mark=wan2_conn passthrough=yes




#Marcamos los paquetes con salida hacia internet
#y los repartimos entre ambas interfaces (per-conection-clasifier)

/ip firewall mangle
add action=mark-connection chain=prerouting connection-mark=no-mark \
    dst-address-type=!local in-interface=bridge new-connection-mark=wan1_conn \
    passthrough=yes per-connection-classifier=both-addresses:2/0
add action=mark-connection chain=prerouting connection-mark=no-mark \
    dst-address-type=!local in-interface=bridge new-connection-mark=wan2_conn \
    passthrough=yes per-connection-classifier=both-addresses:2/1




#Creamos las reglas para enrutar los paquetes marcados como wan1 por dicha interfaz
#y los marcados como wan2 por la otra.

/ip firewall mangle
add action=mark-routing chain=prerouting comment="mark routing" \
    connection-mark=wan1_conn in-interface=bridge new-routing-mark=to_wan1 \
    passthrough=no
add action=mark-routing chain=prerouting connection-mark=wan2_conn \
    in-interface=bridge new-routing-mark=to_wan2 passthrough=no
add action=mark-routing chain=output connection-mark=wan1_conn \
    new-routing-mark=to_wan1 passthrough=no
add action=mark-routing chain=output connection-mark=wan2_conn \
    new-routing-mark=to_wan2 passthrough=no




#Creamos las rutas por defecto y las balanceadas.
#Las balanceadas tendrán en cuenta la marca de mangle
#para decidir si salen por una wan u otra.
#Las default son por si falla algo en la config, por si
#algún motivo el paquete no tiene marca o por si se cae una wan
#poder salir por la otra a pesar de la marca del paquete.
#Dentro de las default, priorizaremos la wan1 frente a la wan2.

/ip route
add check-gateway=ping comment=default-wan1 distance=1 gateway=1.1.1.1 scope=\
    10 target-scope=11
add check-gateway=ping comment=default-wan2 distance=2 gateway=9.9.9.9 scope=\
    10 target-scope=11
add check-gateway=ping comment=balanced-wan1 distance=1 gateway=1.1.1.1 \
    routing-table=to_wan1 scope=10 target-scope=11
add check-gateway=ping comment=balanced-wan2 distance=1 gateway=9.9.9.9 \
    routing-table=to_wan2 scope=10 target-scope=11




#Borramos el DHCP-Client por defecto e
#introducimos los scripts para las rutas recursivas en los
#DHCP Clients de los que obtendremos nuestras IPs WAN.
#Crearán de manera automática las rutas en la tabla /ip routes
#en función de si hay salida a internet por cada wan (1 o 2).
#En este ejemplo obtenemos la IP de sendos routers de operadora.
#Para pppoe y otros tipos de conexión mirar otros modelos.

#ATENCIÓN: Monitorizaremos las IPs públicas 1.1.1.1 y 9.9.9.9
#NO utilizar estas IPs en ningún otro sitio de nuestra red.

/ip dhcp-client
remove [find where comment="defconf"]
add add-default-route=no interface=wan1 script="{\r\
    \n  :local scope 10\r\
    \n  :local rmonitor 1.1.1.1\r\
    \n  :local rcomment \"recursive-wan1\"\r\
    \n  :local rcount [/ip route print count-only where comment=\$rcomment]\r\
    \n  :if (\$bound=1) do={\r\
    \n    :if (\$rcount = 0) do={\r\
    \n      /ip route add dst-address=\$rmonitor gateway=\$\"gateway-address\"\
    \_comment=\$rcomment scope=\$scope\r\
    \n    } else={\r\
    \n        :if (\$rcount = 1) do={\r\
    \n          :local test [/ip route find where comment=\$rcomment]\r\
    \n          :if ([/ip route get \$test gateway] != \$\"gateway-address\") \
    do={\r\
    \n            /ip route set \$test gateway=\$\"gateway-address\"\r\
    \n          }\r\
    \n        } else={\r\
    \n            :error \"Multiple routes found with the same comment!\"\r\
    \n        }\r\
    \n    }\r\
    \n  } else={\r\
    \n      /ip route remove [find comment=\$rcomment]\r\
    \n  }\r\
    \n}\r\
    \n"
add add-default-route=no interface=wan2 script="{\r\
    \n  :local scope 10\r\
    \n  :local rmonitor 9.9.9.9\r\
    \n  :local rcomment \"recursive-wan2\"\r\
    \n  :local rcount [/ip route print count-only where comment=\$rcomment]\r\
    \n  :if (\$bound=1) do={\r\
    \n    :if (\$rcount = 0) do={\r\
    \n      /ip route add dst-address=\$rmonitor gateway=\$\"gateway-address\"\
    \_comment=\$rcomment scope=\$scope\r\
    \n    } else={\r\
    \n        :if (\$rcount = 1) do={\r\
    \n          :local test [/ip route find where comment=\$rcomment]\r\
    \n          :if ([/ip route get \$test gateway] != \$\"gateway-address\") \
    do={\r\
    \n            /ip route set \$test gateway=\$\"gateway-address\"\r\
    \n          }\r\
    \n        } else={\r\
    \n            :error \"Multiple routes found with the same comment!\"\r\
    \n        }\r\
    \n    }\r\
    \n  } else={\r\
    \n      /ip route remove [find comment=\$rcomment]\r\
    \n  }\r\
    \n}"
 
Buenas pokoyo ,
Hasta ahora tenia ya un script que utilizaba siempre para la V6, pero al pasar a V7 parece que se esta volviendo complicado.

He seguido tu ejemplo y me funciona correctamente para la tabla main, pero normalmente utilizo dos tablas más por si quiero enrutar algun trafico por alguna otra WAN.

No he conseguido enrutar el trafico de las tablas WAN1 y WAN2 ya que no detecta el nexthop de la tabla main, deberia de crearlo de nuevo en cada tabla? he visto que se podía indicar el gateway@main pero tampoco me ha funcionado, te adjunto el ejemplo.

Código:
/ip route
add check-gateway=ping comment=recursive-WAN1 disabled=no distance=1 dst-address=1.1.1.1/32 gateway=192.168.210.1 pref-src=0.0.0.0 routing-table=main scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=default-WAN1 distance=1 dst-address=0.0.0.0/0 gateway=1.1.1.1 scope=10 target-scope=11
add check-gateway=ping comment=recursive-WAN2 disabled=no distance=1 dst-address=9.9.9.9/32 gateway=192.168.220.1 pref-src=0.0.0.0 routing-table=main scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=default-WAN2 disabled=no distance=10 dst-address=0.0.0.0/0 gateway=9.9.9.9 pref-src=0.0.0.0 routing-table=main scope=10 suppress-hw-offload=no target-scope=11
add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=1.1.1.1 pref-src=0.0.0.0 routing-table=WAN1 scope=30 suppress-hw-offload=no target-scope=10
add disabled=no distance=10 dst-address=0.0.0.0/0 gateway=9.9.9.9 pref-src=0.0.0.0 routing-table=WAN1 scope=30 suppress-hw-offload=no target-scope=10
add disabled=no distance=10 dst-address=0.0.0.0/0 gateway=1.1.1.1 pref-src=0.0.0.0 routing-table=WAN2 scope=30 suppress-hw-offload=no target-scope=10
add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=9.9.9.9 pref-src=0.0.0.0 routing-table=WAN2 scope=30 suppress-hw-offload=no target-scope=10

Y otra duda, a ver si la sabes, que diferencia hay entre crear las tablas con:
Código:
/routing/table
add fib name=WAN1
add fib name=WAN2
o
Código:
/ip vrf
add interfaces=dynamic name=WAN1
add interfaces=dynamic name=WAN2

Veo que haciendolo con vrf deja utilizarla a la hora de hacer pruebas con tracert, igual que en la v6, con fib no deja, veo que en la wiki de mk lo hacen con fib


Muchas gracias, saludos!
 
Última edición:
He realizado diferentes pruebas y a simple vista parece que funciona, aunque visualmente cuando se cae la WAN2 la ruta no aparece activa.
1669279846499.png

No acabo de entender el porqué, he tenido que duplicar la tabla principal a las diferentes tablas poniendo como principal la WAN correspondiente.
Código:
/ip route
add check-gateway=ping comment=recursive-WAN1 disabled=no distance=1 dst-address=1.1.1.1/32 gateway=192.168.210.1 pref-src=0.0.0.0 routing-table=main scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=default-WAN1 distance=1 dst-address=0.0.0.0/0 gateway=1.1.1.1 scope=10 target-scope=11
add check-gateway=ping comment=recursive-WAN2 disabled=no distance=1 dst-address=9.9.9.9/32 gateway=192.168.220.1 pref-src=0.0.0.0 routing-table=main scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=default-WAN2 disabled=no distance=10 dst-address=0.0.0.0/0 gateway=9.9.9.9 pref-src=0.0.0.0 routing-table=main scope=10 suppress-hw-offload=no target-scope=11
add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=1.1.1.1 pref-src=0.0.0.0 routing-table=WAN1 scope=10 suppress-hw-offload=no target-scope=11
add disabled=no distance=10 dst-address=0.0.0.0/0 gateway=9.9.9.9 pref-src=0.0.0.0 routing-table=WAN1 scope=10 suppress-hw-offload=no target-scope=11
add disabled=no distance=10 dst-address=0.0.0.0/0 gateway=1.1.1.1 pref-src=0.0.0.0 routing-table=WAN2 scope=10 suppress-hw-offload=no target-scope=11
add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=9.9.9.9 pref-src=0.0.0.0 routing-table=WAN2 scope=10 suppress-hw-offload=no target-scope=11
add check-gateway=ping comment=recursive-WAN1 disabled=no distance=1 dst-address=1.1.1.1/32 gateway=192.168.210.1 pref-src=0.0.0.0 routing-table=WAN1 scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=recursive-WAN2 disabled=no distance=1 dst-address=9.9.9.9/32 gateway=192.168.220.1 pref-src=0.0.0.0 routing-table=WAN2 scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=recursive-WAN2 disabled=no distance=1 dst-address=9.9.9.9/32 gateway=192.168.220.1 pref-src=0.0.0.0 routing-table=WAN1 scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=recursive-WAN1 disabled=no distance=1 dst-address=1.1.1.1/32 gateway=192.168.210.1 pref-src=0.0.0.0 routing-table=WAN2 scope=10 suppress-hw-offload=no target-scope=10


PD: Parece que es un bug visual, si se cierra y se vuelve a abrir IP routes sale la ruta activa correctamente.
Lo que me he dado cuenta es que la regla de la v6:
Código:
/ip route rule
add dst-address=192.168.1.0/24 table=main
Esa regla ya no funciona, por lo tanto al enrutar los equipos por una tabla de rutas diferente no encontraban a su gateway para resolver las DNS (ya que utilizo el gateway como servidor de DNS)
1669286645119.png

Es raro, porque aunque tengo puesto estas reglas, me sigue enrutando el trafico a la 192.168.1.1 a internet.


Voy a seguir haciendo pruebas, gracias!
 
Última edición:
Perdona que se me perdió tu post. En cuanto pueda lo miro en detalle y te digo. El routing ha cambiado mucho en la v7, y seguro descubres tú cosas que aun no vi; no hice más que pasar por encima de puntillas aún.

Saludos!
 
Perdona que se me perdió tu post. En cuanto pueda lo miro en detalle y te digo. El routing ha cambiado mucho en la v7, y seguro descubres tú cosas que aun no vi; no hice más que pasar por encima de puntillas aún.

Saludos!
Tranquilo! cuando puedas! gracias!

Porcierto, he visto que creando las tablas con
Código:
/ip vrf
add interfaces=dynamic name=WAN2
add interfaces=dynamic name=WAN1
Se añaden dinamicamente como si las hubieras creado con
Código:
/routing/table
add fib name=WAN1
add fib name=WAN2

te adjunto la configuración que estoy probando ahora:

Código:
/ip vrf
add interfaces=dynamic name=WAN2
add interfaces=dynamic name=WAN1
/ip firewall mangle
add action=jump chain=prerouting comment="enviar este trafico por WAN indicada " jump-target=WAN1 src-address=192.168.1.129
add action=mark-connection chain=WAN1 new-connection-mark=WAN1 passthrough=yes
add action=mark-connection chain=WAN2 new-connection-mark=WAN2 passthrough=yes
add action=mark-connection chain=input in-interface=bridgeWAN new-connection-mark=WAN1 passthrough=no
add action=mark-connection chain=prerouting in-interface=bridgeWAN new-connection-mark=WAN1 passthrough=no
add action=mark-connection chain=input in-interface=ether5-WAN2 new-connection-mark=WAN2 passthrough=no
add action=mark-connection chain=prerouting in-interface=ether5-WAN2 new-connection-mark=WAN2 passthrough=no
add action=mark-routing chain=output connection-mark=WAN1 new-routing-mark=WAN1 passthrough=no
add action=mark-routing chain=output connection-mark=WAN2 new-routing-mark=WAN2 passthrough=no
add action=mark-routing chain=prerouting connection-mark=WAN1 new-routing-mark=WAN1 passthrough=no
add action=mark-routing chain=prerouting connection-mark=WAN2 new-routing-mark=WAN2 passthrough=no
add action=mark-routing chain=prerouting connection-mark=no-mark disabled=yes new-routing-mark=main passthrough=no
/ip route
add check-gateway=ping comment=recursive-WAN1 disabled=no distance=1 dst-address=1.1.1.1/32 gateway=91.228.91.13 pref-src=0.0.0.0 routing-table=main scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=default-WAN1 distance=1 dst-address=0.0.0.0/0 gateway=1.1.1.1 scope=10 target-scope=11
add check-gateway=ping comment=recursive-WAN2 disabled=no distance=1 dst-address=9.9.9.9/32 gateway=192.168.100.1 pref-src=0.0.0.0 routing-table=main scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=default-WAN2 disabled=no distance=10 dst-address=0.0.0.0/0 gateway=9.9.9.9 pref-src=0.0.0.0 routing-table=main scope=10 suppress-hw-offload=no target-scope=11
add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=1.1.1.1 pref-src=0.0.0.0 routing-table=WAN1 scope=10 suppress-hw-offload=no target-scope=11
add disabled=no distance=10 dst-address=0.0.0.0/0 gateway=9.9.9.9 pref-src=0.0.0.0 routing-table=WAN1 scope=10 suppress-hw-offload=no target-scope=11
add disabled=no distance=10 dst-address=0.0.0.0/0 gateway=1.1.1.1 pref-src=0.0.0.0 routing-table=WAN2 scope=10 suppress-hw-offload=no target-scope=11
add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=9.9.9.9 pref-src=0.0.0.0 routing-table=WAN2 scope=10 suppress-hw-offload=no target-scope=11
add check-gateway=ping comment=recursive-WAN1 disabled=no distance=1 dst-address=1.1.1.1/32 gateway=91.228.91.13 pref-src=0.0.0.0 routing-table=WAN1 scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=recursive-WAN2 disabled=no distance=1 dst-address=9.9.9.9/32 gateway=192.168.100.1 pref-src=0.0.0.0 routing-table=WAN2 scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=recursive-WAN2 disabled=no distance=1 dst-address=9.9.9.9/32 gateway=192.168.100.1 pref-src=0.0.0.0 routing-table=WAN1 scope=10 suppress-hw-offload=no target-scope=10
add check-gateway=ping comment=recursive-WAN1 disabled=no distance=1 dst-address=1.1.1.1/32 gateway=91.228.91.13 pref-src=0.0.0.0 routing-table=WAN2 scope=10 suppress-hw-offload=no target-scope=10
/routing rule
add action=lookup disabled=no dst-address=192.168.1.0/24 table=main

El problema es que cuando activo el JUMP en el prerouting navego a internet pero no llego a la lan 192.168.1.0/24.
He probado a crearme la misma regla en routing rules poniendo como src la IP en concreto y que haga un lookup a la tabla WAN2, así si me funciona y sigo con acceso a la lan, pero ahí solo puedo seleccionar una IP y no un rango por ejemplo..

Gracias!!
 
No he conseguido enrutar el trafico de las tablas WAN1 y WAN2 ya que no detecta el nexthop de la tabla main, deberia de crearlo de nuevo en cada tabla? he visto que se podía indicar el gateway@main pero tampoco me ha funcionado, te adjunto el ejemplo.
Sí, cada tabla es independiente.

El problema es que cuando activo el JUMP en el prerouting navego a internet pero no llego a la lan 192.168.1.0/24.
He probado a crearme la misma regla en routing rules poniendo como src la IP en concreto y que haga un lookup a la tabla WAN2, así si me funciona y sigo con acceso a la lan, pero ahí solo puedo seleccionar una IP y no un rango por ejemplo..
Aquí me pillas. He intentado montar un routing muy básico con VRF y me la estoy pegando, me hace tirar de mangle sí o sí en lugar de usar routing rules. Necesito echarle yo un rato más largo al tema de VRF y mirar bien cómo se apaña.

De cualquier forma, yo tengo también un par de tablas (la conexión de la wifi de invitados la saco por la segunda WAN por defecto) y el fallback funciona: si se cae la ruta que afecta a la wan secundaria por donde sale el tráfico de invitados, empieza a salir por la principal. Para mi ese setup es más que suficiente para lo que quiero.

No obstante, me estudio el tema de VRF y te digo. He visto un par de videos muy chulos sobre el tema, pero como te digo, tengo que trastear yo más y profundizar en ello antes de dar lecciones a nadie. Son estos, por si te interesan:



Saludos!
 
Sí, cada tabla es independiente.


Aquí me pillas. He intentado montar un routing muy básico con VRF y me la estoy pegando, me hace tirar de mangle sí o sí en lugar de usar routing rules. Necesito echarle yo un rato más largo al tema de VRF y mirar bien cómo se apaña.

De cualquier forma, yo tengo también un par de tablas (la conexión de la wifi de invitados la saco por la segunda WAN por defecto) y el fallback funciona: si se cae la ruta que afecta a la wan secundaria por donde sale el tráfico de invitados, empieza a salir por la principal. Para mi ese setup es más que suficiente para lo que quiero.

No obstante, me estudio el tema de VRF y te digo. He visto un par de videos muy chulos sobre el tema, pero como te digo, tengo que trastear yo más y profundizar en ello antes de dar lecciones a nadie. Son estos, por si te interesan:



Saludos!
Muchas gracias por contestar!
He estado liado pero seguiré mirando cuando pueda, únicamente me fallan las tablas de WAN1 y WAN2, la main balancea correctamente, incluso las tablas WAN1 y WAN2 tambien balancean correctamente, pero no llegan a las redes locales, ni aún creando la ruta estatica a la interficie.

Si tengo novedades aviso.

Saludos!
 
Arriba