Creando un servidor VPN en una Raspberry Pi

Era necesario: llevamos unos meses que hemos recibido bastantes consultas al respecto, así os hemos traído una pequeña guía sobre cómo crear un servidor VPN – en concreto, la implementación de OpenVPN – en vuestra Raspberry Pi. Vamos a tratar de cubrir, de forma extensa, la instalación y comentar los aspectos más relevantes.

¿ Qué es OpenVPN ?

VPN proviene de Virtual Private Network, nombre bastante descriptivo, que viene a crear una red local virtual, esto es, incluso no estando conectados detrás del mismo router, seremos capaces de interactuar con el resto de equipos conectados a nuestra VPN como si estuviésemos físicamente conectados en la misma red local. Implementaciones de VPN hay varias, las más conocidas utilizan protocolos PPTP, L2TP, IKE u OpenVPN, entre otros.

Sin entrar en cuál es mejor, pues cada una tiene ventajas y desventajas sobre las otras (más allá de algunas como PPTP que están obsoletas en si mismas), vamos a hablar de OpenVPN (https://openvpn.net/). La pega de OpenVPN es que puede resultar complicado de instalar / gestionar, pues hace uso de certificados SSL para encriptar las comunicaciones y autenticación. Es por esto que en una instalación convencional hay que generar una CA (Autoridad Certificadora), también hay que generar una clave TLS, generar las solicitudes de certificado y firmarlas para generar los certificados que se envían a los usuarios finales. Todo este proceso se simplifica enormemente si hacemos uso de PiVPN (https://www.pivpn.io/), y es lo que vamos a hacer.

¿Qué necesitaremos?

Empecemos por lo obvio, vamos a hacer este tutorial sobre una Raspberry Pi. Ahora viene la duda, ¿vale cualquier Raspberry Pi? Si… ¿Recomiendas alguna en especial? ¡Si! OpenVPN funciona a través de la red, es por esto que es aconsejable utilizar una Raspberry Pi 3B+ o una Raspberry Pi 4B, el motivo, como decía antes, la RPi3B+ tiene un puerto Gigabit Ethernet que funciona a unos 300Mbit/s, y la RPi4B tiene el mismo puerto, pero alcanzando el máximo que ofrece el puerto, 1000Mbit/s. Con las conexiones que hay ahora mismo en España a nivel usuario y empresarial, se estila la norma de mínimo 100Mbit/s, pero cada vez más común ver 300 o incluso 600Mbit/s, así que poner una Raspberry Pi 2, por ejemplo, cuya velocidad de red ethernet es 100Mbit/s es crear un cuello de botella.

También será necesario configurar, o bien una IP fija o bien un servicio de DNS dinámico (DynDNS, No-ip, etc…) hoy por hoy la mayoría de los routers lo llevan integrado y únicamente hay que configurarlo, pero esto ya es otro tema que os dejo a vosotros.

Un equipo que haga las veces de cliente VPN, ¿qué sentido tiene crear un servidor VPN si no nos conectamos desde ningún sitio?

Instalación de OpenVPN

Por facilidad, voy a asumir que partimos de una instalación limpia de Raspberry Pi OS, aunque si no fuese así simplemente habría que actualizar la instalación actual.

Como decía, haremos uso de PiVPN, que es una herramienta que instala OpenVPN y ofrece comandos para configurarlo de forma inmediata. La instalación, aunque es larga, no es realmente complicada. Comenzaremos primero ejecutando el comando en nuestra RPI, adjunto imágenes del proceso que yo he hecho por en una RPI por ssh:

$curl -L https://install.pivpn.io | bash
Conexión SSH y comando para ejecutar PiVPN

Cuando ejecutamos el comando lo que está ocurriendo es que se conecta al sitio web de pivpn, descarga el comando para instalarlo y lo ejecuta, llevándonos a una serie de comprobaciones, como comprobar que hay espacio en disco, la longitud del nombre del equipo es suficiente o que está actualizado el equipo.

Comprobaciones ejecutadas por PiVPN

Una vez terminadas las comprobaciones el instalador comenzará automáticamente, en estos primeros pasos no hay mucho que elegir así que nos limitaremos a avanzar.

Instalador PiVPN
Mensaje del instalador de PiVPN

El siguiente paso, aunque sigue sin ofrecernos opciones todavía, nos avisa de que la RPi necesitará tener asignada una IP estática dentro de la red local. La ip podemos asignarla manualmente o bien por reserva DHCP, esto último lo hacemos en el router. Es importante tener clara la IP de la RPi porque luego será necesario abrir el puerto del router al que asignemos el servicio OpenVPN.

Mensaje del instalador de PiVPN

En tanto en cuanto no corresponde aquí dar un tutorial de direccionamiento IP optamos por asumir que la configuración DHCP se gestiona desde el router, y en este caso, la RPi siempre tendrá la ip 192.168.1.68, pero de nuevo, esto es decisión vuestra.

Mensaje del instalador de PiVPN

Lo siguiente será seleccionar el usuario con que se inicia el servicio y que será responsable de la configuración de OpenVPN. Para simplificar, por el tema de permisos, vamos a asumir que el usuario será «pi», el usuario que viene creado por defecto en la imagen de Raspberry Pi OS, pero si tuviésemos varios usuarios nos ofrecería con varios.

Mensaje del instalador de PiVPN

El siguiente paso nos ofrecerá instalar WireGuard u OpenVPN como protocolo, por ahora nos vamos a liminar a OpenVPN, por la cantidad de opciones que ofrece, y que hoy por hoy en 2020 tiene clientes para casi todas las plataformas, de escritorio y móvil.

Selección del protocolo a instalar en PiVPN

El siguiente paso que nos vamos a encontrar será seleccionar el protocolo a nivel de transporte sobre el que va a funcionar OpenVPN, a saber, TCP o UDP. Por defecto PiVPN configurará el servidor en UDP, y así debemos dejarlo salvo que tengamos un motivo claro, pues TCP supone una sobrecarga importante frente a UDP a nivel de cabeceras de control.

También ofrece la posibilidad de cambiar el servidor de búsqueda DNS, más adelante veremos las opciones. Finalmente ofrece la posibilidad de cambiar la forma en que se configura el servidor a nivel de autenticación. PiVPN configura por defecto en este caso la opción que llaman «Características modernas» (Modern features). A saber, encriptación por certificado SSL y protocolo TLS para la autenticación.

Estas opciones son en principio más que válidas, y la pregunta que nos hace el instalador es si queremos modificar las opciones por defecto, así que pulsaremos «No«.

Mensaje del instalador de PiVPN

Hemos elegido, por defecto UDP, ahora toca indicarle el puerto en que se va a ofrecer el servicio OpenVPN, por defecto aparecerá 1194, pero aquí y por norma general para servicios abiertos a internet, sería muy recomendable cambiar el puerto por defecto, así que seleccionaremos, por ejemplo, el puerto 2194.

Seleccionamos el puerto para el servicio OpenVPN

Una vez confirmado el puerto lo siguiente será seleccionar los DNS, por facilidad vamos a utilizar los DNS de Google, por ejemplo, aunque podíamos utilizar un servidor DNS local.

Configuración del servidor DNS de la red OpenVPN

El siguiente punto es especialmente relevante, pues de aquí depende que nuestro servicio esté disponible a través de internet, si disponemos de IP pública fija en nuestra red podemos utilizarla como tal, si no, deberemos seleccionar DNS Entry y escribir el DNS, que previamente tendremos configurado (Recordemos al inicio: DynDNS o NoIP son buenos en esto).

Seleccionamos IP fija o DNS

Una vez seleccionado la IP o DNS el siguiente paso es automático, y es la generación de la clave HMAC que se utilizará para la autenticación TLS, así que aceptamos y continuamos.

Mensaje de la instalación de PiVPN

Finalmente PiVPN comprobará si tenemos activados las actualizaciones y paquetes de seguridad automáticamente, a decisión de cada uno habilitarlo o no, pero es conveniente saber que las actualizaciones de seguridad son muy estables, y el servidor NO se reiniciará cuando llegue una actualización, sino que se instalará, y si requiere reinicio, esperará hasta que se reinicie la próxima vez la RPi para activarse, muy conveniente.

Seleccionar las actualizaciones de seguridad automáticas en PiVPN

Ya está todo instalado, ahora PiVPN nos indica como añadir nuevos usuarios a nuestra VPN, lo explicamos un poquito más adelante. Después de este mensaje el instalador nos indicará que deberíamos reiniciar, así que, salvo necesidad, aceptamos y esperamos a que se levante de nuevo nuestra RPi.

Mensaje de la instalación de PiVPN

Configuración de usuarios en PiVPN

Una vez reiniciada la RPi podemos hacer uso del comando pivpn, que por supuesto cuenta con el comando de ayuda «pivpn help», aunque la creación de usuarios está infinitamente simplificada con PiVPN, solo necesitamos introducir el siguiente comando:

$pivpn add
Alta de un nuevo usuario en nuestro sistema OpenVPN

Al añadir el usuario nos solicitará el nombre del usuario (para nombrar el fichero de configuración, mayormente) y la duración, en días, del certificado generado y la contraseña del usuario. Introducimos los valores que consideremos oportunos y aceptamos (tecla ENTER). Esto generará automáticamente un archivo de configuración que contendrá los ajustes necesarios para conectar a nuestro servidor OpenVPN. Parece sencillo, pero por debajo esto genera una solicitud de certificado, la firma y compone el fichero de configuración con los certificados y las claves pública y privada correspondientes. Cuando termina el proceso, que es bastante rápido, nos indica que se ha generado un fichero con la configuración, es este fichero el que tendremos que pasarnos al equipo cliente.

Mensaje de la configuración del usuario tutorial a traves de PiVPN

El fichero generado (en el caso que nos ocupa se ha llamado tutorial.ovpn) tendrá un formato similar al siguiente:

Fichero de configuración generado tutorial.ovpn

Ahora llevamos este fichero al equipo cliente, para trasladarlo podéis hacerlo por correo electrónico, por SCP, moviéndolo a un pendrive, etc…

Una vez en el equipo cliente podríamos conectarnos ya a la VPN (lo ideal sería estar fuera de la red local, para que todo esto tenga sentido). Pero os voy a dejar un paso previo que os puede resultar de interés, y es que PiVPN genera los ficheros de los clientes de forma que TODO el tráfico por el que navegan pasa a través del túnel VPN, y así como esto puede ser interesante en algunos entornos (paises donde se censuran comunicaciones, motivos de privacidad), esto puede saturar el ancho de banda de la red local donde se encuentra el servidor. Para solucionar esto basta con editar el fichero «.ovpn» y añadir las siguientes lineas:

route-nopull
route 10.8.0.0 255.255.0.0
route 192.168.0.0 255.255.255.0

La primera linea indica al cliente que NO debe modificar su tabla de rutas, esto es, que siga utilizando su router por defecto para todas las redes y salida a internet.

La siguiente indica que al nuevo adaptador virtual (se crea un adaptador túnel) se le agregue la ruta 10.8.0.0 / 16, que es la que configura por defecto PiVPN.

La tercera indica al cliente que también conocerá la red 192.168.0.0 / 24 a través del túnel VPN. Ojo, en este paso debéis indicar el rango de vuestra red, los típicos suelen ser 192.168.0.0 y 192.168.1.0, pero tened en cuenta que si coinciden los rangos de la red local del cliente y la red donde se encuentra el servidor OpenVPN podemos entrar en conflicto, es aconsejable que sean distintos.

El fichero de configuración quedaría de forma similar a:

Modificaciones al fichero .ovpn

Conexión a la VPN

Vamos a asumir que el cliente con que vamos a conectarnos utiliza un sistema operativo Windows. Para ello necesitaremos el cliente OpenVPN adecuado desde la web https://openvpn.net/community-downloads/.

Una vez instalado aparecerá el icono de OpenVPN GUI en el tray del sistema (abajo derecha, junto a la hora). Haremos click derecho y sólo tendremos que seleccionar Import files y seleccionar el fichero .ovpn que hemos traido del servidor.

Cargar fichero .ovpn en el cliente

Una vez cargado el fichero .ovpn al hacer click derecho el menú habrá cambiado, ofreciéndonos la opción de conectar a la red VPN. Introduciremos la clave que hemos introducido en el paso de «Configuración de usuarios en PiVPN» y automáticamente estaremos conectados a la VPN si todo ha ido bien.

Conexión a la VPN en el cliente OpenVPN GUI

En la ventana de OpenVPN GUI podremos ver que nos hemos conectado al túnel VPN y se ha asignado una IP de la red privada virtual al equipo cliente, aparecerá un mensaje del estilo:

Sun Nov 15 19:25:13 2020 MANAGEMENT: >STATE:1605464713,CONNECTED,SUCCESS,10.8.0.2,84.121.148.11,2000,,

Donde 10.8.0.2 representa la ip que ha sido asignada al equipo cliente. Podemos probar la conectividad haciendo un PING o TRACERT desde el equipo cliente:

Llegamos al servidor OpenVPN, a través de una IP local

Y si hemos configurado también la ruta hacia la red local del servidor OpenVPN seremos capaces de conectarnos, por ejemplo, a servidores de ficheros, impresoras de esa red, escritorios remotos detrás del router, etcétera. Echemos un vistazo, por ejemplo a mi configuración actual, en casa estoy en la red 192.168.1.0/24, y me conecto a una VPN remota cuya red está configurada en la subred 192.168.0.0/24, desde la primera red, gracias a la VPN y la configuración escrita en el fichero .ovpn somos capaces de alcanzar de forma local la red 192.168.0.0/24.

IPs asignadas en el escenario actual
Ejemplo de conectividad con la red privada virtual

Esperamos que os haya resultado útil, más en estos tiempos en que apremia la tecnología y es tan necesario el disponer de medios.