VRF en RouterOS7

El otro día se nos presentó un caso en que un par de clientes que conectaban con nuestro CPD a través de Wireguard coincidían en direccionamiento IP de sus redes LAN. Por ejemplo, con las típicas redes de clase C (192.168.0.0/24, 192.168.1.0/24,…).

Para llegar desde nuestro CPD a estas redes es inviable hacerlo utilizando una sola misma tabla de ruteo, por lo que la alternativa pasaba por modificar todo su direccionamiento, algo que el cliente, como es comprensible, no esta dispuesto a realizar.

La solución vino de la mano de RouterOS y su implementación de VRF, pero.. ¿Qué es VRF?

VRF (del inglés Virtual Routing and Forwarding, enrutamiento virtual y reenvío) es una tecnología que permite que un enrutador ejecute más de una tabla de enrutamiento simultáneamente. Además, dichas tablas son completamente independientes. De esta manera, es posible, por ejemplo, utilizar la misma dirección IP asignada a dos interfaces diferentes en un enrutador al mismo tiempo.

VRF implementa una separación de tipo lógico dentro de un router, virtualizando las tablas de enrutamiento. Es decir, el router asocia a cada interfaz una tabla propia, que difiere de la tabla global del dispositivo. De esta manera, cada interfaz podría utilizar la misma dirección IP sin entrar en conflicto.

Así pues, creamos dos instancias VRF (vrf1 y vrf2) con las interfaces que entrarán en juego en cada uno de los VRFs y suponiendo que ya tenemos creado el oportuno direccionamiento de todas las interfaces en ip address:

# ip vrf add name=vrf1 interfaces=vlan10,wireguard1
# ip vrf add name=vrf2 interfaces=vlan20,wireguard2

Añadimos el gateway para cada una de ellas (supongamos que es la 192.168.100.1):

# ip route add gateway=192.168.100.1@main routing-table=vrf1
# ip route add gateway=192.168.100.1@main routing-table=vrf2

Marcamos las conexiones con mangle para que el flujo sea el correcto:

# ip firewall mangle add action=mark-connection chain=prerouting connection-state=new new-connection-mark=vrf1 src-address=192.168.10.0/24 passthrough=no

# ip firewall mangle add action=mark-connection chain=prerouting connection-state=new new-connection-mark=vrf2 src-address=192.168.20.0/24 passthrough=no

# ip firewall mangle add action=mark-routing chain=prerouting connection-mark=vrf1 in-interface=ether1-WAN new-routing-mark=vrf1

# ip firewall mangle add action=mark-routing chain=prerouting connection-mark=vrf2 in-interface=ether1-WAN new-routing-mark=vrf2

Añadimos las rutas de las redes remotas (en este ejemplo la 172.16.88.0/24) a través de sus correspondientes túneles wireguard. El resto de rutas hacia las VLANes (192.168.10.0 y 192.168.20.0) y las de los propios túneles (10.10.10.0 y 10.10.20.0) se crean dinámicamente cuando creamos los VRF.

# ip route add 172.16.88.0/24 gateway=wireguard1@vrf1
# ip route add 172.16.88.0/24 gateway=wireguard2@vrf2

Las siguientes se añaden dinámicamente con el VRF, routeros lo haría de la siguiente forma:
# ip route add 192.168.10.0/24 gateway=vlan10@vrf1
# ip route add 192.168.20.0/24 gateway=vlan20@vrf2
# ip route add 10.10.10.0/24 gateway=wireguard1@vrf1
# ip route add 10.10.20.0/24 gateway=wireguard2@vrf2

En este momento, el tráfico queda totalmente aislado entre los clientes y ni siquiera tenemos gestión de las VLANs que hay en el propio router (ya que forman parte de dos tablas distintas y no se ven entre si). Para evitar esto último, basta con añadir una serie de política de ruteo para que sepan en que tablas buscar para llegar a una determinada red:

#routing rule add scr-address=red_de_gestion dst-address=192.168.10.0/24 action=lookup table=vrf1
#routing rule add scr-address=red_de_gestion dst-address=192.168.20.0/24 action=lookup table=vrf2
#routing rule add scr-address=192.168.10.0/24 dst-address=red_de_gestion action=lookup table=main
#routing rule add scr-address=192.168.20.0/24 dst-address=red_de_gestion action=lookup table=main

No hay que olvidarse de crear también las reglas de mangle correspondientes para tal propósito.

Y con esto ya tenemos montado VRF listo para poder enrutar tráfico hacia redes totalmente idénticas de una manera sencilla, segura y sin molestar al cliente.