MANUAL: Mikrotik, OpenVPN e IKEv2 VPNs

Introducción
Como continuación del manual anterior, vamos a ver los pasos para montar dos tipos de VPN basadas en certificados de criptografía asimétrica RSA. Este tipo de VPN nos permitirá conectarnos de una manera mucho más segura que con una secreto compartido o calve, ya que valida que los certificados tanto de cliente como de servidor sean válidos. En este caso no me voy a entretener a explicaros las diferencias entre uno y otro. OpenVPN es ampliamente usado en infinidad de sistemas, pero tiene la contraprestación de ser lento y, en el caso de los equipos mikrotik, sólo funcionar sobre TCP. En cambio, IKEv2 es un tipo de conexión que nos brinda una velocidad de conexión muy alta (tanto en establecimiento como en transferencia) y un nivel de cifrado desde muy bueno hasta grado militar.

Sin más preámbulos, al grano

Generación de certificados
Lo primero que tenemos que hacer el generar los certificados que se van a usar en nuestra conexión. Si ya contamos con certificados propios (una CA firmada por una entidad pública), podemos también importarla en el router para generar los certificados de cliente y servidor. Como supongo que arrancamos desde la nada, vamos a dar de alta nuestros propios certificados. Básicamente, necesitamos estos tres:
  • VPN-CA [Certificate Authority]: Es el certificado raíz de nuestra conexión, capaz de firmar otros certificados. Si nos lo ha firmado una entidad pública, será validado automáticamente por alguna CA pública. Sino, como es nuestro caso, será un certificado auto-firmado, y tendremos que confiar en él manualmente.
  • VPN-Server: El certificado con el que se identifica el servidor, nuestro equipo mikrotik. Es validado por los clientes cuando se establece la conexión.
  • VPN-Client-X: El certificado(s) con los que se identifican cada uno de los clientes. Podemos tener uno o muchos, dependiendo de cuantos clientes se quieran conectar a nuestro equipo. Se puede generar un único certificado cliente, pero lo recomendable es que se emita uno para cada equipo distinto que vamos a querer conectar. Es validado por el servidor, para cada cliente que conecta.
Este apartado es común para ambos tipos de VPN, y los certificados generados para un tipo de VPN valen también para el otro. Adaptad vosotros el nombre de los certificados a gusto de consumidor, así como los detalles de los mismos. Los certificados no los he creado con todo lujo de detalles, sino con el mínimo necesario para que funcionen, como son auto-firmados, poco importa. Si tenéis un dominio propio, podéis ponerlo en el common-name o en el subject-alt-name. He puesto fecha de expiración de los certificados a 10 años para la CA, 5 para el certificado de servidor y 2 para los de cliente, lo cual también podéis cambiar por lo que queráis. Suponemos que vamos a usar el propio dominio que nos regala mikrotik para conectarnos al router [serial.sn.mynetname.net], el cual añadiremos como información adicional a los certificados. Si usamos otro dominio para llegar al router (en el caso de un dominio propio o un CNAME que apunte al de mikrotik), cambiad esto en consecuencia. Después de crear el manual y al probarlo en equipos con Windows 10, nos dimos cuenta de que es requisito indispensable para que la VPN IKEv2 autentique en equipos Windows.
Código:
# Generar las plantillas para los certificados
# IMPORTANTE: Para Windows, el certificado del servidor tiene que contener el dominio dyndns que usemos para conectarnos al router.
# Si vais a usar el propio de Mikrotik, aseguraos de poner *.sn.mynetname.net como subject-alt-name.
# Igualmente, si lo vais a usar en windows, aseguraos de poner el dominio completo en el certificado cliente, puesto que se valida íntegramente. 
# La cadena xxxxxxxxx, en el certificado cliente, representa el número de serie de vuestro equipo.
/certificate
add name=xxx-ca-template common-name=VPN-CA subject-alt-name=DNS:mynetname.net\
days-valid=3650 key-size=2048 key-usage=crl-sign,key-cert-sign,digital-signature,key-encipherment,data-encipherment
add name=xxx-server-template common-name=VPN-Server subject-alt-name=DNS:*.sn.mynetname.net\
days-valid=1825 key-size=2048 key-usage=digital-signature,key-encipherment,tls-server
add name=xxx-client-template common-name=VPN-Client-X subject-alt-name=email:clientX@xxxxxxxxx.sn.mynetname.net\
days-valid=730 key-size=2048 key-usage=tls-client

# Generar los certificados y firmarlos
/certificate
sign xxx-ca-template name=vpn-ca
sign xxx-server-template name=vpn-server ca=vpn-ca
sign xxx-client-template name=vpn-client ca=vpn-ca

# Exportar la CA y el certificado cliente
/certificate
export-certificate vpn-ca file-name=ca
export-certificate vpn-client type=pkcs12 export-passphrase="mysuperVPN!" file-name=client


Configuración del servidor OpenVPN
Damos de alta los parámetros correspondientes al servidor OpenVPN. Alguno de estos parámetros, como el pool, se puede reaprovechar para otro tipo de VPN. En mi caso, detallo cada uno por separado. Estoy considerando un servidor que asigna 10 direcciones VPN en su pool, modificadlo vosotros como queráis.
Código:
# Crear el nuevo pool para la VPN
/ip
pool add name=ovpn-pool ranges=192.168.77.10-192.168.77.20

# Crear el nuevo perfil para OpenVPN, usando el pool previo
/ppp
profile add name=ovpn-profile use-encryption=yes local-address=192.168.77.1 remote-address=ovpn-pool

# Generamos un usuario y contraseña para la conexión OpenVPN. Cambiar a gusto de consumidor
/ppp
secret add name=usuario profile=ovpn-profile service=ovpn password=contrasenia

# Activar el servidor OpenVPN
/interface ovpn-server server
set default-profile=ovpn-profile certificate=vpn-server require-client-certificate=yes auth=sha1 cipher=aes128,aes192,aes256 enabled=yes

# Permitir el tráfico de entrada al puerto 1194 de OpenVPN
/ip firewall filter
add chain=input protocol=tcp dst-port=1194 action=accept place-before=2 comment="Allow OpenVPN"

# Enmascarar el tráfico de la VPN
/ip firewall nat
add action=masquerade chain=srcnat comment=masquerade-ovpn src-address=192.168.77.0/24

# [OPCIONAL] Bloquear el acceso a la LAN por parte de los clientes de la VPN
/ip firewall filter
add chain=forward action=drop comment="Block LAN access to OpenVPN clients" src-address=192.168.77.0/24 out-interface-list=!WAN


Instalación local de certificados y el archivo de configuracion .ovpn
Una vez hemos terminado con la configuración del servidor, lo que nos queda es descargar los certificados de la carpeta Files del router y configurar localmente nuestro cliente, para que haga uso del servidor previamente levantado. Si disponemos de acceso por ssh al router, podemos descargar los certificados desde una terminal, haciendo use de sftp:
Código:
sftp admin@router.lan:ca.crt
sftp admin@router.lan:client.p12

Una vez tengamos esos dos certificados en local, nos toca extraer la parte pública y privada del fichero client.p12. Para ello haremos uso de la herramienta openssl en nuestra terminal (instalarla si no la tenéis disponible en windows)
Código:
# Extraer la clave publica y privada del certificado cliente
# Al hacerlo, nos pedirá la password con la que exportamos el certificado cliente [mysuperVPN!]
openssl pkcs12 -in client.p12 -out client.crt -nokeys
openssl pkcs12 -in client.p12 -out client.key -nodes -nocerts

Y por último, tenemos que montar un fichero .ovpn con la definición de nuestra conexión. Os dejo una plantilla para hacerlo. Sustituid "MY_IP" por vuestra dirección IP pública o vuestro dominio. Podéis usar el dominio de tipo dyndns que ofrece mikrotik, y que tenéis disponible en IP -> Cloud, tipo serial.sn.mynetname.net
Código:
# Montar un fichero con extensión .ovpn con el detalle de la conexión.
# Ejemplo (copiar, pegar lo que va entre líneas y guardar como xxx.ovpn)
# ------------------------------------------------------------------------------------------------------
client
dev tun
proto tcp
remote MY_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
cipher AES-128-CBC
auth SHA1
auth-user-pass
redirect-gateway def1
verb 3
# ------------------------------------------------------------------------------------------------------

Una vez hecho todo esto, deberíamos tener en la misma carpeta los siguientes ficheros:
  • ca.crt [certificado raiz]
  • client.crt [clave pública del certificado cliente]
  • client.key [clave privada del certificado cliente]
  • client.p12 [certificado cliente en formato pkcs12]
  • xxx.ovpn [fichero de configuración para el cliente openvpn]

Lo último que nos queda es importar el fichero xxx.ovpn en el que sea nuestro cliente para OpenVPN. En mi caso uso TunnelBrick, pero podéis usar el que os venga en gana. Si sois usuario de linux, desde le propio administrador de redes, cuando creáis una VPN, tenéis la opción de importar el fichero. Al importarlo, se leerán los ficheros de certificados, ya que van referenciados dentro del propio fichero de definición de la conexión. Una vez importada la conexión, podéis eliminar dichos ficheros de vuestro equipo local, puesto que ya estarán disponibles para el cliente VPN, el cual los habrá guardado en su almacén de certificados.
Para conectar, ejecutáis vuestro cliente de OpenVPN preferido y os pedirá autenticación por usuario y contraseña. El detalle del mismo lo tenéis en PPP -> Secret


Configuración del servidor IKEv2
Para hacer uso del servidor IKEv2, aprovecharemos la primera parte del manual, y usaremos los mismos certificados. Si habéis cambiado el nombre de los mismos, recordad haced referencia al nombre correcto cuando deis de alta la configuración. Pasar de un servidor de tipo L2TP/IPSec a un tipo IKEv2 es tremendamente sencillo, puesto que las reglas de firewall que se dan de alta para L2TP nos valen para IKEv2, el cual comparte los puertos 500 y 4500 udp para el tráfico IPSec, al igual que L2TP. Al igual que antes, estoy creando un pool de conexión nuevo para este tipo de VPN, pero podemos reaprovechar el existente que tuviéramos de la configuración original, sólo tenemos que referenciarlo donde toca. Si reusamos configuración previa, la regla de masquerade que va asociada a la nueva red la tendríamos ya dada de alta, no nos haría falta ponerla.

Código:
# Crear el nuevo pool para la VPN
/ip
pool add name=ikev2-pool ranges=192.168.66.10-192.168.66.20

# Damos de alta una nueva configuración para IKEv2
/ip ipsec
mode-config add address-pool=ikev2-pool address-prefix-length=32 name=ike2-config system-dns=yes

# Damos de alta la configuración de negociación entre pares
/ip ipsec
peer add exchange-mode=ike2 name=ike2-peer passive=yes

# Y por último damos el cliente que se va a conectar
# Habrá una entrada por cada cliente cada uno con su certificado individual
/ip ipsec identity
add auth-method=digital-signature certificate=vpn-server comment=EquipoX generate-policy=\
    port-strict match-by=certificate mode-config=ike2-config peer=ike2-peer remote-certificate=\
    vpn-client

# Permitir el tráfico de entrada al puerto 4500 y 500 para IPSec
# Esta entrada de firewall ya existirá si teníamos un L2TP/IPSec
/ip firewall filter
add chain=input protocol=udp dst-port=500,4500 comment="Allow IPSec"\
    place-before=[ find where comment~"defconf: drop all not coming from LAN" ]\
    action=accept

# Permitir el acceso a los equipos LAN para los clientes IKEv2 con tráfico encriptado
/ip firewall filter
add action=accept chain=input comment="accept vpn encrypted input traffic"\
    place-before=[ find where comment~"defconf: drop all not coming from LAN" ]\
    ipsec-policy=in,ipsec src-address=192.168.66.0/24

# Enmascarar el tráfico de la VPN. No aplica si hemos reusado un pool que ya lleve una entrada similar
/ip firewall nat
add action=masquerade chain=srcnat comment=masquerade-ovpn src-address=192.168.66.0/24


Una vez hecha la configuración del servidor, al igual que para OpenVPN, lo que nos queda es descargar los ficheros de certificados e instalarlos en nuestra máquina cliente. Dependiendo de qué sistema operativo estemos manejando, habrá que instalarlos de una manera u otra. No obstante, el proceso es siempre el mismo: primero se instala la CA y se confía en ella manualmente (recordemos que es un certificado auto-firmado) y acto seguido se importa, para cada cliente, su certificado cliente correspondiente, en este caso, directamente el fichero client.p12. En el caso de IKEv2 hay que tener muy en cuenta que cada cliente va identificado por su certificado y que el fqdn que definimos cuando damos de alta el "identity" ha de coincidir con la información que envía el cliente con su certificado al conectar.
Otra cosa importante es que con este tipo de conexión sólo vamos a validar los certificados, omitiendo el usuario y contraseña de la conexión, para así evitar almacenar ningún tipo de información sensible. Cuando configuréis la conexión en vuestros equipos, recordad que el tipo de authenticación es None, y que la conexión se valida con certificado cliente. Os dejo un ejemplo de cómo se daría de alta una conexión de este estilo en un Mac.

Importación de los certificados
Una vez descargados en nuestra máquina o enviados por correo a nuestro teléfono, simplemente abrimos el fichero ca.crt y le marcamos como confiable siempre (paso manual). Acto seguido haremos lo mismo para el client.p12, el cual nos solicitará la contraseña con la que lo exportamos, para importarlo.

Si el cliente donde vais a configurar la conexión maneja los certificados de cliente por separado (certificado por un lado y clave privada por otro), haced el export del certificado cliente en formato PEM, y producirá dos ficheros por cada certificado cliente: el .crt es el certificado, y el .key está la clave privada de dicho certificado. Cuando importéis la clave privada, os pedirá la clave que usasteis en el proceso de exportación (usad siempre una). Este formato es necesario para clientes de strongswan en linux, por ejemplo, donde el certificado cliente se configura en dos partes.

Ejemplo datos de conexión par IKEv2, a partir de los certificados generados en este tutorial
Dirección del servidor: serial.sn.mynetname.net [cambiar por vuestro dominio dyndns]
ID remoto: server.sn.mynetname.net
ID local: clientX@sn.mynetname.net
Ajustes de autenticación
Autenticación de usuario: None (ninguna)​
Usar certificado: true (marcado)​
Certificado: VPN-Client-X [seleccionamos el certificado cliente instalado en dicho dispositivo]​


Espero os sea útil, un saludo!



BONUS TRACK - IKEv2 con PSK [ Sin certificados, con clave compartida ] [ Sólo usuarios Apple ]
Para aquellos que no os queráis complicar la vida con certificados de clave asimétrica o RSA (mal, muy mal, los certificados están para usarlos, no seáis vaguetes), existe una manera aún más simple de montar IKEv2 en mikrotik. Actualmente creo que este método sólo funciona en equipos Apple [ Mac / iPhone ], porque Windows juraría que no permite conectar por IKEv2 con clave compartida en lugar de certificados (desmentidlo si lo porbáis, por favor).
No obstante, me parece útil mencionarlo por si sois usuarios de estos equipos y queréis montar una configuración IKEv2 muy rápida, sin pasar por la generación de certificados. Lo único que cambia, aparte de saltarnos obviamente el paso de la generación de certificados, es cómo damos de alta el identity o cliente dentro del apartado correspondiente de IPSec. Vamos a ello:

Repetimos los tres primeros pasos de la configuración de IPSec
Código:
# Crear el nuevo pool para la VPN
/ip
pool add name=ikev2-pool ranges=192.168.66.10-192.168.66.20

# Damos de alta una nueva configuración para IKEv2
/ip ipsec
mode-config add address-pool=ikev2-pool address-prefix-length=32 name=ike2-config system-dns=yes

# Damos de alta la configuración de negociación entre pares
/ip ipsec
peer add exchange-mode=ike2 name=ike2-peer passive=yes

Y ahora viene lo bueno, alta del identity con autenticación por clave compartida o pre-shared-key
Código:
/ip ipsec identity
add comment=any-client-psk generate-policy=port-strict mode-config=ike2-conf \
    my-id=fqdn:server.sn.mynetname.net peer=ike2-peer remote-id=\
    user-fqdn:clientX@sn.mynetname.net secret=Th4t.sMySup3rS3cr3t!
....
Por aquí seguiríais con el resto de la configuración del firewall, como está descrito en el apartado previo.


Ejemplo datos de conexión par IKEv2 con PSK (Mac OS)
Interfaz: VPN
Tipo de VPN: IKEv2
Nombre del servicio: XXX [ a gusto de consumidor ]
Dirección del servidor: serial.sn.mynetname.net [cambiar por vuestro dominio dyndns]
ID remoto: server.sn.mynetname.net
ID local: clientX@sn.mynetname.net
Ajustes de autenticación
Autenticación de usuario: None (ninguna)​
Secreto compartido: Th4t.sMySup3rS3cr3t!​

Ejemplo datos de conexión par IKEv2 con PSK (iOS)
Navegación: Ajustes -> General -> VPN -> Añadir configuración VPN
Tipo: IKEv2
Descripción: XXX [ a gusto de consumidor ]
Servidor: serial.sn.mynetname.net [cambiar por vuestro dominio dyndns]
ID remoto: server.sn.mynetname.net
ID local: clientX@sn.mynetname.net
Autenticación
Autenticación de usuario: Ninguna​
Usar certificado: Desmarcado (No)​
Secreto: Th4t.sMySup3rS3cr3t!​

Saludos!
 
Última edición:
Buena currada @pokoyo. (y)

Estoy intentando implementarlo y a la hora de conectar, en los logs del router me sale el siguiente error: identity not found for server:server.cert.com peer: RFC822: cliente1@server.cert.com. Alguna idea de que es?

Un saludo!
 
Buena currada @pokoyo. (y)

Estoy intentando implementarlo y a la hora de conectar, en los logs del router me sale el siguiente error: identity not found for server:server.cert.com peer: RFC822: cliente1@server.cert.com. Alguna idea de que es?

Un saludo!

que algo tienes mal en los certificados o en el identity. Pásame los certificados (bien pantallazo, bien adjuntos en un zip) por privado y me pegas un export del /ip ipsec identity y lo revisamos

Saludos!
 
que algo tienes mal en los certificados o en el identity. Pásame los certificados (bien pantallazo, bien adjuntos en un zip) por privado y me pegas un export del /ip ipsec identity y lo revisamos

Saludos!
Aquí lo tienes:

/ip ipsec identity
add auth-method=digital-signature certificate=vpn-server comment=Equipo1 \
generate-policy=port-strict match-by=certificate mode-config=ike2-config \
peer=ike2-peer remote-certificate=vpn-client remote-id=\
fqdn:cliente1@server.cert.com

certs.PNG
 
Pues la configuración, a priori, la veo bien. ¿Cómo estás configurando el cliente VPN?

Saludos!
 
Pues la configuración, a priori, la veo bien. ¿Cómo estás configurando el cliente VPN?

Saludos!
En el iPhone la he puesto así:
Descripción: ...
Servidor: ...
ID remoto: server.cert.com
ID local: cliente1@server.cert.com

Autenticación de usuario: Certificado
Certificado: Cliente-1-cert.com

En Windows puede ser que no haya instalado donde toca los certificados? Es abriendolo e instalándolo y ya está, no?
 
Autenticación de usuario = Ninguna

Ese es tu fallo. Luego seleccionas "Usar certificado" y le metes el de cliente.

Saludos!
 
Para el windows crea un nuevo certificado cliente, no reuses el mismo certificado cliente para varios equipos, cada uno con su certificado y con su entrada en el identity.

Para instalarlos en windows igual, primero la ca y luego el de cliente. Quiero recordar que con darles doble click ya te daba la opciónde importarlos. Acuérdate de marcar la CA como confiable a mano, una vez importada.

Saludos!
 
Autenticación de usuario = Ninguna

Ese es tu fallo. Luego seleccionas "Usar certificado" y le metes el de cliente.

Saludos!
Ahora si, en el móvil ya funciona. En Windows sigo sin saber como, me sale el error que te he enseñado antes.
 
Vale, si te funciona en un equipo significa que la configuración está bien hecha. Ahora sólo hace falta que generes el nuevo certificado cliente, des de alta el nuevo Identity asociado a ella y configurar correctamente los parámetros en windows.

Una vez tengas los certificados metidos en la máquina windows, te vas a las redes y le dices que quieres un nuevo tipo de conexión VPN. Le dices que te vas a conectar por internet, y llegarás a una pantalla donde te pide dos datos:
  • Internet address o dirección de internet: aquí va el dominio por el cual vas a acceder al servidor. Iría un propio si lo tienes, el de mikrotik o la IP pública, si esta fuera estática
  • Destination name: aquí va tu ID como cliente, que sería cliente1@server.cert.com [ según configures el identity ]
Luego tienes que editar las propiedades de la conexión nueva y decirle que es de tipo IKEv2, que quieres el máximo nivel de seguridad (que desconecte si el servidor lo rechaza) y que usas certificados para autenticarte.

Saludos!
 
Vale, si te funciona en un equipo significa que la configuración está bien hecha. Ahora sólo hace falta que generes el nuevo certificado cliente, des de alta el nuevo Identity asociado a ella y configurar correctamente los parámetros en windows.

Una vez tengas los certificados metidos en la máquina windows, te vas a las redes y le dices que quieres un nuevo tipo de conexión VPN. Le dices que te vas a conectar por internet, y llegarás a una pantalla donde te pide dos datos:
  • Internet address o dirección de internet: aquí va el dominio por el cual vas a acceder al servidor. Iría un propio si lo tienes, el de mikrotik o la IP pública, si esta fuera estática
  • Destination name: aquí va tu ID como cliente, que sería cliente1@server.cert.com [ según configures el identity ]
Luego tienes que editar las propiedades de la conexión nueva y decirle que es de tipo IKEv2, que quieres el máximo nivel de seguridad (que desconecte si el servidor lo rechaza) y que usas certificados para autenticarte.

Saludos!
No me funciona... Certificado no válido me pone.
 
Si te dice eso es que la CA está importada pero no has confiado en ella. Es un paso manual que tienes que hacer, al tratarse de un certificado autofirmado.

Saludos!
 
Si te dice eso es que la CA está importada pero no has confiado en ella. Es un paso manual que tienes que hacer, al tratarse de un certificado autofirmado.

Saludos!
He añadido el certificado a los certificados raiz de confianza, tengo que hacer algo más?
 
Pero ahí has metido la CA o el de cliente? Primero va la CA a los certificados raiz de confianza y, cuando te pregunte y te avise de que es un certificado autofirmado, le dices que sí y que "palante", que te fias de él (lo has hecho tú mismo). Y, luego, instalas normalmente el certificado cliente, el cual quedará validado por la CA que metiste previamente. No tengo ahora mismo un windows delante, pero si buscas en google "añadir certificado ca autofirmado" seguro tienes algún tutorial que te dice cómo hacerlo.

Saludos!
 
Si te dice eso es que la CA está importada pero no has confiado en ella. Es un paso manual que tienes que hacer, al tratarse de un certificado autofirmado.

Saludos!
He añadido el certificado a los certificados raiz de confianza, tengo que hacer algo más?

Los certificados tienes que instalarlos en equipo local (al principio de la instalacion, la segunda opcion)

Y primero el CA, y luego el cliente (aqui, donde metes la clave, que esta marcada la ultima opcion, de importar todas las caracteristicas o algo asi)
 
Pero ahí has metido la CA o el de cliente? Primero va la CA a los certificados raiz de confianza y, cuando te pregunte y te avise de que es un certificado autofirmado, le dices que sí y que "palante", que te fias de él (lo has hecho tú mismo). Y, luego, instalas normalmente el certificado cliente, el cual quedará validado por la CA que metiste previamente. No tengo ahora mismo un windows delante, pero si buscas en google "añadir certificado ca autofirmado" seguro tienes algún tutorial que te dice cómo hacerlo.

Saludos!
Lo he instalado la primera vez y no recuerdo si lo he hecho así y ahora no me da la opción al reinstalarlo... Tendré que crear un una nueva CA creo.
 
Los certificados tienes que instalarlos en equipo local (al principio de la instalacion, la segunda opcion)

Y primero el CA, y luego el cliente (aqui, donde metes la clave, que esta marcada la ultima opcion, de importar todas las caracteristicas o algo asi)
Si si, los tengo ambos instalados, pero no me funciona, debe ser que no he puesto que es de confianza o algo, no lo se.
 
Arriba