Cómo crear un servidor VPN en un Raspberry Pi con OpenVPN

La seguridad de los accesos públicos a Internet deja a menudo mucho que desear. Para poder conectarse fuera de casa sin correr riesgos, una red virtual privada o VPN (Virtual Private Network o red virtual privada) puede ser una buena solución. Si además se configura un servidor VPN personal, se tendrá acceso a la red local doméstica desde Internet.

Para crear una VPN solo hace falta un ordenador que haga las veces de servidor y, para ello, Raspberry Pi representa una alternativa viable y económica. OpenVPN es el software que permite convertir al pequeño ordenador en un servidor VPN.

Consejo: VPS gratis

¿Quieres disponer de un servidor virtual privado propio? IONOS ofrece diferentes tarifas de servidores VPS con las mejores prestaciones a precios asequibles. Aprovecha la prueba gratis de VPS que ofrece IONOS y prueba tu servidor virtual privado de forma gratuita durante 30 días.

Por qué crear un servidor VPN: funciones generales

Instalada en una red local (LAN) para poder acceder a esta desde el exterior, una VPN constituye una red de comunicación virtual en la que las peticiones y las respuestas entre el servidor VPN y los clientes VPN (dispositivos conectados al servidor) se transfieren por Internet. Esto permite poder conectarse a la LAN desde cualquier acceso a Internet y acceder a los datos en la misma, comunicarse con los dispositivos por control remoto (una impresora o un fax) o utilizar la conexión a Internet de la red local (doméstica). Dado que la conexión al servidor VPN está cifrada, navegar es mucho más seguro que si se hiciera desde un acceso no controlado (como las redes inalámbricas públicas).

Para que sea posible crear esta conexión segura a un servidor VPN hay que instalar un servidor VPN con conexión permanente a Internet en un ordenador de la red local. Este ordenador actuaría entonces como host de la red virtual. Con un software cliente se conectan los dispositivos (portátil, smartphone, tablet) con el servidor y una conexión cifrada (túnel VPN) permite acceder con uno de estos clientes o terminales al servidor VPN desde una red externa a la LAN personal.

Este túnel VPN lleva del cliente al servidor VPN abarcando la conexión global a Internet, lo que lo convierte en una conexión mucho más segura que cualquier conexión a Internet al uso. Para los hackers sería muy difícil, por ejemplo, acceder al túnel para espiar el tráfico de datos. Esto hace que las VPN sean la solución ideal en aquellos casos en que se ha de trabajar con datos sensibles, por ejemplo los bancarios, en redes abiertas.

Ventajas de crear un servidor VPN con OpenVPN en un Raspberry Pi

Es especialmente el bajo coste de un Raspberry Pi y de sus accesorios lo que hace de este miniordenador un candidato tan atractivo para que funcione como servidor VPN. El consumo energético que implica su funcionamiento permanente en el ordenador es, asimismo, relativamente bajo. Todo esto convierte a esta combinación en una de las favoritas, aun cuando entretanto ya se puede acceder a algunas alternativas a Raspberry Pi.

Por su parte, OpenVPN es el artífice idóneo para un servidor VPN por diversos motivos, pero sobre todo porque se trata de un software gratuito para servidores VPN muy extendido que soporta un gran número de sistemas operativos (Windows, OS X, Android, iOS, Linux, etc.), convence por su elevada estabilidad y se instala muy fácilmente.

¿Qué necesitas para instalar un servidor VPN en un Raspberry Pi?

Para seguir los pasos del tutorial que viene a continuación necesitas los siguientes componentes:

  • Raspberry Pi (modelo 2 o superior)
  • Tarjeta de memoria microSD con el sistema operativo Raspbien-Jessie instalado.
  • Conexión a Internet (preferiblemente por cable) y suministro eléctrico (cable Micro USB) estables.

Se debe decidir, asimismo, si se quiere instalar el servidor VPN directamente en Raspberry Pi (al cual se conecta un monitor, un ratón y un teclado) o mediante un cliente de SSH, un software que utiliza un protocolo Secure Shell para conectar remotamente con otro ordenador. El mantenimiento remoto del servidor con SSH es en la mayoría de los casos la variante más recomendada, ya que de este modo será más fácil acceder al servidor VPN desde un ordenador diferente.

Si finalmente te decantas por esta segunda opción, puedes recurrir a diversas alternativas muy populares para acceder y operar un Raspberry Pi remotamente, como son PuTTY, WinSCP (para Windows) u OpenSSH (para sistemas operativos Unix). Para conectar el software con el miniordenador se introduce la dirección IPv4 del Raspberry Pi en el cliente (aquel dispositivo desde el cual quieres acceder al Raspberry Pi) y se conectan entre sí. Tecleando la dirección 192.168.0.1 en el navegador se abre el menú del router de tu Raspberry Pi, donde se obtiene la dirección IP.

Ajustar la dirección IP

Cuando se usa un cliente SSH es recomendable asignar una dirección IP privada estática al Raspberry Pi en la red local. En caso contrario, cada vez que se accediera al miniordenador vía SSH habría que buscar una dirección dinámica temporal nueva y conectarla con el cliente. Con todo, aún más importante es vincular el Raspberry Pi con una dirección IP permanente para poder usar OpenVPN, ya que el servidor VPN ha de estar disponible siempre y bajo la misma dirección en la red local para que se pueda acceder a él de forma continua, así como también tiene que estar permanentemente disponible en Internet. Sin embargo, una conexión a Internet solo cuenta con una dirección IP dinámica pública que cambia tras 24 horas, dificultando así la plena disponibilidad del servidor bajo la misma dirección IP. Si tu conexión a Internet no tiene una dirección IP estática pública puedes recurrir a la configuración de un DNS dinámico (DDNS). En este otro artículo puedes consultar cómo asignar una dirección IP estática a tu Raspberry Pi y de qué forma se puede configurar un DDNS. Si quieres que tu Raspberry Pi esté siempre online como servidor es importante no olvidar tampoco su debida actualización y seguridad.

Montar un servidor VPN en un Raspberry Pi con OpenVPN: manual paso a paso

Tras esta introducción y el repaso a los requisitos y los conceptos básicos, ya podemos pasar a la práctica con la instalación de OpenVPN.

Preparación del Raspberry Pi

Antes de instalar OpenVPN, el primer paso es abrir el terminal de tu Raspberry Pi para comprobar si hay actualizaciones pendientes para los paquetes ya instalados. Esto se hace con los siguientes comandos:

sudo apt-get update

sudo apt-get upgrade

Si antes no lo has hecho, ahora es el momento de cambiar la contraseña estándar del miniordenador (nombre de usuario: “PI”, contraseña: “Raspberry”) para evitar cualquier acceso no autorizado al sistema, tanto localmente como vía SSH desde de la red.

Con este comando abrimos la configuración del miniordenador donde podrás crear una contraseña segura.

sudo raspi-config

Instalación de OpenVPN y creación del archivo easy-rsa

Para instalar OpenVPN y Open SSL, software que cifra la conexión a Internet, se introduce este comando:

sudo apt-get install openvpn openssl

Una vez instalado OpenVPN, copiamos los scripts predefinidos easy-rsa en el directorio de configuración de OpenVPN —aquí es donde se guardan los certificados y las claves— con un comando que solo funciona con Raspbien Jessie (en el anterior sistema operativo Wheezy los archivos se encuentran en /usr/share/doc/openvpn/examples/easy-rsa/2.0):

sudo cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa

Abre ahora el archivo /etc/openvpn/easy-rsa/vars en la consola utilizando esta orden con el fin de configurarlo:

sudo nano /etc/openvpn/easy-rsa/vars

Para cambiar los ajustes se sustituye la línea export EASY_RSA="`pwd`" por

export EASY_RSA="/etc/openvpn/easy-rsa"

En este archivo también se puede modificar la longitud de la clave. Con esto puedes determinar el nivel de seguridad del cifrado. Un Raspberry Pi 3 disfruta de rendimiento suficiente para poder procesar sin esfuerzo una longitud de clave de 2048 bits. En el modelo 2, en cambio, este cifrado ocasiona graves pérdidas de rendimiento, por lo que en este caso solo se podría utilizar un cifrado de 1024 bits (en función de cuál sea tu prioridad: la velocidad o el cifrado de la conexión). Un cifrado de 4096 bits, por otro lado, solo es útil en unos pocos casos. Para cambiar la longitud de la clave se ajusta el número de bits en la línea export KEY_SIZE=2048.

Ahora retrocedemos al archivo de configuración easy-rsa, donde necesitas tener derechos de superusuario para integrar los ajustes realizados en las variables del entorno. Para ello ejecutamos el script vars con el comando source. Finalmente, haz que el archivo de configuración que se ha generado sea accesible con un enlace simbólico bajo el nombre de openssl.cnf:

cd /etc/openvpn/easy-rsa
sudo su
source vars
ln -s openssl-1.0.0.cnf openssl.cnf

Creación de los certificados y las claves para OpenVPN

Antes de crear nuevas claves para OpenVPN hay que asegurarse de que no hay ninguna antigua (ejemplos, etc.). Esto se hace con este comando:

./clean-all
./build-ca OpenVPN

Aquí se te pide que introduzcas diversos datos para identificar el certificado del servidor ante los clientes (como el código de país de dos letras), pero puedes confirmar la información por defecto por su escasa importancia en el funcionamiento pulsando la tecla Enter. Finalmente genera el certificado para el servidor (que la CA firmará para darle fiabilidad):

./build-key-server server

Introduce de nuevo el código nacional e ignora los demás campos. Para concluir confirma la creación de un certificado introduciendo “y” (yes) dos veces.

Creadas la CA y el certificado del servidor, se han de instalar los clientes VPN. Para ello tienes que crear un certificado y una clave para cada uno de los dispositivos con los cuales quieras acceder al servidor VPN. El proceso es semejante al que has seguido para la creación de un certificado y una clave para el servidor (introducir el código de país y confirmar dos veces). Puedes asignarle a cada dispositivo un nombre específico. En el ejemplo subsiguiente se han creado tres clientes: “laptop”, “smartphone” y “tablet”:

./build-key laptop
./build-key smartphone
./build-key tablet
…

Ahora, para proteger a cada uno de ellos con una contraseña, en lugar de los comandos anteriores se usarían los siguientes:

./build-key-pass laptop
./build-key-pass smartphone
./build-key-pass tablet
…

La creación de los certificados y las claves concluye con el comando para crear la clave DH (Diffie-Hellman) que usará el servidor para el intercambio de llaves:

./build-dh

Una vez finaliza este proceso, que podría durar unos minutos, se cierra sesión como usuario con permiso raíz con:

exit

Generación del archivo de configuración para el servidor OpenVPN

Se han creado las llaves para que el servidor y los clientes se reconozcan entre sí, confirmadas por la CA. Ahora nos adentramos en la configuración del servidor VPN.

Abre el archivo de configuración de OpenVPN:

sudo nano /etc/openvpn/openvpn.conf

Este archivo vacío se ha de completar con algunos comandos que se muestran a continuación:

dev tun
proto udp
port 1194

En el siguiente paso se crea un certificado raíz SSL/TLS (ca), un certificado digital (cert) y una clave digital (key) en el directorio easy-rsa. No olvides introducir el cifrado de bits correcto (1024, 2048, etc.).

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem

Especifica ahora que el Raspberry Pi se utilice como servidor VPN. Nombra para ello su dirección IP, así como la máscara de red que se ha de asignar al VPN:

server 10.8.0.0 255.255.255.0

Con el comando redirect-gateway def1 bypass-dhcp se les indica a los clientes que todo el tráfico se redirige a través del túnel de la VPN. Puedes probar este ajuste si la seguridad es muy importante para ti, pero si surgen dificultades o la navegación se ralentiza, cancélalo. Las instrucciones que se enumeran aquí abajo, en cambio, se han de utilizar en cualquier caso, pues con ellas nombras los servidores DNS públicos con los cuales trabajará el servidor VPN. En las líneas siguientes se utiliza como ejemplo un servidor de IONOS (217.237.150.188) y uno de Google (8.8.8.8), aunque se puede sustituir por otro servidor DNS indicando la dirección IPv4. Con log-append /var/log/openvpn dispones que los eventos del servidor se escribirán en el fichero /var/log/openvpn.

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 217.237.150.188"
push "dhcp-option DNS 8.8.8.8"
log-append /var/log/openvpn

Una vez configurado el servidor, podemos pasar a la configuración de los clientes VPN. Para ello creamos un fichero de configuración en el que se tiene que introducir la siguiente información:

persist-key
persist-tun
user nobody
group nogroup
status /var/log/openvpn-status.log
verb 3
client-to-client
comp-lzo

Por último con la orden client-to-client determinamos que los clientes VPN no solo reconozcan al servidor, sino también a otros clientes VPN y con comp-lzo se habilita la compresión LZO (que también se ha de indicar en el archivo de configuración del cliente).

Guardamos los cambios con Ctrl+0 y cerramos el editor con Ctrl+X.

Creación de un script para acceder a Internet con un cliente

Para acceder a la conexión a Internet de tu red local a través del túnel VPN vamos a crear una redirección. Para ello se crea el fichero /etc/init.d/rpivpn:

Sudo nano /etc/init.d/rpivpn

Copiando los siguientes comentarios en el archivo se crea una cabecera para un archivo Linux-Init:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rpivpn
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: VPN initialization script
### END INIT INFO

A continuación activamos la redirección ip_forward escribiendo en el archivo un 1 de esta forma:

echo 'echo "1" > /proc/sys/net/ipv4/ip_forward' | sudo -s

Hecho esto, creamos una redirección para paquetes VPN con el filtro de paquetes iptables:

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

Ahora solo nos quedaría crear las órdenes necesarias que permitan a los clientes VPN acceder a la LAN y a Internet. Esto se logra con las siguientes líneas:

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Guardamos y cerramos el archivo de nuevo.

Pero para que la redirección sea efectiva, se tienen que asignar los derechos correspondientes al script e instalarlo como archivo Init:

sudo chmod +x /etc/init.d/rpivpn
sudo update-rc.d rpivpn defaults

Ejecutamos el script y reiniciamos el servidor OpenVPN:

sudo /etc/init.d/rpivpn
sudo /etc/init.d/openvpn restart

Cierre de la configuración de los clientes

En el último paso reunimos los certificados y las claves de cada cliente en un paquete propio. Para ello necesitamos de nuevo derechos de superusuario. Una vez asignados, abrimos la carpeta /etc/openvpn/easy-rsa/keys/ y depositamos en ella el archivo de configuración de los clientes. Con el siguiente comando abrimos el archivo del cliente laptop. Todos los clientes se configuran de la misma forma, lo único que hay que cambiar es el nombre del dispositivo:

sudo su
cd /etc/openvpn/easy-rsa/keys
nano laptop.ovpn

En el archivo .ovpn del cliente se añade esto:

dev tun
client
proto udp
remote x.x.x.x 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert laptop.crt
key laptop.key
comp-lzo
verb 3

Con todo, hay que ajustar este contenido. En la cuarta línea sustituimos x.x.x.x por la dirección IP del proveedor del DDNS, aunque también puedes incluir aquí una dirección IP pública estática si dispones de una; le sigue el puerto en el cual el servidor VPN ha de estar disponible.

En la tercera y cuarta por el final escribimos el nombre del cliente (aquí “laptop”). Hechos los cambios, guardamos y cerramos con los comandos conocidos.

Por último, comprime el archivo de configuración, junto con sus certificados y claves, en un archivo zip. En caso de que aún no hayas instalado en el Raspberry Pi un paquete de compresión, puedes hacerlo con la siguiente orden:

apt-get install zip

Para crear el archivo comprimido utilizamos el comando que viene a continuación (con cuidado de utilizar siempre el nombre de cliente correcto):

zip /home/pi/raspberry_laptop.zip ca.crt laptop.crt laptop.key laptop.ovpn

Ahora solo quedaría configurar los derechos de los archivos y finalizamos con exit:

chown pi:pi /home/pi/raspberry_laptop.zip
exit

Este archivo comprimido se transfiere desde el Raspberry Pi al cliente con un programa SCP o SFTP y se configura el cliente en el dispositivo. Este estaría ahora ya preparado para acceder a la red local conectada con el cliente y a su conexión a Internet desde cualquier punto de acceso externo.

¿Por qué vale la penta tener un servidor VPN en un Raspberry Pi?

Crear una VPN propia no es tan prohibitivo como se suele pensar, pues el escaso consumo eléctrico del Raspberry Pi mantiene los costes considerablemente a raya, así como el precio de los componentes del servidor (Raspberry Pi, tarjeta micro SD, etc.) es también muy asequible. A ello hay que sumar las múltiples ventajas de instalar un servidor VPN en el miniordenador del siglo XXI: este servidor permite acceder a tu red local desde cualquier punto del planeta con una conexión cifrada que permite navegar con total seguridad por la red incluso en conexiones WiFi de calidad dudosa o utilizando los datos del teléfono móvil. Poca seguridad más podría ofrecer una conexión móvil a Internet.