Configurar Wireguard en router Mikrotik

2024-02-05

Índice

  1. Configurando el router
    1. Configurar reglas en el firewall
    2. Script
  2. Cliente gnu/linux
  3. Cliente android
  4. Consideraciones si utilizas DDNS como endpoint
  5. Rutas
  6. Referencias:

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

img

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

img

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

img

img

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.

img

Configurar reglas en el firewall

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

img

img

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

img

img

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

img

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

img

Seleccionamos Wireguard

img

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

img

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

img

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

img

Una vez configurado queda activarla y comprobar su funcionamiento

img

img

Cliente android

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

img

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

img

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

img

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

img

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

Referencias:


Ingrese la dirección de su instancia