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 🐧