¿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), cambiaAllowedIPsa la subred de tu servidor, por ejemplo10.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.