Mikrotik: Como direccionar trafico PPPoE por interfaz (sin balancear): 3 WAN / 3 LAN

No quiero extenderme explicando por que tuve que elegir esta configuracion, pero si quiero decir que fue una solucion muy buena en su momento. Por supuesto que tienen que darse condiciones muy similiares para que te sirva hacer lo mismo. Pero somos tantos en el mundo que seguro mi aporte puede ayudar a otros. 🙂

Escenario

3 LAN (OLT), cada una en una VLAN distinta, los usuarios conectan por PPPoE a cada VLAN y se routean a un WAN especificio.
Son 3 WAN de 100 Mb c/u. Los clientes hacen NAT en cada interfaz LAN. La clave de todo es generar dinamicamente listas de direcciones IP de los abonados en el momento que conectan y se desconectan.

A continuación paso a detallar cada bloque de comandos

A cada una de mis salidas las voy a nombrar Fortinet 1,2 y 3. (Asi se llaman los firewall que suele instalar telefonica en uno de sus servicios)

/ip firewall mangle
add action=mark-connection chain=input comment=UPLOAD in-interface=vlan_fortinet1 new-connection-mark=input1_connection passthrough=yes
add action=mark-routing chain=output connection-mark=input1_connection new-routing-mark=route_fortinet1 passthrough=no
add action=mark-connection chain=input in-interface=vlan_fortinet2 new-connection-mark=input2_connection passthrough=yes
add action=mark-routing chain=output connection-mark=input2_connection new-routing-mark=route_fortinet2 passthrough=no
add action=mark-connection chain=input in-interface=vlan_fortinet3 new-connection-mark=input3_connection passthrough=yes
add action=mark-routing chain=output connection-mark=input3_connection new-routing-mark=route_fortinet3 passthrough=no
add action=mark-routing chain=prerouting comment="ROUTING OLT 3 por FOTINET 3" new-routing-mark=route_fortinet3 passthrough=no src-address-list=\
OLT_service3
add action=mark-routing chain=prerouting comment="ROUTING OLT 2 por FOTINET 2" new-routing-mark=route_fortinet2 passthrough=no src-address-list=\
OLT_service2
add action=mark-routing chain=prerouting comment="ROUTING OLT 1 por FOTINET 1" new-routing-mark=route_fortinet1 passthrough=no src-address-list=\
OLT_service1

Estas son las rutas de cada salida. Deberas reeemplazar el gateway por los tuyos. Cada salida tiene su propia tabla de routeo.
Esto hace que puedas hacer traceroute desde afuera o desde adentro y no se confunda de ruta.

Hay una ruta que no tiene marca. Es la que yo elijo por defecto. (Es decir que nuestro router va a preferir esa ruta).

/ip route
add comment="gw fortinet 2" distance=3 gateway=200.2.2.105 routing-mark=route_fortinet2
add comment="gw fortinet 1" distance=2 gateway=200.1.1.137 routing-mark=route_fortinet1
add comment="gw fortinet 3" distance=4 gateway=200.3.3.97 routing-mark=route_fortinet3
add comment="default gw fortinet 2" distance=10 gateway=200.2.2.105
/ip route rule
add action=lookup-only-in-table routing-mark=route_fortinet1 table=route_fortinet1
add action=lookup-only-in-table routing-mark=route_fortinet3 table=route_fortinet3
add action=lookup-only-in-table routing-mark=route_fortinet2 table=route_fortinet2

Esta es la parte de de NAT, no hay mucho para ver. Cada interfaz LAN hace mascarade con las direcciones que se almacenan con el Script -PPP-On_up On_down. Veras mas abajo como se crean.

/ip firewall nat
add action=masquerade chain=srcnat comment="mascarading RED LOCAL" out-interface=vlan_fortinet1 src-address-list=OLT_service1 src-address-type=""
add action=masquerade chain=srcnat comment="mascarading RED LOCAL" out-interface=vlan_fortinet2 src-address-list=OLT_service2 src-address-type=""
add action=masquerade chain=srcnat comment="mascarading RED LOCAL" out-interface=vlan_fortinet3 src-address-list=OLT_service3 src-address-type=""

Cada PPPoE server tiene un nombre de servicio especifico: mas abajo se van a dar cuenta por que. En este caso son: «service1», «service2», y «service3». (Recordar esos nombres)

/interface pppoe-server server
add authentication=pap disabled=no interface=sfp-sfpplus1_olt1 keepalive-timeout=5 one-session-per-host=yes service-name=service1
add authentication=pap disabled=no interface=sfp-sfpplus2_olt2 keepalive-timeout=5 one-session-per-host=yes service-name=service2
add authentication=pap disabled=no interface=sfp-sfpplus3_olt3 keepalive-timeout=5 one-session-per-host=yes service-name=service3

Para poder routear los clientes correctamente necesitamos separar las direcciones IP de los tuneles PPP que se conecten, en 3 listas (address-lists) distintas. (una por cada LAN o en este caso OLT).
En PPP Profile (solapa) Scripts On-UP / On-DOWN. Esto hace que cuando conecta el PPPoE ponga su direccion remota en una lista con el nombre de la interfaz por donde esta conectando. En este caso OLT1, 2 o 3.
A continuacion, estos 2 pequeños comandos, se fijan de que pppoe server esta pidiendo este usuario conectar o desconectar. Entonces con la variable «caller-id» traemos el nombre del servicio desde donde se conecta. Como mencionamos anteriormente, «service1», «service2», y «service3».

La parte donde ocurre la magia

En cada perfil de ancho de banda tienes que ingresar a editar en las solapas donde dice On_up y On_Down y pegar los siguientes 2 scripts: (Tiene partes con comillas dobles, dejarlas tal cual).

ON UP
/ip firewall address-list add list="OLT_$"called-id"" address=$"remote-address"

ON DOWN
/ip firewall address-list remove [find list="OLT_$"called-id"" address=$"remote-address"]

No se por que algunas veces el On-UP Script faya, entonces la direccion IP de ese cliente no queda dentro de la lista OLT_serviceX y eso hace que ese cliente no tenga navegacion, ya que en Firewall NAT hacemos masqarading por listas. Realmente no tuve tiempo de descubir por que lo hacia. Entonces decidi hacer un script al que denomine PPP-SYNC-FIXER compara las direcciones IP de los tuneles PPP conectados con las listas de IP. Si no encuentra alguna de las direcciones, pateo el usuario para obligarlo a reconectar. El script se ejecuta cada 2 minutos en el calendario de ejecucion. (Bajarle el tiempo en equipos con poco procesador).

Para importar el script pegar esto en la consola y presionar enter.

/system script add dont-require-permissions=no name=PPP_SYNC_FIXER owner=soporte1 policy=\
read,write,policy,test,password,sniff,sensitive source=":log info message=\"*** comienza\
_a buscar usuarios PPP sin routeo \";\r\ \n:local arrnoestan [:toarray \"\"];\r\ \n:local pppactivos value=[/ppp active find];\r\ \n:local indice 1;\r\ \n:foreach usuario in=\$pppactivos do={\r\ \n :local direccionip value=[/ppp active get \$usuario value-name=address];\r\ \n :local busqolt1 value=[/ip firewall address-list print count-only where list=\"O\ LT_service1\" address=\$direccionip];\r\ \n :local busqolt2 value=[/ip firewall address-list print count-only where list=\"O\ LT_service2\" address=\$direccionip];\r\ \n :local busqolt3 value=[/ip firewall address-list print count-only where list=\"O\ LT_service3\" address=\$direccionip];\r\ \n :if ((\$busqolt1=0) && (\$busqolt2=0) && (\$busqolt3=0)) do={\r\ \n# :set arrnoestan ( \$arrnoestan, \$direccionip );\r\ \n :log info message=\"I \$indice IP \$direccionip - no encontrada --- PATEAN\ DO\";\r\ \n /ppp active remove \$usuario;\r\ \n }\r\ \n :set indice (\$indice + 1);\r\ \n}\r\ \n#:log info message=\" fin de script ***\";\r\
\n#:log info message=\"\$arrnoestan\";\r\
\n"

Para importar el scheduler pegar esto en la consola:

/system scheduler
add interval=2m name=Corro_fixer_PPP on-event="/sys script run PPP_SYNC_FIXER" policy=read,write,policy,test,password,sniff,sensitive \
start-date=dec/30/2019 start-time=21:38:15

1 comentario

Deja un comentario