Configurar Wireguard en router Mikrotik

2024-02-05

Wireguard viene implementado dentro del sistema RouterOS, básicamente el funcionamiento seria parecido a una conexión ssh, la conexión entre dispositivos se realiza mediante el uso de claves publica 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

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

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

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.

Configurar reglas en el firewall

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

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

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

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 publica, esa clave publica 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 publica respectivamente.

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

Seleccionamos Wireguard

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

En Pares como Endpoint pondremos la direccion IP del router o si configuramos un DDNS el nombre de dominio asi como su clave publica, en Allowed IPs permitiremos el acceso a todos

Por ultimos 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.)

Una vez configurado queda activarla y comprobar su funcionamiento

Cliente android

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

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 publica cambia, al reinicia el router, etc.

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

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

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). Necesitaras 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

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

Referencias:


Ingrese la dirección de su instancia