Skip to content

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

shell
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER

Crear la carpeta para el proyecto

shell
mkdir -p ~/apps/wg-easy
cd ~/apps/wg-easy

Generar hash con bcrypt para la contraseña del panel

shell
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:

shell
nano docker-compose.yml

Y pegaremos la siguiente configuración:

yaml
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-stopped

INFO

1. Para evitar que docker rompa el hash de la contraseña, debe ir con doble $$

2. en WG_HOST va 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

shell
cd ~/apps/wg-easy
docker compose up -d
docker compose logs -f

Reverse proxy en Caddy para el panel

js
wireguard.dominio.com {
    reverse_proxy 127.0.0.1:51821
}

Reglas de firewall (ufw)

shell
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 status

Mantenimiento

Actualizar wg-easy

shell
cd ~/apps/wg-easy
docker compose pull
docker compose up -d

Backup 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/data

Solució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:

shell
# 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:

shell
docker compose down
docker compose up -d
docker compose logs -f

Potenciado con café ☕ y VitePress 📘 | Hosteado con Cloudflare Pages ⚡