Se ha utilizando la imagen de linuxserver/wireguard para el túnel y ngoduykhanh/wireguard-ui para la gestión de clientes.
Para el despliegue se utiliza una pila de dos contenedores. Es vital que el contenedor de la interfaz web comparta la red del servidor VPN para poder gestionar las interfaces correctamente.
Archivo YAML de base usado para la creación:
services:
wireguard:
image: lscr.io/linuxserver/wireguard:latest
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
volumes:
- ./config:/config
- /lib/modules:/lib/modules
ports:
- "5000:5000" # Puerto de la interfaz web
- "51820:51820/udp" # Puerto del túnel VPN
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
wireguard-ui:
image: ngoduykhanh/wireguard-ui:latest
container_name: wireguard-ui
depends_on:
- wireguard
cap_add:
- NET_ADMIN
network_mode: service:wireguard
environment:
- WGUI_USERNAME=admin
- WGUI_PASSWORD=<TU_CONTRASEÑA_SEGURA>
- WGUI_MANAGE_START=false
- WGUI_MANAGE_RESTART=false
volumes:
- ./db:/app/db
- ./config/wg_confs:/etc/wireguard
restart: unless-stopped
Dentro del panel web, en la sección Wireguard Server Settings, se deben aplicar los siguientes parámetros para garantizar el tráfico de red y la coexistencia con un Proxy Inverso (como Nginx Proxy Manager).
Server Interface Addresses: 10.252.1.1/24 (Por defecto nos asigna esta, podemos cambiar por la que queramos).
Post Up Script: Este script activa el enmascaramiento de red y permite que el tráfico de la red de Docker no sea secuestrado por la VPN.
iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -I INPUT -p tcp --dport 5000 -j ACCEPT; iptables -I INPUT -s 192.168.48.0/20 -j ACCEPT
Pre Down Script:
iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -D INPUT -p tcp --dport 5000 -j ACCEPT; iptables -D INPUT -s 192.168.48.0/20 -j ACCEPT
Para que el acceso externo sea funcional, se deben configurar los siguientes campos:
Endpoint Address: Debe ser tu dominio público o IP pública.
DNS Servers: IP del servidor DNS local si lo hay y se quiere navegar con filtrado interno (ej. la IP de Pi-hole).
MTU: 1450 (Ajustar si se detecta inestabilidad en redes móviles).
Es imprescindible realizar una redirección de puertos (Port Forwarding) en el router principal para permitir la entrada del tráfico VPN.
| Protocolo | Puerto Externo | Puerto Interno | IP de Destino |
|---|---|---|---|
| UDP | 51820 | 51820 | IP_DEL_SERVIDOR |
Nota: WireGuard utiliza exclusivamente el protocolo UDP. No es necesario abrir el puerto 51820 en TCP.
Para añadir un nuevo dispositivo:
Acceder a Wireguard Clients.
Crear un nuevo perfil.
Hacer clic en Apply Config (botón superior derecho).
Reiniciar el servicio desde la terminal para cargar los cambios: docker restart wireguard.
Si el acceso web se pierde temporalmente, reiniciar la interfaz: docker restart wireguard-ui.