«Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí».

— Confucio

Cómo actualizar automáticamente el gateway de una ruta estática DHCP en MikroTik

Cuando utilizamos un router MikroTik con varias conexiones a Internet es habitual crear manualmente las rutas por defecto para controlar el balanceo, la redundancia o la salida de determinados clientes. El problema aparece cuando uno de los operadores proporciona la conexión mediante DHCP y puede modificar el gateway asignado.

Si posteriormente el servidor DHCP del operador entrega un gateway diferente, la ruta estática continúa apuntando al gateway anterior y la conexión deja de funcionar correctamente.

Esto puede ocurrir especialmente en configuraciones Multi-WAN donde no queremos utilizar la ruta por defecto creada automáticamente por el DHCP Client porque necesitamos controlar manualmente las rutas, distancias o routing-mark.

En este artículo veremos cómo solucionar este problema en MikroTik utilizando un script que consulta el gateway recibido mediante DHCP y modifica automáticamente nuestra ruta estática.

Supongamos que tenemos tres conexiones a Internet y una de ellas corresponde a Orange, que entrega su IP por DHCP y es habitual que cambie el gateway de forma periódica. En este caso tenemos desactivada la creación automática de la ruta por defecto. De esta manera MikroTik obtiene mediante DHCP la dirección IP, gateway y demás parámetros de red, pero somos nosotros quienes controlamos las rutas.

Nuestra ruta por defecto tendrá un comentario que permitirá identificarla fácilmente:

DEFAULT-ORANGE

Por ejemplo:

/ip route
add dst-address=0.0.0.0/0 gateway=192.168.160.1 comment="DEFAULT-ORANGE"

El gateway indicado inicialmente puede cambiar posteriormente. Precisamente será el script el encargado de mantenerlo actualizado.

Crear el script para actualizar el gateway

Accedemos mediante WinBox a System → Scripts, creamos un nuevo script con un nombre como:

Actualizar-Gateway-Orange

En Source introducimos:

:local wanInterface "VLAN-ether1-ORANGE"
:local routeComment "DEFAULT-ORANGE"

:local dhcpID [/ip dhcp-client find where interface=$wanInterface]

:if ([:len $dhcpID] = 0) do={
    :error "DHCP Client no encontrado"
}

:local dhcpStatus [/ip dhcp-client get $dhcpID status]

:if ($dhcpStatus != "bound") do={
    :error "DHCP no esta bound"
}

:local newGateway [/ip dhcp-client get $dhcpID gateway]

:if ([:len $newGateway] = 0) do={
    :error "Gateway DHCP vacio"
}

:local routeID [/ip route find where comment=$routeComment]

:if ([:len $routeID] = 0) do={
    :error "Ruta no encontrada"
}

:local oldGateway [/ip route get $routeID gateway]

:if ($oldGateway != $newGateway) do={

    /ip route set $routeID gateway=$newGateway

}

Las dos variables que debemos adaptar a nuestra instalación son:

:local wanInterface "VLAN-ether1-ORANGE"
:local routeComment "DEFAULT-ORANGE"

wanInterface debe contener el nombre exacto de la interfaz donde tenemos configurado el DHCP Client, en el caso de Orange será una VLAN. routeComment debe coincidir con el comentario de la ruta que queremos actualizar.

Probar manualmente el funcionamiento

Antes de automatizar el proceso es recomendable comprobar que funciona correctamente. Podemos modificar temporalmente el gateway de nuestra ruta y poner, por ejemplo:

192.168.160.1

Después vamos a System → Scripts seleccionamos:

Actualizar-Gateway-Orange

y pulsamos Run Script, si el DHCP Client está bound, MikroTik consultará el gateway que realmente está entregando el operador y sustituirá automáticamente 192.168.160.1 por el gateway correcto.

Podemos comprobar el gateway recibido mediante:

/ip dhcp-client print detail

y revisar posteriormente la ruta:

/ip route print detail where comment="DEFAULT-ORANGE"

Enviar un correo cuando cambie el gateway

Podemos mejorar considerablemente el script haciendo que MikroTik nos avise cuando detecte un cambio. Para ello debemos tener previamente configurado el correo electrónico en Tools → Email.

Una vez configurado el servidor SMTP, podemos utilizar este script:

Para la versión RouterOS v6:

:local wanInterface "VLAN-ether1-ORANGE"
:local routeComment "DEFAULT-ORANGE"

:local dhcpID [/ip dhcp-client find where interface=$wanInterface]

:if ([:len $dhcpID] = 0) do={
    :error "DHCP Client no encontrado"
}

:local dhcpStatus [/ip dhcp-client get $dhcpID status]

:if ($dhcpStatus != "bound") do={
    :error "DHCP no esta bound"
}

:local newGateway [/ip dhcp-client get $dhcpID gateway]

:if ([:len $newGateway] = 0) do={
    :error "Gateway DHCP vacio"
}

:local routeID [/ip route find where comment=$routeComment]

:if ([:len $routeID] = 0) do={
    :error "Ruta no encontrada"
}

:local oldGateway [/ip route get $routeID gateway]

:if ($oldGateway != $newGateway) do={

    /ip route set $routeID gateway=$newGateway

    /tool e-mail send \
        to="correo@dominio.com" \
        subject="MikroTik - Cambio de gateway WAN" \
        body=("Se ha detectado un cambio de gateway en la conexion WAN.\r\n\r\nGateway anterior: " . $oldGateway . "\r\nGateway nuevo: " . $newGateway)

}

Para la versión RouterOS v7:

:local wanInterface "VLAN-ether1-ORANGE"
:local routeComment "DEFAULT-ORANGE"

:local dhcpID [/ip dhcp-client find where interface=$wanInterface]

:if ([:len $dhcpID] = 0) do={
    :error "DHCP Client no encontrado"
}

:local dhcpStatus [/ip dhcp-client get $dhcpID status]

:if ($dhcpStatus != "bound") do={
    :error "DHCP no esta bound"
}

:local newGateway [/ip dhcp-client get $dhcpID gateway]

:if ([:len $newGateway] = 0) do={
    :error "Gateway DHCP vacio"
}

:local routeID [/ip route find where comment=$routeComment]

:if ([:len $routeID] = 0) do={
    :error "Ruta no encontrada"
}

:local oldGateway [/ip route get $routeID gateway]

:if ($oldGateway != $newGateway) do={

    /ip route set $routeID gateway=$newGateway

    /tool e-mail send \
        to="correo@dominio.com" \
        subject="MikroTik - Cambio de gateway WAN" \
        body=("Se ha detectado un cambio de gateway en la conexion WAN.\r\n\r\nGateway anterior: " . $oldGateway . "\r\nGateway nuevo: " . $newGateway)

}

Debemos sustituir correo@dominio.com, por la dirección donde queremos recibir las notificaciones. Una ventaja importante de esta configuración es que el correo únicamente se envía cuando los gateways son diferentes. Por tanto, aunque ejecutemos el script cada minuto, no recibiremos mensajes continuamente.

Incluir la dirección IP WAN en el correo

También podemos obtener la dirección IP que actualmente tiene asignada el DHCP Client:

:local wanIP [/ip dhcp-client get $dhcpID address]

Podemos colocar esta línea después de obtener newGateway y modificar el cuerpo del correo:

body=("Se ha detectado un cambio de gateway en la conexion WAN.\r\n\r\nGateway anterior: " . $oldGateway . "\r\nGateway nuevo: " . $newGateway . "\r\nIP WAN actual: " . $wanIP)

El mensaje recibido tendrá un formato similar a:

Se ha detectado un cambio de gateway en la conexion WAN.

Gateway anterior: 192.168.160.1
Gateway nuevo: 90.100.200.1
IP WAN actual: 90.100.200.25/24

Esto resulta especialmente útil para administrar remotamente routers MikroTik instalados en diferentes ubicaciones.

Automatizar la comprobación con Scheduler

Una vez comprobado que el script funciona correctamente podemos hacer que MikroTik lo ejecute periódicamente. Desde WinBox accedemos a System → Scheduler Creamos una nueva entrada:

Name: Check-Gateway-Orange
Interval: 00:05:00

En On Event introducimos:

/system script run Actualizar-Gateway-Orange

MikroTik comprobará cada cinco minutos si el gateway almacenado en la ruta coincide con el entregado actualmente por DHCP.

El script permite combinar ambas necesidades: seguimos administrando manualmente nuestra ruta 0.0.0.0/0, pero el gateway deja de ser un parámetro que tengamos que actualizar manualmente cuando el operador modifica su concesión DHCP.

El resultado es una configuración Multi-WAN mucho más resistente a cambios realizados por el operador y que puede funcionar de forma completamente automática.