Configurar Wireguard en router Mikrotik

Advertencia: Este artículo tiene más de 365 días.

Wireguard viene implementado dentro del sistema RouterOS, básicamente el funcionamiento sería parecido a una conexión ssh, la conexión entre dispositivos se realiza mediante el uso de claves público y privada.

Configurando el router

Esta configuración se ha realizado sobre la versión 7 de RouterOS y con todas sus interfaces dentro del mismo bridge.

Creamos la interfaz desde menú WireGuard, haciendo clic sobre el icono + azul

Creación de interfaz WireGuard en Mikrotik

Pulsamos en Apply para generar el par de claves, pública y privada.

Generación de claves WireGuard

Creamos un nuevo segmento de red y se lo asignamos a dicha interfaz, wireguard-rw

Asignación de dirección IP a la interfaz WireGuard

Segmento de red asignado a WireGuard

Para crear los peers desde el menú WireGuard pestaña Peers, haciendo clic sobre el icono + azul

En el campo Interface seleccionamos la que acabamos de crear, wireguard-rw y la dirección IP que va a tener el peer (192.168.100.2/32), Public Key la clave pública que obtendremos al configurar el cliente que se va a conectar a la interface WireGuard, más adelante pongo unos ejemplos para androd y linux y en Persistent Keepalive con un valor de 25 esta bien.

Configuración de peer WireGuard

Configurar reglas en el firewall

Tenemos que permitir las conexiones al puerto que configuramos cuando creamos la interface, el 13231

Regla de firewall para permitir WireGuard

Regla de entrada para WireGuard

Si además queremos que los peers tengan acceso a la red local añadomos esta regla

Regla de acceso a la LAN para peers

Regla de acceso a LAN configurada

Las moveremos antes de las reglas de drop generales que tenemos en input

Reordenación de reglas de firewall

Script

Todos los pasos anteriormente explicados se pueden realizar desde el terminal del router y el siguiente script, recuerda poner la clave pública de cada peer

/interface wireguard
add listen-port=12345 name=wireguard-rw

/ip address
add address=192.168.50.1/24 interface=wireguard-rw

/interface wireguard peers
add allowed-address=192.168.150.2/32 comment=PeerRW interface=wireguard-rw \
    public-key="PUBLIC_KEY="

/ip firewall filter
add action=accept chain=input comment="allow Wireguard" \
    dst-port=12345 protocol=udp \
    place-before=[find comment="defconf: drop all not coming from LAN"]

Regla acceso a la LAN

/ip firewall filter
    add action=accept chain=input comment="allow WireGuard traffic" src-address=192.168.100.0/24 place-before=1

Cliente gnu/linux

Recuerda que cuando dimos de alta un peer en el router necesitábamos su clave público, esa clave público se obtiene en el momento de configurar cada cliente. En gnu/linux necesitas instalar el paquete wireguard-tools para generar el par de claves con el siguiente comando

wg genkey | tee privatekey | wg pubkey > publickey

Esto nos creara dos ficheros, privatekey y publickey con la clave privada y público respectivamente.

Para configurar el cliente de WireGuard en Gnome nos vamos a Configuración -> VPN y añadimos una nueva

Configuración de VPN WireGuard en Gnome

Seleccionamos Wireguard

Selección de tipo WireGuard en Gnome

En la pestaña Wireguard le ponemos un nombre descriptivo, el nombre de la interfaz de red que va a crear y la clave privada que creamos anteriormente, selecciona un puerto de escucha para nuestro cliente

Clave privada y nombre de interfaz WireGuard

En Pares como Endpoint pondremos la dirección IP del router o si configuramos un DDNS el nombre de dominio asi como su clave público, en Allowed IPs permitiremos el acceso a todos

Configuración de pares WireGuard en cliente

Por últimos en la pestaña IP4 configuramos la dirección IP de nuestro cliente, la IP autorizada en el peer configurado en WireGuard / del router, como servidor /DNS he configurado mi servidor de Pi-Hole puedes sustituirlo por el que msa te guste (1.1.1.1, 8.8.8.8, etc.)

Dirección IP y DNS del cliente WireGuard

Una vez configurado queda activarla y comprobar su funcionamiento

Conexión WireGuard activada

Comprobación de conexión WireGuard

Cliente android

Descarga e instala la apk para Android desde https://www.wireguard.com/install/, la configuración es muy similar al paso anterior

Cliente WireGuard en Android

Consideraciones si utilizas DDNS como endpoint

Un problema conocido en Wireguard es que cuando la dirección del endpoint es una dirección dinámica y se hace uso de un servicio DDNS, como puede ser el que ofrece de forma gratuita Mikrotik, y el túnel Wireguard se inicia antes de que el DNS haya resuelto la URL del servicio DDNS, el cliente Wireguard se detiene y no se reinicia y hay que desactivar y habilitar manualmente al par para iniciar el túnel.

Esto puede ocurrir si la dirección IP pública cambia, al reiniciar el router, etc.

Para solucionar esto podemos programar un scrpt que se ejecute cada 2 minutos

Programación del script de DDNS en Mikrotik

Script

:foreach i in=[/interface/wireguard/peers/find where disabled=no endpoint-address~"[a-z]\$"] do={
  :local LastHandshake [/interface/wireguard/peers/get $i last-handshake]
  :if (([:tostr $LastHandshake]: "") or ($LastHandshake > [:totime "5m"])) do={
    /interface/wireguard/peers/set $i endpoint-address=[/interface/wireguard/peers/get $i endpoint-address]
  }

Scheduler

Scheduler para DDNS en Mikrotik

Rutas

Si permites que los peers tengan acceso a la red local del endpoint, puede darse el caso que coincida el segmento de red del cliente local (por ejemplo 192.168.1.X) con el segmento de red del endpoint (también 192.168.1.X). Necesitarás hacer uso de las Rutas ya que en el caso de que quieras acceder a la dirección 192.168.1.2 de la red LAN del endpoint, el cliente no la encontrara ya que buscara en su tramo de red.

Necesitas indicarle la ruta donde buscar esa dirección IP

Ruta para acceso a la LAN del endpoint

Espero que te haya gustado, pasa un gran día 🐧

Referencias: