Aviso de afiliación - Esta guía enlaza a Contabo, el proveedor de VPS que toma como ejemplo. Si contratas a través de nuestro enlace ganamos una comisión sin coste extra para ti. Cada comando de abajo está documentado a partir del proyecto oficial wg-easy y escrito para ser reproducible en tu propia máquina. El enlace de Ultahost que proponemos como segundo proveedor es un enlace de afiliado en las mismas condiciones.
wg-easy es una imagen Docker gratuita que ejecuta WireGuard con un panel de administración web en tu propio servidor: añades dispositivos, descargas sus configuraciones y muestras códigos QR desde el navegador en lugar de editar wg0.conf. La versión 15 es la actual; necesita un VPS con el puerto UDP 51820 abierto. Esta guía usa un Cloud VPS de Contabo como servidor de ejemplo.
¿Aún no has elegido el servidor? Nuestra clasificación de los VPS más baratos para WireGuard compara lo que cada proveedor cobra de verdad por un servidor usable.
WireGuard es rápido y moderno, pero la instalación estándar son ficheros y línea de comandos: generar claves, editar wg0.conf a mano, ejecutar wg set por cada dispositivo, mover configuraciones de un lado a otro. Para un dispositivo, vale. Para una familia, varios portátiles y un par de móviles, se vuelve tedioso - y es en lo tedioso donde aparecen los errores (y las claves que se filtran). wg-easy resuelve justo eso: mantiene el WireGuard real debajo, intacto, y le acopla un panel web limpio. Añadir un cliente en dos clics, mostrar un QR para un móvil, ver quién está conectado y cuánto transfiere. Esta es la instalación completa de 2026, incluido el cambio de contraseña que hace tropezar a todo el que actualiza.
Consejo: si el túnel no conecta, la causa casi siempre es el puerto. Mira nuestra guía sobre el puerto por defecto de WireGuard (UDP 51820) y cómo abrirlo, redirigirlo o cambiarlo.
Sin copiar y pegar: el generador docker-compose de wg-easy, gratuito, escribe el docker-compose.yml de la v15 para tu instalación en el navegador: panel de administración solo en localhost o en HTTPS en tu propio dominio con Caddy, y un primer arranque desatendido opcional.
Genera aquí tu docker-compose.yml de wg-easy v15
Indica la dirección del servidor y cómo accedes al panel: obtienes el archivo compose, el Caddyfile si hace falta y los comandos de instalación.
01Describe tu servidor
Todo se genera en tu navegador. Nada de lo que escribes, contraseña incluida, se envía a nuestros servidores.
La dirección a la que se conectan los clientes WireGuard.
Un registro A de este nombre debe apuntar al servidor, con los puertos 80 y 443 abiertos.
Sin instalación desatendida, abre el panel tras el primer arranque: el asistente pide la cuenta de administrador y después el host y el puerto. Introduce el mismo puerto UDP que arriba.
02Copia los archivos
# wg-easy v15 - generated on vpnsmith.com/en/tools/wg-easy-compose-generator
# Host: vpn.example.com - WireGuard port: 51820/udp - panel: https://wg.example.com
volumes:
etc_wireguard:
caddy_data:
caddy_config:
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy:15
container_name: wg-easy
environment:
- PORT=80
- TRUSTED_PROXIES=10.42.42.43,fdcc:ad94:bacf:61a3::2b
networks:
wg:
ipv4_address: 10.42.42.42
ipv6_address: fdcc:ad94:bacf:61a3::2a
volumes:
- etc_wireguard:/etc/wireguard
- /lib/modules:/lib/modules:ro
ports:
- "51820:51820/udp" # WireGuard: the only port clients need
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv6.conf.all.disable_ipv6=0
- net.ipv6.conf.all.forwarding=1
- net.ipv6.conf.default.forwarding=1
caddy:
image: caddy:2-alpine
container_name: caddy
ports:
- "80:80/tcp"
- "443:443/tcp"
- "443:443/udp"
networks:
wg:
ipv4_address: 10.42.42.43
ipv6_address: fdcc:ad94:bacf:61a3::2b
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
restart: unless-stopped
networks:
wg:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 10.42.42.0/24
- subnet: fdcc:ad94:bacf:61a3::/64
wg.example.com {
reverse_proxy wg-easy:80
}
03Ejecuta los comandos de instalación
# 1. Cortafuegos: primero SSH, luego el puerto de WireGuard
sudo ufw allow OpenSSH
sudo ufw allow 51820/udp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo ufw enable
# Ojo: los puertos publicados por Docker saltan ufw. Ábrelos/ciérralos también en el cortafuegos del proveedor.
# 2. Crea la carpeta y pega el o los archivos generados
sudo mkdir -p /etc/docker/containers/wg-easy
cd /etc/docker/containers/wg-easy
sudo nano docker-compose.yml
sudo nano Caddyfile
# 3. Arranca wg-easy
sudo docker compose up -d
# Sigue los registros (Ctrl+C para salir)
sudo docker compose logs -f wg-easy
# 4. Abre el panel: https://wg.example.com
Este archivo necesita un servidor con IP pública
Contabo Cloud VPS 4 (4 vCPU, 8 GB de RAM, IPv4 dedicada, tráfico ilimitado): 5,50 € al mes con permanencia de 24 meses (precio revisado el 17/10/2026), todo lo que necesita wg-easy.
Enlace de afiliado: cobramos una comisión sin coste adicional para ti.
¿Tarjeta rechazada o prefieres un proveedor de EE. UU.? El VPS Basic de Ultahost cuesta 5,52 $/mes a 24 meses (leído el 21 de octubre de 2026) y también acepta Bitcoin, Alipay, WeChat Pay y Qiwi; revisa sus condiciones para tu país. Ver VPS de Ultahost
Qué es wg-easy realmente (y qué no)
wg-easy es un único contenedor Docker que ejecuta un servidor WireGuard y una pequeña aplicación web para gestionarlo. Lo clave de entender de entrada: no reemplaza ni reimplementa WireGuard. El túnel sigue siendo el mismo WireGuard del núcleo, con las mismas claves y el mismo protocolo en el cable. wg-easy es gestión, no una VPN nueva. Dos consecuencias:
- Sin penalización de velocidad. El rendimiento y la latencia son idénticos a una configuración escrita a mano, porque la ruta de datos nunca toca la aplicación web.
- La interfaz web es la superficie de ataque. El panel puede crear clientes, así que quien lo controla controla tu VPN. Proteger ese panel es toda la historia de seguridad (más abajo).
Lo que obtienes a cambio: una página de navegador que lista cada cliente, crear/desactivar/eliminar a un clic, un código QR por cliente para los móviles y un contador de transferencia en vivo por peer. Para dar de alta un puñado de dispositivos sin tocar la terminal, nada es más rápido.

Antes de empezar: el host que necesitas
wg-easy es un contenedor, así que necesitas un host Linux capaz de correr Docker y con una IP pública. Para una VPN a la que llegar desde cualquier sitio, eso significa un VPS pequeño - WireGuard es tan ligero que una instancia de 4-6 €/mes satura su puerto de red mucho antes de que la CPU se entere. Contabo sirve aquí de ejemplo por su relación precio/ancho de banda, y el procedimiento bare-metal está en nuestra guía de WireGuard autoalojado en Contabo por si quieres comparar con la vía manual.
Consigue un VPS Contabo para correr wg-easy →
Una segunda opción si prefieres un plazo de reembolso de 30 días: el VPS Basic de Ultahost, leído en ultahost.com el 21 de octubre de 2026 a 5,52 $ al mes facturados por 24 meses (precio de lista 9,19 $), con 1 núcleo de CPU, 1 GB de DDR5, 30 GB NVMe, una IPv4 dedicada y garantía de devolución de 30 días. 1 GB basta para Docker y el contenedor wg-easy en una VPN personal. El plan no publica velocidad de puerto ni volumen de tráfico, compruébalos antes de contar con él para un uso intensivo.
En el host necesitas Docker y el plugin Compose instalados, el módulo de núcleo de WireGuard disponible (toda distro moderna, Linux 5.6+, lo trae), y poder abrir el UDP 51820 en tanto el cortafuegos del host como el grupo de seguridad de tu proveedor.
El fichero docker-compose (wg-easy v15)
Comprobación de versión (24 de octubre de 2026): la versión actual es la v15.5.0 (24 de octubre de 2026). La v15 es una reescritura completa:
WG_HOST,PASSWORD_HASHy casi todas las demás variables de la v14 han desaparecido, y sus ajustes se hacen ahora en la interfaz web. Un tutorial v14 pegado sobre la imagen:latestarranca un contenedor que ignora sin avisar tu host y tu contraseña. Todo lo que sigue es el método v15, tomado del fichero compose y de la documentación del proyecto.La v15.5.0 en un minuto: incluye los parches de seguridad de Node.js de octubre de 2026, así que actualiza aunque todo funcione:
sudo docker compose pull && sudo docker compose up -d(la etiqueta:15que usamos abajo sigue la nueva versión, y tus clientes y claves se quedan en el volumen). Además sube su soporte integrado de AmneziaWG a la versión 3.1, añadeWG_INTERFACE(por defectowg0) para ejecutar dos instancias en un mismo host yTRUSTED_PROXIESpara un panel detrás de un proxy inverso (ver la sección de bloqueo). Fuente: notas de la versión v15.5.0 y documentación de configuración opcional del proyecto.
Este fichero sigue el oficial, con un cambio deliberado: la interfaz web solo se publica en 127.0.0.1, así que el panel de administración nunca es accesible desde Internet y lo abres por un túnel SSH. ¿Quieres un panel HTTPS en tu propio dominio con Caddy, o un primer arranque totalmente desatendido? Nuestro generador docker-compose de wg-easy te escribe esa variante.
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy:15
container_name: wg-easy
environment:
- INSECURE=true # panel over plain HTTP, reached only through an SSH tunnel
networks:
wg:
ipv4_address: 10.42.42.42
ipv6_address: fdcc:ad94:bacf:61a3::2a
volumes:
- etc_wireguard:/etc/wireguard
- /lib/modules:/lib/modules:ro
ports:
- "51820:51820/udp" # WireGuard data: open to the internet
- "127.0.0.1:51821:51821/tcp" # web UI: bound to localhost only
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv6.conf.all.disable_ipv6=0
- net.ipv6.conf.all.forwarding=1
- net.ipv6.conf.default.forwarding=1
networks:
wg:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 10.42.42.0/24
- subnet: fdcc:ad94:bacf:61a3::/64
volumes:
etc_wireguard:
Qué hace cada parte, y dónde suele fallar:
127.0.0.1:51821:51821/tcpmantiene el panel fuera de la interfaz pública. Importa más de lo que parece: los puertos que publica Docker se saltan UFW, así que un simple"51821:51821/tcp"queda abierto al mundo aunqueufw statusdiga lo contrario.INSECURE=truees necesario porque aquí el panel se sirve por HTTP simple (el cifrado lo pone el túnel SSH). Sin él, la v15 marca su cookie de sesión comoSecure, el navegador la descarta en HTTP y vuelves a la página de inicio de sesión en cada intento.cap_add: NET_ADMINysysctls: net.ipv4.ip_forward=1permiten al contenedor crear la interfaz WireGuard y enrutar para tus clientes. Si falta cualquiera de los dos, el túnel conecta y luego no enruta nada.- El volumen con nombre
etc_wireguardguarda la base de datos con todas las claves y clientes, así que undocker compose downseguido deupconserva tus dispositivos.
Colócalo y arráncalo, con la estructura de carpetas de la documentación oficial:
sudo mkdir -p /etc/docker/containers/wg-easy
cd /etc/docker/containers/wg-easy
sudo nano docker-compose.yml # paste the file above
sudo docker compose up -d
sudo docker compose logs -f wg-easy # Ctrl+C once it is listening
Después abre el panel desde tu propio equipo, a través del túnel:
# on your own computer, not on the server
ssh -L 51821:127.0.0.1:51821 user@YOUR_SERVER_IP
# then open http://localhost:51821 in your browser
Primer arranque: el asistente de configuración (adiós a PASSWORD_HASH)
El PASSWORD_HASH bcrypt y el comando wgpw, a los que todo tutorial v14 dedica una sección, ya no existen. En la primera visita, la v15 abre un asistente:
- Crea la cuenta de administración: un usuario y una contraseña. wg-easy guarda la contraseña como hash argon2 por sí mismo, así que no hay nada que generar ni que escapar en un fichero
.env. - «¿Tienes una configuración existente?» Responde No en una instalación nueva (Sí es la importación de la v14, más abajo).
- Host y puerto: la IP pública o el dominio al que se conectarán tus clientes (una dirección IPv6 va entre corchetes, como
[2001:db8::1]) y el puerto UDP,51820salvo que hayas cambiado el mapeo. Los clientes reciben exactamente ese valor comoEndpoint.
El DNS, el rango de direcciones de los clientes y las allowed IPs por defecto se configuran ahora en el panel de administración, no en variables de entorno. Para saltarte el asistente (Ansible, cloud-init), la v15 lee INIT_ENABLED=true con INIT_USERNAME, INIT_PASSWORD, INIT_HOST e INIT_PORT solo en el primer arranque; quítalas cuando el contenedor esté en marcha para que la contraseña no se quede en el fichero. El generador puede escribir esas líneas por ti.
¿Sin acceso? Restablece la contraseña de administración desde el servidor:
cd /etc/docker/containers/wg-easy
sudo docker compose exec -it wg-easy cli db:admin:reset
Si vienes de la v14
No hay actualización en el sitio. En el panel antiguo, pulsa Backup para descargar wg0.json y apunta tus antiguas variables de entorno, ejecuta docker compose down, arranca el fichero v15 de arriba, responde Sí en el asistente y sube wg0.json: las claves y los clientes se conservan, las variables antiguas no, así que vuelve a fijar DNS y allowed IPs en el panel de administración. Un límite firme de la guía de migración: los hosts armv6 y armv7 (Raspberry Pi antiguas) no pueden pasar a la v15 y deben quedarse fijados en :14.
¿Te quedas en la v14 o abandonas el panel? El mismo archivo de copia se puede pegar en WireGuard Manager, nuestro panel alojado (gratis para 1 servidor y 3 peers): como wg0.json contiene la clave privada de cada cliente, el .conf y el código QR de cada dispositivo vuelven a estar disponibles al momento, y genera un wg0.conf normal para wg-quick si retiras wg-easy. Importar no cambia nada en el servidor.
Añade tu primer cliente
Dentro del panel, pulsa New Client, dale un nombre (p. ej. portatil, movil-pixel), y wg-easy genera el par de claves y una configuración lista. Para un ordenador, descarga el .conf e impórtalo en la aplicación WireGuard o las plantillas de configuración; para un móvil, pulsa el icono QR y escanéalo con la app móvil de WireGuard - sin teclear, sin transferir ficheros. El interruptor por cliente desactiva un dispositivo al instante sin borrarlo, que es la forma correcta de revocar un móvil perdido.
¿Cliente importado pero no funciona nada? Tres causas cubren casi todos los casos, y cada una tiene su herramienta. El estado sigue sin handshake: el puerto UDP 51820 no llega al contenedor, usa el verificador de puerto WireGuard, que escribe la regla de cortafuegos de tu host (ufw, firewalld, nftables, iptables) y una prueba tcpdump que muestra si llegan los paquetes. Handshake correcto pero las páginas se cuelgan o cargan a medias: un problema de MTU, que la calculadora de MTU ajusta a tu enlace (pon el valor en la config del cliente). Quieres que solo una parte del tráfico vaya por el túnel, o seguir viendo tu red local: la calculadora AllowedIPs da la lista exacta para pegar en las allowed IPs por defecto de wg-easy.
Blindar el panel de administración - hazlo ya, no después
La interfaz web puede crear clientes VPN, así que un panel expuesto y mal protegido es el peligro real de wg-easy. Tres capas, por orden de preferencia:
-
Nunca publiques 51821 en Internet. En el cortafuegos de tu proveedor de VPS, deja abierto el UDP 51820 y mantén el TCP 51821 cerrado al mundo. Llega al panel solo desde tu propia IP, o - lo más limpio - conéctate primero a la VPN y abre el panel a través del túnel, para que el puerto de administración nunca dé a Internet.
-
Contraseña fuerte y luego 2FA. La v15 ofrece inicio de sesión en dos pasos TOTP: abre el menú arriba a la derecha, luego Account, activa la autenticación en dos pasos y escanea el código QR con tu app de autenticación. Trata el acceso al panel como una contraseña de root.
-
Pon TLS por delante si debes alcanzarlo en remoto: un proxy inverso (Caddy, Traefik, nginx) terminando HTTPS con un certificado real, idealmente con lista de permitidos. HTTP en plano sobre un puerto público es la única configuración a evitar.
Desde la v15.5.0, define también
TRUSTED_PROXIEScon la dirección de origen de tu proxy (para un contenedor Caddy en la misma red Docker, su IP en esa red). wg-easy solo leeráX-Forwarded-HostyX-Forwarded-Fordesde esa dirección, y los inicios de sesión fallidos se registran con la IP real del cliente: una herramienta como CrowdSec bloquea al atacante y no a tu proxy. Una dirección mal escrita impide que el contenedor arranque: revisadocker compose logstras el cambio.
Una VPN autoalojada a la que cualquier transeúnte puede añadirse es peor que ninguna VPN. El panel son las llaves del reino - protégelo en consecuencia.
wg-easy frente a las alternativas
- vs PiVPN - PiVPN instala WireGuard directamente en el host y gestiona los peers desde la terminal (
pivpn add,pivpn -qr). Sin contenedor, sin interfaz web. Elige PiVPN para una máquina bare-metal ligera y scriptable; elige wg-easy cuando de verdad quieras un panel a clics y estadísticas en vivo. - vs una configuración a mano - Editar
wg0.conftú mismo es la opción más transparente y ligera, ideal para una máquina VPN de un solo propósito y la infraestructura como código. wg-easy cambia un poco de superficie extra (la app web) por una gestión de clientes rápida y sin CLI. - vs otras stacks autoalojadas - Si quieres un mesh (cada dispositivo hablando directamente, con la travesía de NAT gestionada por ti) en vez de un servidor clásico en estrella, wg-easy no tiene la forma adecuada; ese es el terreno de Tailscale/Headscale/NetBird, comparado en nuestra guía de la mejor VPN autoalojada.
wg-easy también convive perfectamente con otros contenedores, de ahí que combine de forma natural con una instalación de WireGuard en Docker más amplia.
Cuándo wg-easy es la elección correcta - y cuándo no
Usa wg-easy cuando das de alta a varias personas o dispositivos, quieres configurar el móvil por QR, te gusta ver el estado de conexión en vivo, o simplemente prefieres un panel a un fichero de configuración. Convierte «configurar un cliente VPN» de una tarea de CLI de cinco minutos en dos clics.
Sáltatelo cuando la máquina no hace más que servir uno o dos peers de WireGuard (una configuración a mano es más simple y tiene una pieza móvil menos), cuando no puedes mantener con seguridad el puerto de administración fuera de Internet, o cuando en realidad quieres un mesh y no un servidor. Para todos los demás, wg-easy es el camino honesto más rápido de un VPS nuevo a una VPN WireGuard funcional y manejable.
Para tener lo esencial a mano: la WireGuard Cheat Sheet gratuita (PDF de 5 páginas en inglés, descarga directa, sin registro) reúne las tablas de keepalive y MTU, los comandos wg genkey/wg pubkey/wg genpsk y las cuatro comprobaciones de servidor en una línea que conviene lanzar primero cuando un túnel no pasa tráfico. El WireGuard Self-Hosting Kit de pago (9 USD, en inglés) añade una lista de diagnóstico de 12 causas y 11 plantillas de configuración, entre ellas una para wg-easy.
Una VPN cambia su IP. No cambia su navegador.
Un túnel sustituye la dirección que ve un servicio. No cambia nada de lo que su navegador anuncia por su cuenta - fuentes, pantalla, zona horaria, pila gráfica - y esa combinación suele bastar para reconocerle de una sesión a otra.
Mida su huella de navegador - medición pasiva, sin preguntas, sin cuenta, sin correo electrónico.
La limitación honesta
wg-easy hace WireGuard más fácil de gestionar, no más privado ni más seguro de lo que WireGuard ya es. Comparte el núcleo del host, corre con NET_ADMIN, y está tan blindado como el host y el panel de administración que pongas delante. No audita tus clientes, no impide por sí solo las fugas de DNS (configura el DNS en el panel de administración y verifica), y no te protege si dejas 51821 abierto. Trátalo como una capa de comodidad sobre el WireGuard real: despliégalo, endurece el host y el panel, mantén el puerto de datos público y el de administración privado - y tendrás una VPN autoalojada que de verdad puedes operar para todo un hogar sin vivir en la terminal.
Enlace de afiliado
★ Datacenter Núremberg GDPR · ✓ IPv4 dedicada incluida · puerto de 200 Mbit/s
Aloja tu VPN en tu propio VPS → ContaboCloud VPS 4 · 5,50 €/mes · Tarjeta o PayPal · pedidos desde fuera de la UE aceptados→Precio revisado el 17/10/2026, permanencia 24 meses


