MANUAL: Mikrotik, VPN tipo RoadWarrior usando WireGuard

Introducción
Hoy os quiero hablar de un nuevo protocolo para establecer conexiones seguras entre equipos conectados a internet. Un nuevo tipo de VPN que, sin lugar a dudas, viene para quedarse: WireGuard. Sin duda, un avance enorme en cuanto a simplicidad y a rendimiento en túneles VPN diseñado con la idea, a mi juicio, de ser el sustituto natural de los túneles basados en IPSec, e incluso OpenVPN.

Un poco de historia
El nuevo protocolo nace en 2016, hace escasamente cuatro años, de la mano de Jason A. Donenfeld, experimentado desarrollador e investigador en seguridad, participante activo del desarrollo del kernel del linux, y colaborador en el desarrollo de otras maravillas tipo AirTunes2. Y bueno, si queréis ver la lista entera de historias en las que ha estado metido el tipo, sólo hace falta que os deis una vuelta por su web, que hay donde elegir. Y, como se ve que le sobraba tiempo y ganas, funda una consultora de seguridad, Edge Security, y le da por parir esta maravilla.

Algo más de detalle..., ¿de qué va esto?
Como todo protocolo o conexión VPN, el propósito es siempre el mismo: conectar A con B de manera segura. No obstante, para desarrollar esto, se ha tenido una máxima por bandera: KISS (keep it simple, stupid!). Para que os hagáis una idea, OpenVPN tiene la friolera de 600k líneas de código, e IPSec no se queda atrás con 400k. Esto se ha desarrollado con 4000 lineas de código... un 1% de lo anterior. Hasta donde llega el tema que el mismísimo Linus Torvalds lo calificó de obra de arte, en comparación con otros protocolos más complejos como puede ser IPSec (a este es que le tiene especial manía, pero eso es otro tema).
¿Y cómo funciona, os preguntaréis? Pues el principio de funcionamiento es tremendamente sencillo, tanto que hasta cuesta creer que a nadie se le hubiera ocurrido antes: dos extremos A y B generan un par de claves tipo RSA (criptografía asimétrica) e intercambian sus claves públicas, tal y como harías tú para conectarte a un servidor por ssh. En la configuración de un extremo, se da de alta un "peer" o par, que representa a un cliente final del otro extremo. Su identificador es su clave pública y, para él, se dan de alta la lista de direcciones a las que va a tener acceso dicho par, desde las cuales podrá enviar y recibir tráfico. Si un cliente trata de enviar información y no está dado de alta como peer, la información se descarta del tirón (tú quién eres, si yo no te tengo dado de alta y no tengo tu clave pública, no puedes hablar conmigo). Si el par es válido, desencripto los paquetes que me manda con su clave pública y analizo la IP de la que viene el paquete, ¿tiene este peer permitido recibir información de esa IP? si lo está, la comunicación fluye, sino, los paquetes se descartan. Para el envío, muy parecido, compruebo si el peer está dado de alta y si se me permite o no enviar información y a qué endpoint corresponde...así de simple.
Como algoritmos de encriptación, autenticación, intercambio de claves, hashing, etc usa algoritmos bien conocidos y muy seguros como ChaCha20, Poly1305, Curve25519, SipHash, etc (tenéis más detalla en la wikipedia). Para establecer la conexión, todo lo que necesita es un puerto UDP, de nuestra elección. Y, si queréis aún más protección, encima de todo lo anterior, le podéis meter una clave de tipo PSK.

Ahora sí, al grano de verdad:
Implementación de VPN tipo Road Warrior con Mikrotik RouterOS 7.1beta2 - modo cliente (router como switch, full bridge)

Lo primero de todo: esto se ha probado sobre una versión de routerOS que NO es estable, es una beta. Lo digo por si a alguien le da por montar esto en algún router de producción... luego los ruegos, lágrimas y plegarias; a la virgen de Lourdes, no a un servidor. Es una beta y, como tal, tiene fallos. No obstante, como me ha costado 15 minutos montarlo, creo que merecía la pena compartirlo.

Dicho esto, y partiendo de un router prácticamente sin configuración y con todas sus interfaces dentro del mismo bridge, como si fuera un switch, (ya explicado en otros manuales), todo lo que tenéis que hacer es esto (ojo que los comandos son ligeramente distintos a los que solemos estar acostumbrados... cosas de la versión 7)

Creamos la interfaz de wireguard
Código:
/interface/wireguard/add name=wireguard listen-port=12345

Obtenemos la clave pública del servidor recién creado: nos la guardamos, que la usaremos más adelante
Código:
:put [/interface/wireguard/get 0 public-key]

Le damos una dirección a la nueva interfaz creada. Al tratarse de un túnel, vamos a usar IP's poco comunes.
Código:
/ip/address/add interface=wireguard address=10.10.0.1/24

Añadimos el masquerade para esa red, de tal manera que cuando salga para arriba, vaya con la IP pública que sea que tenga nuestro router (o mejor dicho, nuestro router haciendo de switch)
Código:
/ip/firewall/nat/add chain=srcnat src-address=10.10.0.0/24 action=masquerade

Con el servidor, de momento, hemos terminado; volveremos después a dar de alta el peer, pero de momento tenemos todo lo que necesitamos para configurar el cliente. Como extra, quedaría abrir el puerto 12345 (o el que sea que hayáis elegido) y mapearlo a la IP de este equipo. Como eso ya sabéis hacerlo, no me paro en ello.

Pasamos a configurar el cliente. En mi caso, la APP móvil de WireGuard en un iPhone, pero sería idéntico en cualquier equipo:

En la app, seleccionamos "Create from scratch" y rellenamos el cliente con los siguiente datos:

Name: lo que os de la gana
Private / Public key = le dais al botón "Generate keypair" y dejáis que la app genere un par de claves aleatorias. Os guardáis la pública.
Addresses: esta es la dirección del otro lado del túnel. En el router configuramos la 10.10.0.1, así que aquí configuraremos la 10.10.0.2/32
ListenPort
: no hace falta que lo rellenéis, lo dejaremos en blanco para que lo genere él en caliente (total, soy un cliente, no servidor)
MTU: Lo dejamos en automático
DNS Servers: esto sí es importante. Le damos la IP que vamos a querer usar como DNS. En mi caso, como tengo un servidor DNS dentro de la red local, le doy una IP del otro extremo del túnel, de mi red local, a la que está conectada este router haciendo de switch. En vuestro caso, podéis poner la pripia IP del router principal de vuestra red, que normalmente ya hace de servidor DNS, o unas DNS públicas, tipo las de cloudflare: 1.1.1.1, 1.0.0.1

El cliente está listo. Bajando un poco en la app, ahora pulsamos en "Add peer", para dar de alta el detalle del par del otro extremo, nuestro servidor. Y rellenamos con los siguientes datos:
Public key: metemos la clave pública que se generó en el router en el primer paso, cuando dimos de alta la interfaz de wireguard. Enviaos el chorizo por correo sin miedo, no me seáis animales y lo copiéis a mano letra a letra. Es una clave pública, se puede enviar de manera insegura sin mayor problema.
Preshared key: es opcional y, como no lo vamos a definir en el otro extremo, lo dejamos vacío. Si queréis aún más seguridad, poned una y darla de alta en ambos extremos. Yo en mi caso, lo dejo vacío.
Endpoint: aquí va la IP pública de nuestra conexión o nuestro dominio ddns, seguido de dos puntos y el puerto elegido. Es decir, algo así: serial.sn.mynetname.net:12345. Donde, como siempre, serial es el número de serie de vuestro equipo mikrotik que tenga activo el servicio de ddns (IP -> Cloud)
AllowedIPs: en este caso, como este cliente no sólo va a querer recibir información del otro extremo del túnel, sino que va a querer navegar por internet y tener pleno acceso a todas las rutas, ponemos una ruta de tipo wildcard: 0.0.0.0/0. Al hacerlo, veréis que se os habilita un botón nuevo para excluir las IP's privadas. Esto último es útil si sólo queréis dar salida a internet a ese equipo y habéis usando una IP pública como servidor DNS. Como no es mi caso y yo quiero acceder no sólo a internet sino a mi LAN con este equipo, NO pulso ese botón.
Persistent keepalive: nada, lo dejamos vacío.
On demand activation: a gusto de consumidor. Una cosa muy chula que tiene este cliente, que le podéis poner reglas para cuando queráis que se levante la VPN automáticamente. Por ejemplo, sólo cuando estoy en cobertura móvil, o cuando estoy en móvil y en redes Wifi, distintas a la de mi casa, etc. Hay varias combinaciones, probadlo que es muy chulo, me gusta mucho el modo automático.

Con las mismas, hemos terminado con el cliente. ¿qué nos queda? Pues dar de alta este peer en el otro extremo, para permitirle conectar con el servidor. Vamos a ello, volvemos de nuevo al mikrotik y ejecutamos:
Código:
/interface/wireguard/peers/add interface=wireguard allowed-address=
10.10.0.2/32 public-key="CHORIZO"
Siendo "CHORIZO" la clave pública que hemos generado en el móvil, y que nos hemos anotado previamente. Ojo y meterla entre comillas, que no tengáis problemas con caracteres especiales como el "=", muy típico en este tipo de claves.

Y listo. Le damos al botón de conectar y... voilá! ya tenéis montado uno de los servidores VPN más sencillos, a mi juicio, de montar en mikrotik. Cuando os conectéis, veréis que el campo "Endpoint" del peer se actualiza, identificando la IP pública remota del par que conecta en modo RoadWarrior. Esto nos permite hacer roaming entre IP's con una reconexión prácticamente instantánea. En el móvil, veréis que se genera, en caliente, un puerto por el cual escucha peticiones el cliente y, si os metéis en los logs de la aplicación, incluso veréis los mensajes del "keep alive" que se envían para saber que ambos extremos siguen vivos. Desde el servidor, vuestro router que hace de switch, podéis abrir una terminal y ver que, en efecto, la IP 10.10.0.2 responde a un ping.

Para configurar esto en un equipo que haga de router sería exactamente igual, salvo el detalle de abrir el puerto, que en lugar de eso, tendríais que añadir una regla de firewall en el chain de input aceptando el tráfico del puerto UDP que sea que hayáis definido para la conexión. Eso, y tener activado el dominio DDNS es todo lo extra que necesitaríais hacer en un router que haga de router. Eso sí, no os recomiendo que hagáis esto en vuestros equipos principales, hasta que routerOS versión 7 pase a ser una versión estable.

No obstante, si os queréis tirar a la piscina, aquí tenéis el trampolín.

Saludos!
 
@pokoyo

Otro manual excelente.

Cuando incorporen Wireguard a la rama estable de RouterOS será el momento de hacer el cambio desde IKEv2.

Muchas gracias.
 
Última edición:
por lo que he visto no hay posibilidad de crear por ahora un tunel tipo site to site, pues no veo para configurar el mikrotik como cliente, o me equivoco?
 
por lo que he visto no hay posibilidad de crear por ahora un tunel tipo site to site, pues no veo para configurar el mikrotik como cliente, o me equivoco?
Sí, claro que lo hay. De hecho, la configuración tipo roadwarrior (un servidor fijo que atiende múltiples peticiones de clientes que de pueden conectar desde cualquier sitio), es bastante más compleja que un site-to-site

Hay otro post relativo a este nuevo tipo de VPN donde se muestran vídeos de cómo se hacen varias de estas configuraciones, entre ellas, el site-to-site: https://www.adslzone.net/foro/mikrotik.199/mikrotik-fin-nade-soporte-wireguard.535837/

Saludos!
 
De hecho, la configuración tipo roadwarrior (un servidor fijo que atiende múltiples peticiones de clientes que de pueden conectar desde cualquier sitio), es bastante más compleja que un site-to-site
Iba a preguntar qué significaba una configuración roadwarrior, aclarado queda.
Gracias.
La verdad es que con Mikrotik siempre tenemos algo que aprender.
 
Última edición:
Iba a preguntar qué significaba una configuración roadwarrior, aclarado queda.
Gracias.
La verdad es que con Mikrotik siempre tenemos algo que aprender.

Es la más común. Un único servidor que tiene que brindar red local a clientes remotos que hacen "roaming" por el mundo. Un tío que se conecta hoy desde su casa, mañana desde la cafetería de la esquina, o desde la wifi del aeropuerto. Por eso son configuraciones muy distintas a un site-to-site, donde normalmente conoces las IP's públicas de ambos extremos e incluso tienes la suerte en muchos casos de que son estáticas y no cambian.

Como podrás intuir, al montar un esquema RoadWarrior hay que tener mucho cuidado con la seguridad, porque si te puedes conectar desde cualquier sitio, también significa que cualquiera puede llamar a la puerta del servidor VPN.

Saludos.
 
Ahora si lo logré (Site to site) , el detalle está en un error del Winbox, por eso no podía crear el túnel, bien documentado todo aqui:

https://rickfreyconsulting.com/wireguard-site-to-site-vpn-example/

Espero les sirva para un futuro. Yo lo tengo implementado en una raspberry mientras tanto y por analogía quería que funcionará pero no encontraba donde poner el puerto.
Gracias nuevamente pokoyo.

Sí, algún problemilla tienen aún; no deja de ser una beta. Yo lo he puesto a correr en un router secundario que uso como switch. Como repito en más de una ocasión, hay que ser conscientes de que esto es una beta, y tratarlo como tal.

Pero la verdad es que esto promete, y mucho. Me encanta el concepto de ese nuevo tipo de VPN.

Saludos!
 
Muy bueno, @pokoyo, como siempre, fantástico. Muchas gracias!.

Una pregunta, que no me he leído nada más que este hilo y por encima este que publicaste hace unos días: ¿sabes si en MK va a haber cifrado por HW para los algoritmos de WireGuard, como es el caso de Ipsec? Es que aunque IKEv2 es complejo de montar, va como una moto en el MK, la verdad.
 
Pues la verdad que no tengo ni idea. Pero en las pruebas consigo velocidades muy muy decentes, y de momento lo tengo instalado en un hEX Gr2, que ni siquiera lleva aceleración hardware (chipset QCA8337).
Si además me meten aceleración hardware para los equipos donde ahora mismo se soporta esa aceleración para IPSec, esto no va a correr, va a volar.

Saludos!
 
Pues ya hemos probado el rendimiento de este nuevo tipo de VPN, corriendo el server en una máquina virtual con ubuntu server 20.04 y un GB de RAM sobre un NAS synology... y el resultado se las trae (@huzoaaz, haz los honores y pega el pantallazo). Si a esto le dan soporte de aceleración por hardware en los mikrotik que lo soporten...tiene que volar.

Saludos!
 
Pues ya hemos probado el rendimiento de este nuevo tipo de VPN, corriendo el server en una máquina virtual con ubuntu server 20.04 y un GB de RAM sobre un NAS synology... y el resultado se las trae (@huzoaaz, haz los honores y pega el pantallazo). Si a esto le dan soporte de aceleración por hardware en los mikrotik que lo soporten...tiene que volar.

Saludos!

Será un placer, @pokoyo



Como dice @pokoyo, ubuntu server VM en un nas synology con 1 gb de ram.... cliente probado en una red wifi 600-600 de movistar..... vuela....
 
Si te animas, ya sabes.... una autentica maravilla... como dice @pokoyo, a poco que despegue, el futuro de las VPN

Yo esperaré a que incluyan Wireguard en la rama estable de RouterOS, pero está claro que llegado el día hay que hacer el cambio.
PD: ¿Como se comprueba la velocidad de una conexión VPN?
 
Si te animas, ya sabes.... una autentica maravilla... como dice @pokoyo, a poco que despegue, el futuro de las VPN

Yo esperaré a que incluyan Wireguard en la rama estable de RouterOS, pero está claro que llegado el día hay que hacer el cambio.
PD: ¿Como se comprueba la velocidad de una conexión VPN?

Con cualquier herramientas como harias con una conexion wifi: speedtest o similares....
 
Si te animas, ya sabes.... una autentica maravilla... como dice @pokoyo, a poco que despegue, el futuro de las VPN

Yo esperaré a que incluyan Wireguard en la rama estable de RouterOS, pero está claro que llegado el día hay que hacer el cambio.
PD: ¿Como se comprueba la velocidad de una conexión VPN?

Si necesitas ayuda o pasos a seguir, comenta tranquilamente....
 
Yo esperaré a que incluyan Wireguard en la rama estable de RouterOS, pero está claro que llegado el día hay que hacer el cambio.
PD: ¿Como se comprueba la velocidad de una conexión VPN?
Si. Yo también lo probaré en cuanto esté en estable. Promete mucho, la verdad. Gracias por pasar la información @huzoaaz y a @pokoyo por levantar el tema. Si además pusieran de una vez el RTSP ALG (Helper) en MK, sería perfecto, pero no he visto noticias de esto desde hace tiempo. Estamos expectantes!
 
Yo esperaré a que incluyan Wireguard en la rama estable de RouterOS, pero está claro que llegado el día hay que hacer el cambio.
PD: ¿Como se comprueba la velocidad de una conexión VPN?
Si. Yo también lo probaré en cuanto esté en estable. Promete mucho, la verdad. Gracias por pasar la información @huzoaaz y a @pokoyo por levantar el tema. Si además pusieran de una vez el RTSP ALG (Helper) en MK, sería perfecto, pero no he visto noticias de esto desde hace tiempo. Estamos expectantes!

Si... yo tb, en cuanto este estable para el router, lo pasaré al router.... esperaremos noticias... pero mientras tanto....
 
Perdón por la simplicidad de la pregunta. Tengo una vpn desde mi movil a mi intranet montada con l2tp a mi router Mikrotk (usuario prenovato) y no veo por que cambiar a Wireguard y os leo tan ilusioandos y está claro que me pierdo algo bueno. Todo está muy bien explicado pero los dummies no vemos la razón inicial. Gracias por la ayuda y la paciencia, y disculpad el bajo nivel.
 
Arriba