Saltar al contenido

Servidor OpenVPN en Mikrotik RouterOS

Desde hace algún tiempo dejé de utilizar en mi red doméstica la combinación de Switch/AP con OpenWRT + Firewall/Router con pfSense para simplificar todo en un solo dispositivo, un Mikrotik Routerboard RB962UiGS-5HacT2HnT, que ejecuta la distribución GNU/Linux RouterOS especialmente desarrollada para dispositivos de red.

Este cambio no me supuso ningún desafío ya que si bien la gestión de la plataforma es muy diferente a lo que estaba acostumbrado, el conjunto de funcionalidades que ofrece nada tiene que envidiarle a OpenWRT o pfSense. Pude migrar sin problemas las configuraciones de red y los servicios que ejecuto en mi red tales como DDNS, VPN, etc.

En este último hay diferencias importantes en cuánto al flujo de trabajo para configurarlo, ya que pfSense nos ofrece asistentes muy útiles para configurar nuestro servidor OpenVPN y en cambio en RouterOS el trabajo es bastante más manual. Además de algunas diferencias de implementación que para una red doméstica no tienen gran impacto (por ej. en RouterOS no podremos usar transporte UDP para la VPN, solamente TCP).

A continuación dejo unos apuntes de cómo realicé la configuración de OpenVPN, en este caso desde la línea de comandos, aunque entiendo que son fácilmente traducibles si queremos realizarlo desde Winbox o Webfig (interfaces gráficas disponibles en RouterOS).

Manos a la obra…

Lo primero será generar algunos certificados. Vamos a necesitar una entidad certificadora (CA), un certificado de servidor y al menos uno de cliente (podrían ser más si generamos más de un usuario).

En mi caso tengo configurado un DDNS que usa un subdominio de murana.uy, así que usaré como common-name para el certificado de la CA murana.uy, para el certificado del servidor el nombre de mi dispositivo (arianrod…) y como certificado cliente mi nombre de usuario. Por lo demás, usaré certificados con 10 años de validez, clave de 2048 bits y los demás parámetros estándar.

[admin@arianrod] > /certificate
[admin@arianrod] /certificate> add name=murana-ca common-name=murana.uy days-valid=3650 key-size=2048 key-usage=crl-sign,key-cert-sign
[admin@arianrod] /certificate> add name=arianrod-cert common-name=arianrod.murana.uy days-valid=3650  key-size=2048 key-usage=digital-signature,key-encipherment,tls-server
[admin@arianrod] /certificate> add name=damian-cert common-name=damian.arianrod.murana.uy days-valid=3650 key-size=2048 key-usage=tls-client

Posteriormente vamos a firmar los certificados emitidos:

[admin@arianrod] /certificate> sign murana-ca name=ca-certificate
  progress: done
[admin@arianrod] /certificate> sign arianrod-cert name=server-certificate ca=ca-certificate                
  progress: done
[admin@arianrod] /certificate> sign damian-cert name=damian-certificate ca=ca-certificate 
  progress: done

Y por último vamos a exportar el certificado de la CA y el de mi usuario (incluyendo su clave privada):

[admin@arianrod] /certificate> export-certificate ca-certificate export-passphrase=""
[admin@arianrod] /certificate> export-certificate damian-certificate export-passphrase="12345678"

Esto nos va a dejar tres archivos en la raíz del sistema operativo: cert_export_ca-certificate.crt, cert_export_damian-certificate.crt y cert_export_damian-certificate.key en mi caso. Vamos a necesitar descargar estos archivos a la PC o cliente desde el cual nos vamos a conectar a la VPN.

Luego de esto, vamos a necesitar un rango de direcciones IP para los clientes VPN, este debe encontrarse fuera de nuestra subred local.

[admin@arianrod] > /ip
[admin@arianrod] /ip> pool add name="openvpn-pool" ranges=192.168.121.10-192.168.121.39

Creamos un nuevo perfil de conexión PPP y también creamos nuestro usuario:

[admin@arianrod] > /ppp 
[admin@arianrod] /ppp> profile add name="openvpn-profile" use-encryption=yes local-address=192.168.121.1 dns-server=192.168.121.1 remote-address=openvpn-pool 
[admin@arianrod] /ppp> secret add name=damian profile=openvpn-profile password=************

Con esto ya podemos habilitar la interfaz servidor OpenVPN:

[admin@arianrod] > /interface
 [admin@arianrod] /interface> ovpn-server server set default-profile=openvpn-profile certificate=server-certificate require-client-certificate=yes auth=sha1 cipher=aes128,aes192,aes256 enabled=yes

Y agregar la regla de firewall para permitir el tráfico del cliente al servidor:

[admin@arianrod] > /ip firewall filter
[admin@arianrod] /ip/firewall/filter>> add chain=input protocol=tcp dst-port=1194 action=accept place-before=0 comment="Allow OpenVPN"   

¡Y con esto ya tenemos el servidor OpenVPN funcional!

Nos falta el cliente…

Como dije, hemos exportado tres archivos que necesitamos para el cliente OpenVPN: CA, certificado de usuario y clave privada del certificado de usuario. Pero la clave privada está cifrada y si la usamos así el cliente VPN además de solicitarnos usuario y contraseña nos solicitará la frase de descifrado de la clave privada, lo que puede resultar molesto y en mi caso he decidido omitir ese extra de seguridad.

Para esto usando OpenSSL la vamos a descifrar:

damian@dagda:~/Escritorio
> openssl rsa -in damian.key -out damian.key 
Enter pass phrase for damian.key:
 writing RSA key

Con esto tendremos en el mismo archivo la clave privada descifrada. Por último vamos a necesitar crear el archivo de configuración del cliente OpenVPN, en mi caso he usado esta configuración (guardado como murana-vpn.ovpn):

client
dev tun
proto tcp
remote arianrod.murana.uy 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca murana-ca.crt
cert damian.crt
key damian.key
remote-cert-tls server
cipher AES-128-CBC
auth SHA1
auth-user-pass
redirect-gateway def1
verb 3

Finalmente, con los cuatro archivos resultantes podremos importar la configuración en cualquier cliente OpenVPN y conectarnos a la red.