Wireguard (wg-easy)
NOTE
Esta guía está enfocada a wg-easy que incluye wireguard y adicionalmente un entorno GUI para la facilidad de gestión de usuarios/dispositivos con gestión vía subdominio gracias a proxy de Caddy
Instalar docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USERCrear la carpeta para el proyecto
mkdir -p ~/apps/wg-easy
cd ~/apps/wg-easyGenerar hash con bcrypt para la contraseña del panel
docker run --rm ghcr.io/wg-easy/wg-easy:14 wgpw 'tu contraseña'Opcionalmente puedes generarlo vía web desde sitios como bcrypt.online
Ajustes para el proyecto
Estando en la carpeta /apps/wg-easy, ejecutaremos:
nano docker-compose.ymlY pegaremos la siguiente configuración:
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy:14
container_name: wg-easy
environment:
- "LANG=es"
- "WG_HOST=ip_del_servidor"
- "PASSWORD_HASH=$$2a$$12$$xxxxxxxxxxxxxxxx"
- "PORT=51821"
- "WG_PORT=51820"
volumes:
- ./data:/etc/wireguard
- /lib/modules:/lib/modules:ro
ports:
- "51820:51820/udp"
- "127.0.0.1:51821:51821/tcp"
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stoppedINFO
1.Para evitar que docker rompa el hash de la contraseña, debe ir con doble $$
2.enWG_HOSTva la IP del vps utilizado, podrías usar un subdominio pero no puede pasar por el proxy de cloudflare (no protege udp y rompería la operativa), el cual deberá ser también un subdominio diferente al que utilices para el panel.
Levantar contenedor
cd ~/apps/wg-easy
docker compose up -d
docker compose logs -fReverse proxy en Caddy para el panel
wireguard.dominio.com {
reverse_proxy 127.0.0.1:51821
}Reglas de firewall (ufw)
sudo ufw allow 51820/udp # túnel WireGuard
sudo ufw allow 80/tcp # ACME challenge de Caddy
sudo ufw allow 443/tcp # HTTPS del panel
sudo ufw statusMantenimiento
Actualizar wg-easy
cd ~/apps/wg-easy
docker compose pull
docker compose up -dBackup de configs (las claves de los peers/dispositivos)
Ideal siempre también tener un backup fuera de este VPS
tar -czvf wg-easy-backup-$(date +%F).tar.gz ~/apps/wg-easy/dataSolución de problemas
Error: modprobe: can't change directory to '/lib/modules' / iptables ... Table does not exist
Ocurre porque el contenedor no tiene acceso a /lib/modules del host, así que modprobe no encuentra el módulo iptable_nat que necesita wg-quick para las reglas de NAT. Se soluciona montando ese directorio como volumen (ver sección de ajustes arriba) y confirmando que el host lo soporta:
# En el host (no dentro del contenedor)
ls /lib/modules/$(uname -r) # si falla, reinicia el VPS tras el último update de kernel
sudo modprobe iptable_nat # si falla, instala linux-modules-extra-$(uname -r)
lsmod | grep -E 'wireguard|nat'Tras confirmar que el host puede cargar los módulos, recrea el contenedor:
docker compose down
docker compose up -d
docker compose logs -f