🔒

WireGuard VPN — CULTIVA IA

Acceso remoto cifrado · Raspberry Pi 5 · cultivaia.duckdns.org:51820

Generado por IA
Servidor: wg0 activo
Endpoint: cultivaia.duckdns.org:51820
VPN subnet: 10.8.0.0/24
Peers activos: 3 de 3
Protocolo: UDP · ChaCha20-Poly1305

Topología de red

🌐
Internet
Tráfico no-VPN (split tunnel)
│    UDP 51820 ▼
🥧
Raspberry Pi 5 (servidor wg0)
Debian Bookworm · IP forwarding ON
10.8.0.1
├── LAN ──────────────────
🖥️
Red oficina Barcelona
NAS, Pi-hole (192.168.10.5), PCs
192.168.10.0/24
└── VLAN servidores ───────
⚙️
VLAN servidores internos
Supabase local, panel admin, APIs
192.168.20.0/24

Peers configurados

💻
Álvaro — MacBook Pro
macOS 15 · Split tunnel · ambas VLANs
10.8.0.2/32
split tunnel
📱
Álvaro — iPhone 15
iOS 18 · Keepalive 25s · DNS Pi-hole
10.8.0.3/32
split + DNS
🐧
Equipo remoto — Linux
Ubuntu 24.04 · Solo VLAN servidores
10.8.0.4/32
restricted

/etc/wireguard/wg0.conf — Raspberry Pi 5 (servidor)

/etc/wireguard/wg0.conf wireguard
[Interface]
Address     = 10.8.0.1/24              # IP del servidor en la subnet VPN
ListenPort  = 51820
PrivateKey  = # <SERVER_PRIVATE_KEY> — chmod 600, nunca en git

# Reglas iptables con scope estricto (solo wg0, no FORWARD ACCEPT global)
PostUp   = iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
PostUp   = iptables -A FORWARD -i eth0 -o wg0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PostUp   = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT
PostDown = iptables -D FORWARD -i eth0 -o wg0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# Álvaro — MacBook Pro
PublicKey  = # <ALVARO_MACBOOK_PUBLIC_KEY>
AllowedIPs = 10.8.0.2/32

[Peer]
# Álvaro — iPhone 15
PublicKey  = # <ALVARO_IPHONE_PUBLIC_KEY>
AllowedIPs = 10.8.0.3/32

[Peer]
# Equipo remoto — Linux
PublicKey  = # <EQUIPO_REMOTO_PUBLIC_KEY>
AllowedIPs = 10.8.0.4/32

Config cliente — MacBook (split tunnel)

alvaro-macbook.conf wireguard
[Interface]
PrivateKey = # <ALVARO_MACBOOK_PRIVATE_KEY>
Address    = 10.8.0.2/32

[Peer]
PublicKey           = # <SERVER_PUBLIC_KEY>
Endpoint            = cultivaia.duckdns.org:51820
AllowedIPs          = 192.168.10.0/24, 192.168.20.0/24, 10.8.0.0/24
# Split tunnel: solo redes de oficina, internet va directo
PersistentKeepalive = 25

Config cliente — iPhone (+ DNS Pi-hole)

alvaro-iphone.conf wireguard
[Interface]
PrivateKey = # <ALVARO_IPHONE_PRIVATE_KEY>
Address    = 10.8.0.3/32
DNS        = 192.168.10.5  # Pi-hole de la oficina

[Peer]
PublicKey           = # <SERVER_PUBLIC_KEY>
Endpoint            = cultivaia.duckdns.org:51820
AllowedIPs          = 192.168.10.0/24, 192.168.20.0/24, 10.8.0.0/24
# Keepalive imprescindible en móvil (NAT detrás de 4G/WiFi)
PersistentKeepalive = 25

Instalación en Raspberry Pi 5 (Debian Bookworm)

Paso 1: Instalar y generar claves bash
# Instalar WireGuard
sudo apt update && sudo apt install wireguard -y

# Generar clave privada del servidor (permisos restrictivos desde el inicio)
sudo mkdir -p /etc/wireguard
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server_private.key'
sudo sh -c 'wg pubkey < /etc/wireguard/server_private.key > /etc/wireguard/server_public.key'

# Verificar permisos (deben ser 600)
ls -la /etc/wireguard/
# -rw------- 1 root root  45 ...  server_private.key  ✓
# -rw------- 1 root root  45 ...  server_public.key   ✓
Paso 2: Habilitar IP forwarding bash
# Activar reenvío de paquetes IPv4 (persistente)
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system

# Verificar
cat /proc/sys/net/ipv4/ip_forward
# Debe devolver: 1
Paso 3: Arrancar y habilitar en el boot bash
sudo chmod 600 /etc/wireguard/wg0.conf
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

# Verificar estado
sudo wg show
# interface: wg0
#   public key: <SERVER_PUBLIC_KEY>
#   listening port: 51820
#
# peer: <CLIENT_PUBLIC_KEY>
#   allowed ips: 10.8.0.2/32
#   latest handshake: 5 seconds ago  ← debería aparecer

Split tunnel vs Full tunnel

Split tunnel — recomendado para CULTIVA IA
AllowedIPs = 192.168.10.0/24, 192.168.20.0/24, 10.8.0.0/24
  • Solo el tráfico de oficina pasa por el VPN
  • YouTube, Spotify, etc. van directo (velocidad máxima)
  • No satura el uplink de la oficina
  • Ideal para trabajo diario en remoto
Full tunnel — solo para casos específicos
AllowedIPs = 0.0.0.0/0, ::/0
  • Todo el tráfico sale por la IP de la oficina
  • Aprovecha Pi-hole para bloquear anuncios en todo
  • Limita la velocidad al uplink de la oficina
  • No recomendado en móvil con datos 4G

Diagnóstico de conexión

Paso 1
Ver handshakes y estado del túnel
sudo wg show
Paso 2
Verificar que el puerto UDP 51820 está abierto en el router
sudo ufw status
Paso 3
Comprobar que la clave pública del servidor en el cliente es correcta
sudo wg show wg0 public-key
Paso 4
Confirmar IP forwarding activo (debe devolver 1)
cat /proc/sys/net/ipv4/ip_forward
Paso 5
Si AllowedIPs no incluye la IP destino, el tráfico no rutará
ping 192.168.20.5 # desde cliente
Reset
Reiniciar WireGuard si nada funciona
sudo wg-quick down wg0 && sudo wg-quick up wg0

Buenas prácticas

Generar un keypair único por dispositivo cliente
Usar split tunnel (AllowedIPs = subredes de oficina)
PersistentKeepalive = 25 en todos los clientes móviles
DDNS (DuckDNS) si el ISP asigna IP dinámica
Reglas iptables con scope estricto (solo wg0)
Pi-hole como DNS = en configs móviles para ad-blocking
Rotar clave del servidor periódicamente
chmod 600 en todos los ficheros de clave privada