¿Por qué montar tu propia VPN?

Las VPNs comerciales tienen su lugar, pero si ya tienes un servidor o VPS (aunque sea de 5€/mes), montar la tuya propia tiene ventajas claras:

  • Confías en ti mismo, no en una empresa VPN cuya política de logs desconoces
  • Acceso a tu red doméstica o de servidores desde cualquier lugar
  • Sin límites de velocidad ni de dispositivos
  • Coste casi cero si ya tienes el servidor

¿Por qué WireGuard y no OpenVPN?

OpenVPN lleva años siendo el estándar pero WireGuard lo supera en:

  • Velocidad: protocolo más eficiente, menos latencia
  • Simplicidad: ~4.000 líneas de código vs ~400.000 de OpenVPN
  • Configuración: en serio, 15 minutos y funciona
  • Seguridad: criptografía moderna (ChaCha20, Curve25519, BLAKE2)

Requisitos

  • Un servidor Linux con IP pública (VPS de cualquier proveedor, o tu homelab con port forwarding)
  • Ubuntu 22.04 o Debian 12 (los comandos que uso aquí)
  • Puerto UDP libre (por defecto el 51820)

Instalación en el servidor

# Instalar WireGuard
sudo apt update && sudo apt install wireguard -y

# Generar claves del servidor
wg genkey | sudo tee /etc/wireguard/server_private.key | \
  wg pubkey | sudo tee /etc/wireguard/server_public.key

# Ver las claves (las necesitarás)
sudo cat /etc/wireguard/server_private.key
sudo cat /etc/wireguard/server_public.key

Configuración del servidor

Crea el archivo /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = <PEGA_AQUÍ_server_private.key>
Address = 10.0.0.1/24
ListenPort = 51820

# Activar IP forwarding para que los clientes salgan a internet por aquí
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Cliente 1 (tu PC de casa)
[Peer]
PublicKey = <PUBLIC_KEY_DEL_CLIENTE>
AllowedIPs = 10.0.0.2/32

Activa IP forwarding en el sistema:

echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# Arrancar WireGuard y activarlo al inicio
sudo systemctl enable --now wg-quick@wg0

# Ver estado
sudo wg show

Configuración del cliente (PC/móvil)

# En tu PC cliente, genera sus claves
wg genkey | tee client_private.key | wg pubkey > client_public.key

Archivo de configuración del cliente (wg-client.conf):

[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = <IP_DE_TU_SERVIDOR>:51820
AllowedIPs = 0.0.0.0/0   # Todo el tráfico por la VPN
PersistentKeepalive = 25
Si solo quieres acceder a tu red privada (no redirigir todo el tráfico), cambia AllowedIPs a la subred de tu servidor, por ejemplo 10.0.0.0/24.

Añadir la clave pública del cliente al servidor

En el servidor, edita /etc/wireguard/wg0.conf y añade el bloque [Peer] del cliente con su clave pública. Luego recarga:

sudo wg-quick down wg0 && sudo wg-quick up wg0
# O sin cortar el servicio:
sudo wg syncconf wg0 <(wg-quick strip wg0)

Clientes móviles

La app oficial de WireGuard en Android e iOS puede importar la configuración como archivo o como código QR:

# Generar QR de la configuración del cliente
sudo apt install qrencode
qrencode -t ansiutf8 < wg-client.conf

Herramienta alternativa: wg-easy

Si prefieres una interfaz web para gestionar todo:

docker run -d \
  --name=wg-easy \
  -e WG_HOST=tu-ip-publica \
  -e PASSWORD=tu-contraseña \
  -v ~/.wg-easy:/etc/wireguard \
  -p 51820:51820/udp \
  -p 51821:51821/tcp \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --sysctl="net.ipv4.ip_forward=1" \
  ghcr.io/wg-easy/wg-easy

Accede a http://tu-ip:51821 y gestiona clientes desde la interfaz web con generación de QR incluida.