La seguridad de los accesos públicos a Internet deja a menudo mucho que desear. Para poder co­ne­c­tar­se 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 re­pre­se­n­ta una al­te­r­na­ti­va 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 di­fe­re­n­tes tarifas de se­r­vi­do­res VPS con las mejores pre­s­ta­cio­nes a precios ase­qui­bles. 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 co­n­s­ti­tu­ye una red de co­mu­ni­ca­ción virtual en la que las pe­ti­cio­nes y las re­s­pue­s­tas entre el servidor VPN y los clientes VPN (di­s­po­si­ti­vos co­ne­c­ta­dos al servidor) se tra­n­s­fie­ren por Internet. Esto permite poder co­ne­c­tar­se a la LAN desde cualquier acceso a Internet y acceder a los datos en la misma, co­mu­ni­car­se con los di­s­po­si­ti­vos 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 co­n­tro­la­do (como las redes in­alá­m­bri­cas públicas).

Para que sea posible crear esta conexión segura a un servidor VPN hay que instalar un servidor VPN con conexión pe­r­ma­ne­n­te 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 di­s­po­si­ti­vos (portátil, sma­r­t­pho­ne, tablet) con el servidor y una conexión cifrada (túnel VPN) permite acceder con uno de estos clientes o te­r­mi­na­les 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 es­pe­cia­l­me­n­te el bajo coste de un Raspberry Pi y de sus ac­ce­so­rios lo que hace de este mi­nio­r­de­na­dor un candidato tan atractivo para que funcione como servidor VPN. El consumo ene­r­gé­ti­co que implica su fu­n­cio­na­mie­n­to pe­r­ma­ne­n­te en el ordenador es, asimismo, re­la­ti­va­me­n­te bajo. Todo esto convierte a esta co­m­bi­na­ción en una de las favoritas, aun cuando en­tre­ta­n­to ya se puede acceder a algunas al­te­r­na­ti­vas 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 se­r­vi­do­res VPN muy extendido que soporta un gran número de sistemas ope­ra­ti­vos (Windows, OS X, Android, iOS, Linux, etc.), convence por su elevada es­ta­bi­li­dad y se instala muy fá­ci­l­me­n­te.

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

Para seguir los pasos del tutorial que viene a co­n­ti­nua­ción necesitas los si­guie­n­tes co­m­po­ne­n­tes:

  • Raspberry Pi (modelo 2 o superior)
  • Tarjeta de memoria microSD con el sistema operativo Raspbien-Jessie instalado.
  • Conexión a Internet (pre­fe­ri­ble­me­n­te por cable) y su­mi­ni­s­tro eléctrico (cable Micro USB) estables.

Se debe decidir, asimismo, si se quiere instalar el servidor VPN di­re­c­ta­me­n­te 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 re­mo­ta­me­n­te con otro ordenador. El ma­n­te­ni­mie­n­to remoto del servidor con SSH es en la mayoría de los casos la variante más re­co­me­n­da­da, ya que de este modo será más fácil acceder al servidor VPN desde un ordenador diferente. Si fi­na­l­me­n­te te decantas por esta segunda opción, puedes recurrir a diversas al­te­r­na­ti­vas muy populares para acceder y operar un Raspberry Pi re­mo­ta­me­n­te, como son PuTTY, WinSCP (para Windows) u OpenSSH (para sistemas ope­ra­ti­vos Unix). Para conectar el software con el mi­nio­r­de­na­dor se introduce la dirección IPv4 del Raspberry Pi en el cliente (aquel di­s­po­si­ti­vo 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 re­co­me­n­da­ble asignar una dirección IP privada estática al Raspberry Pi en la red local. En caso contrario, cada vez que se accediera al mi­nio­r­de­na­dor vía SSH habría que buscar una dirección dinámica temporal nueva y co­ne­c­tar­la con el cliente. Con todo, aún más im­po­r­ta­n­te es vincular el Raspberry Pi con una dirección IP pe­r­ma­ne­n­te para poder usar OpenVPN, ya que el servidor VPN ha de estar di­s­po­ni­ble 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 pe­r­ma­ne­n­te­me­n­te di­s­po­ni­ble 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, di­fi­cu­l­ta­n­do así la plena di­s­po­ni­bi­li­dad 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 co­n­fi­gu­ra­ció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 co­n­fi­gu­rar un DDNS. Si quieres que tu Raspberry Pi esté siempre online como servidor es im­po­r­ta­n­te no olvidar tampoco su debida ac­tua­li­za­ción y seguridad.

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

Tras esta in­tro­du­c­ción y el repaso a los re­qui­si­tos y los conceptos básicos, ya podemos pasar a la práctica con la in­s­ta­la­ción de OpenVPN.

Pre­pa­ra­ción del Raspberry Pi

Antes de instalar OpenVPN, el primer paso es abrir el terminal de tu Raspberry Pi para comprobar si hay ac­tua­li­za­cio­nes pe­n­die­n­tes para los paquetes ya in­s­ta­la­dos. Esto se hace con los si­guie­n­tes comandos:

sudo apt-get update
sudo apt-get upgrade

Si antes no lo has hecho, ahora es el momento de cambiar la co­n­tra­se­ña estándar del mi­nio­r­de­na­dor (nombre de usuario: “PI”, co­n­tra­se­ña: “Raspberry”) para evitar cualquier acceso no au­to­ri­za­do al sistema, tanto lo­ca­l­me­n­te como vía SSH desde de la red. Con este comando abrimos la co­n­fi­gu­ra­ción del mi­nio­r­de­na­dor donde podrás crear una co­n­tra­se­ña segura.

sudo raspi-config

In­s­ta­la­ció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 pre­de­fi­ni­dos easy-rsa en el di­re­c­to­rio de co­n­fi­gu­ra­ción de OpenVPN —aquí es donde se guardan los ce­r­ti­fi­ca­dos y las claves— con un comando que solo funciona con Raspbien Jessie (en el anterior sistema operativo Wheezy los archivos se en­cue­n­tran 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 uti­li­za­n­do esta orden con el fin de co­n­fi­gu­rar­lo:

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 de­te­r­mi­nar el nivel de seguridad del cifrado. Un Raspberry Pi 3 disfruta de re­n­di­mie­n­to su­fi­cie­n­te 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 re­n­di­mie­n­to, 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 re­tro­ce­de­mos al archivo de co­n­fi­gu­ra­ción easy-rsa, donde necesitas tener derechos de su­pe­ru­sua­rio para integrar los ajustes rea­li­za­dos en las variables del entorno. Para ello eje­cu­ta­mos el script vars con el comando source. Fi­na­l­me­n­te, haz que el archivo de co­n­fi­gu­ra­ció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 ce­r­ti­fi­ca­dos y las claves para OpenVPN

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

./clean-all
./build-ca OpenVPN

Aquí se te pide que in­tro­du­z­cas diversos datos para ide­n­ti­fi­car el ce­r­ti­fi­ca­do del servidor ante los clientes (como el código de país de dos letras), pero puedes confirmar la in­fo­r­ma­ción por defecto por su escasa im­po­r­ta­n­cia en el fu­n­cio­na­mie­n­to pulsando la tecla Enter. Fi­na­l­me­n­te genera el ce­r­ti­fi­ca­do para el servidor (que la CA firmará para darle fia­bi­li­dad):

./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 ce­r­ti­fi­ca­do in­tro­du­cie­n­do “y” (yes) dos veces.

Creadas la CA y el ce­r­ti­fi­ca­do del servidor, se han de instalar los clientes VPN. Para ello tienes que crear un ce­r­ti­fi­ca­do y una clave para cada uno de los di­s­po­si­ti­vos con los cuales quieras acceder al servidor VPN. El proceso es semejante al que has seguido para la creación de un ce­r­ti­fi­ca­do y una clave para el servidor (in­tro­du­cir el código de país y confirmar dos veces). Puedes asignarle a cada di­s­po­si­ti­vo un nombre es­pe­cí­fi­co. En el ejemplo su­b­si­guie­n­te se han creado tres clientes: “laptop”, “sma­r­t­pho­ne” y “tablet”:

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

Ahora, para proteger a cada uno de ellos con una co­n­tra­se­ña, en lugar de los comandos an­te­rio­res se usarían los si­guie­n­tes:

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

La creación de los ce­r­ti­fi­ca­dos y las claves concluye con el comando para crear la clave DH (Diffie-Hellman) que usará el servidor para el in­te­r­ca­m­bio 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

Ge­ne­ra­ción del archivo de co­n­fi­gu­ra­ción para el servidor OpenVPN

Se han creado las llaves para que el servidor y los clientes se re­co­no­z­can entre sí, co­n­fi­r­ma­das por la CA. Ahora nos ade­n­tra­mos en la co­n­fi­gu­ra­ción del servidor VPN.

Abre el archivo de co­n­fi­gu­ra­ción de OpenVPN:

sudo nano /etc/openvpn/openvpn.conf

Este archivo vacío se ha de completar con algunos comandos que se muestran a co­n­ti­nua­ción:

dev tun
proto udp
port 1194

En el siguiente paso se crea un ce­r­ti­fi­ca­do raíz SSL/TLS (ca), un ce­r­ti­fi­ca­do digital (cert) y una clave digital (key) en el di­re­c­to­rio easy-rsa. No olvides in­tro­du­cir 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

Es­pe­ci­fi­ca 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 im­po­r­ta­n­te para ti, pero si surgen di­fi­cu­l­ta­des o la na­ve­ga­ción se ralentiza, cancélalo. Las in­s­tru­c­cio­nes que se enumeran aquí abajo, en cambio, se han de utilizar en cualquier caso, pues con ellas nombras los se­r­vi­do­res DNS públicos con los cuales trabajará el servidor VPN. En las líneas si­guie­n­tes 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 es­cri­bi­rá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 co­n­fi­gu­ra­do el servidor, podemos pasar a la co­n­fi­gu­ra­ción de los clientes VPN. Para ello creamos un fichero de co­n­fi­gu­ra­ción en el que se tiene que in­tro­du­cir la siguiente in­fo­r­ma­ció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 de­te­r­mi­na­mos que los clientes VPN no solo re­co­no­z­can al servidor, sino también a otros clientes VPN y con comp-lzo se habilita la co­m­pre­sión LZO (que también se ha de indicar en el archivo de co­n­fi­gu­ra­ció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 re­di­re­c­ción. Para ello se crea el fichero /etc/init.d/rpivpn:

Sudo nano /etc/init.d/rpivpn

Copiando los si­guie­n­tes co­me­n­ta­rios 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 co­n­ti­nua­ción activamos la re­di­re­c­ción ip_forward es­cri­bie­n­do en el archivo un 1 de esta forma:

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

Hecho esto, creamos una re­di­re­c­ció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 ne­ce­sa­rias que permitan a los clientes VPN acceder a la LAN y a Internet. Esto se logra con las si­guie­n­tes 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 re­di­re­c­ción sea efectiva, se tienen que asignar los derechos co­rre­s­po­n­die­n­tes al script e in­s­ta­lar­lo como archivo Init:

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

Eje­cu­ta­mos el script y re­ini­cia­mos el servidor OpenVPN:

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

Cierre de la co­n­fi­gu­ra­ción de los clientes

En el último paso reunimos los ce­r­ti­fi­ca­dos y las claves de cada cliente en un paquete propio. Para ello ne­ce­si­ta­mos de nuevo derechos de su­pe­ru­sua­rio. Una vez asignados, abrimos la carpeta /etc/openvpn/easy-rsa/keys/ y de­po­si­ta­mos en ella el archivo de co­n­fi­gu­ra­ción de los clientes. Con el siguiente comando abrimos el archivo del cliente laptop. Todos los clientes se co­n­fi­gu­ran de la misma forma, lo único que hay que cambiar es el nombre del di­s­po­si­ti­vo:

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 su­s­ti­tui­mos 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 di­s­po­ni­ble.

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

Por último, comprime el archivo de co­n­fi­gu­ra­ción, junto con sus ce­r­ti­fi­ca­dos y claves, en un archivo zip. En caso de que aún no hayas instalado en el Raspberry Pi un paquete de co­m­pre­sión, puedes hacerlo con la siguiente orden:

apt-get install zip

Para crear el archivo co­m­pri­mi­do uti­li­za­mos el comando que viene a co­n­ti­nua­ció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 co­n­fi­gu­rar los derechos de los archivos y fi­na­li­za­mos con exit:

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

Este archivo co­m­pri­mi­do se tra­n­s­fie­re desde el Raspberry Pi al cliente con un programa SCP o SFTP y se configura el cliente en el di­s­po­si­ti­vo. 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 prohi­bi­ti­vo como se suele pensar, pues el escaso consumo eléctrico del Raspberry Pi mantiene los costes co­n­si­de­ra­ble­me­n­te a raya, así como el precio de los co­m­po­ne­n­tes 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 mi­nio­r­de­na­dor 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 co­ne­xio­nes WiFi de calidad dudosa o uti­li­za­n­do los datos del teléfono móvil. Poca seguridad más podría ofrecer una conexión móvil a Internet.

Ir al menú principal