Cómo crear un servidor VPN en una Raspberry Pi

Cómo crear un servidor VPN en una Raspberry Pi
105 apps y juegos en oferta: descarga estas apps gratis en Android por tiempo limitado

Si buscas acceder de forma segura a la red de tu casa cuando estás fuera para conectarte a un NAS, a un ordenador o cualquier otro dispositivo local, puede que te convenga crear un servidor VPN en una Raspberry Pi.

Una Raspberry Pi consume muy poca energía y puede estar encendida las 24 horas del día. Además, cuenta con potencia suficiente para mantener una VPN activa.

Para ello vamos a utilizar el WireGuard, un protocolo VPN bastante sencillo, y Raspberry Pi OS, además de una Raspberry Pi 3, Raspberry Pi 4 o Raspberry Pi 5 y una tarjeta microSD u otra unidad desde la que arrancar Raspberry Pi OS.

Por otro lado, no olvides contar con una conexión permanente al router y acceso a su configuración. Siempre será mejor poder conectar la Raspberry Pi mediante Ethernet en vez de con WiFi.

Instala y prepara Raspberry Pi OS

Si la Raspberry Pi todavía no tiene un sistema operativo instalado, lo más recomendable es utilizar Raspberry Pi Imager para así preparar un medio de arranque desde el que instalarlo.

Como vamos a usarlo solo como servidor VPN, no será necesario instalar la parte gráfica. Podemos utilizar mismamente Raspberry Pi OS Lite, que consume menos recursos y permite realizar lo que queremos utilizando menos energía.

Cuando hayas iniciado el sistema, te recomendamos que actualices los paquetes escribiendo:

sudo apt update

sudo apt full-upgrade -y

Ten en cuenta que es posible que Raspberry Pi OS te pida tu contraseña cada vez que ejecutes este comando u otros que vamos a ver en esta guía.

Asigna una IP local a la Raspberry Pi

Ten en cuenta que el router tendrá que enviar las conexiones VPN que entren siempre a la misma Raspberry Pi, por lo que la dirección IP no puede cambiar.

Para hacer que sea una IP estable, lo más fácil es entrar en la configuración del router y crear una reserva DHCP para la Raspberry Pi.

También puedes hacerlo de forma manual desde Raspberry Pi OS:

  1. Comprueba la IP actual con ip addr
  2. Revisa qué interfaz usa la Raspberry Pi para salir a Internet con ip route

Por ejemplo, puede aparecerte algo como default via 192.168.1.1 dev eth0. En ese caso, la interfaz es eth0. Si estás conectado por WiFi, es probable que veas algo como wlan0. Apunta ese nombre porque te será útil más tarde.

Instala WireGuard y crea las claves

Puedes hacerlo escribiendo:

sudo apt install wireguard iptables -y

A continuación, genera las claves de la Raspberry Pi. Primero crea un directorio de trabajo y restringe los permisos con:

sudo mkdir -p /etc/wireguard

cd /etc/wireguard

sudo umask 077

El siguiente paso es generar la clave privada del servidor y derivar su clave pública con:

sudo sh -c 'wg genkey | tee server_private.key | wg pubkey > server_public.key'

Puedes consultar la clave pública con:

sudo cat /etc/wireguard/server_public.key

Y la privada con:

sudo cat /etc/wireguard/server_private.key

Nunca compartas la clave privada con nadie.

Activa el reenvío de paquetes

La Raspberry Pi no reenvía por defecto paquetes de una interfaz de red a otra, así que tenemos que decírselo nosotros.

Para que reciba tráfico a través de wg0 y después lo envíe mediante eth0 o wlan0, hay que activar la opción IP Forwarding. Para ello, vamos a comenzar creando un archivo con el siguiente comando:

sudo nano /etc/sysctl.d/99-wireguard.conf

Luego escribe:

net.ipv4.ip_forward=1

Y después guarda el archivo y aplica los cambios con:

sudo sysctl --system

Puedes verificar que todo ha quedado bien hecho con:

sysctl net.ipv4.ip_forward

El resultado debería ser:

net.ipv4.ip_forward = 1

Crea la configuración del servidor WireGuard

Para que la explicación no sea demasiado abstracta, vamos a utilizar estos datos de ejemplo:

Red doméstica 192.168.1.0/24
Raspberry Pi 192.168.1.50
Red VPN 10.8.0.0/24
Servidor VPN 10.8.0.1
Primer dispositivo cliente 10.8.0.2
Puerto 51820/UDP

Solo tienes que adaptar las instrucciones que te vamos a dar a continuación a los datos de tu instalación.

Abre el archivo de configuración con:

sudo nano /etc/wireguard/wg0.conf

Ahora escribe:

[Interface]

Address = 10.8.0.1/24

ListenPort = 51820

PrivateKey = CLAVE_PRIVADA_DEL_SERVIDOR

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE.

Recuerda cambiar CLAVE_PRIVADA_DEL_SERVIDOR por tu clave privada. Por otro lado, si la Raspberry Pi se conecta al router mediante WiFi, cambia eth0 por wlan0.

Por último, protege el archivo con:

sudo chmod 600 /etc/wireguard/wg0.conf

Crea las claves del primer dispositivo cliente

Es mejor que cada dispositivo tenga su propia pareja de claves, ya que si necesitaras quitar un dispositivo concreto, no podrías si todos tienen la misma.

Vamos a generar las del primer cliente en la Raspberry Pi con:

cd /etc/wireguard

sudo sh -c 'wg genkey | tee client1_private.key | wg pubkey > client1_public.key'

Consulta su clave pública con:

sudo cat client1_public.key

y añade el cliente al final del archivo /etc/wireguard/wg0.conf con este comando:

[Peer]

PublicKey = CLAVE_PUBLICA_CLIENTE

AllowedIPs = 10.8.0.2/32

Crea la configuración de tu PC o móvil

Puedes hacerlo con:

[Interface]

PrivateKey = CLAVE_PRIVADA_CLIENTE

Address = 10.8.0.2/24

DNS = 1.1.1.1

[Peer]

PublicKey = CLAVE_PUBLICA_SERVIDOR

Endpoint = IP_PUBLICA_DE_CASA:51820

AllowedIPs = 0.0.0.0/0

PersistentKeepalive = 25

Abre el puerto de WireGuard en el router

Con todo lo que hemos hecho, el servidor funcionaría, pero solamente dentro de la red doméstica. Para que reciba conexiones desde Internet, el router tiene que saber a qué equipo debe enviar los paquetes de datos.

Para ello, entra en el panel de administración del router y busca una sección que se llame algo como "Port Forwarding", "NAT", "Redirección de puertos", "Virtual server" o algo así, y crea una regla con estos datos:

Protocolo UDP
Puerto externo 51820
IP interna 192.168.1.50
Puerto interno 51820

Instala WireGuard en el móvil u ordenador

WireGuard cuenta con cliente para Windows, macOS, Android e iOS. En un ordenador simplemente puedes importar el archivo .conf que tenga la configuración anterior.

En un teléfono es muy cómodo porque puedes hacerlo mediante un código QR. Para generarlo desde la Raspberry Pi, escribe primero:

sudo apt install qrencode -y

Luego guarda la configuración del cliente en un archivo, por ejemplo, cliente1.conf, y después ejecuta:

qrencode -t ansiutf8 < client1.conf

Aparecerá entonces un código QR en el terminal que podrás escanear desde la aplicación de WireGuard.

Con todos estos pasos podrás tener un servidor VPN ejecutándose en una Raspberry Pi. Si quieres saber qué más hacer con una Raspberry Pi, te recomendamos que revises los mejores usos para una Raspberry Pi‎.

La VPN gratuita de Firefox ya está disponible en España


¿Desde cuándo no cambias de móvil?


El Grupo Informático es un medio de comunicación digital especializado en tecnología, con análisis y noticias sobre móviles, informática y el mundo digital desde 2006. Conoce más sobre el equipo de El Grupo Informático y nuestra política editorial. Puedes seguirnos en Facebook, X, Instagram, WhatsApp, Telegram o recibirnos en tu correo para no perderte las últimas noticias de tecnología.
  • Ver Comentarios
Sobre el autor
Francisco Vicente
@fran_an_97 | LinkedIn

Amante a partes iguales de la escritura y la tecnología, la cual nunca para de avanzar y sorprendernos a un ritmo vertiginoso. ¡En 30 años hemos avanzado más que en un siglo entero! Cursé un Grado Superior en Desarrollo de Aplicaciones Multiplataforma (DAM). A nivel profesional, he trabajado como copywriter, revisor de calidad y especialista SEO. Poseo un amplio conocimiento informático, destacando en áreas como plataformas de streaming, aplicaciones y Android.