wg-easy è un'immagine Docker gratuita che esegue WireGuard con un pannello di amministrazione web sul tuo server: aggiungi dispositivi, scarichi le loro configurazioni e mostri i codici QR dal browser invece di modificare wg0.conf. La versione 15 è quella attuale; serve un VPS con la porta UDP 51820 aperta. Questa guida usa un Cloud VPS di Contabo come server di esempio.
Non hai ancora scelto il server? La nostra classifica dei VPS più economici per WireGuard confronta quanto fattura davvero ogni fornitore per un server utilizzabile.
WireGuard è veloce e moderno, ma l'installazione standard sono file e riga di comando: generare chiavi, modificare wg0.conf a mano, lanciare wg set per ogni dispositivo, spostare configurazioni da una parte all'altra. Per un dispositivo va bene. Per una famiglia, qualche laptop e un paio di telefoni diventa noioso - ed è nel noioso che nascono gli errori (e le chiavi che trapelano). wg-easy risolve esattamente questo: tiene il vero WireGuard sotto, intatto, e ci monta sopra una dashboard web pulita. Aggiungere un client in due clic, mostrare un codice QR per un telefono, vedere chi è connesso e quanto trasferisce. Questa è l'installazione completa 2026, incluso il cambio di password che fa inciampare chiunque aggiorni.
Consiglio: se il tunnel non si connette, la causa è quasi sempre la porta. Vedi la nostra guida sulla porta predefinita di WireGuard (UDP 51820) e come aprirla, inoltrarla o cambiarla.
Senza copia e incolla: il generatore docker-compose di wg-easy, gratuito, scrive il docker-compose.yml della v15 per la tua installazione nel browser: pannello di amministrazione solo su localhost o in HTTPS sul tuo dominio tramite Caddy, e un primo avvio non presidiato facoltativo.
Genera qui il tuo docker-compose.yml per wg-easy v15
Inserisci l'indirizzo del server e come accedi al pannello: ottieni il file compose, il Caddyfile se serve e i comandi di installazione.
01Descrivi il tuo server
Tutto viene generato nel tuo browser. Nulla di ciò che scrivi, password compresa, viene inviato ai nostri server.
L'indirizzo a cui si collegano i client WireGuard.
Un record A per questo nome deve puntare al server, con le porte 80 e 443 aperte.
Senza installazione automatica, apri il pannello dopo il primo avvio: la procedura chiede l'account amministratore, poi host e porta. Inserisci la stessa porta UDP indicata sopra.
02Copia i file
# 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
}
03Esegui i comandi di installazione
# 1. Firewall: prima SSH, poi la porta di 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
# Nota: le porte pubblicate da Docker aggirano ufw. Aprile/chiudile anche nel firewall del provider.
# 2. Crea la cartella e incolla il o i file generati
sudo mkdir -p /etc/docker/containers/wg-easy
cd /etc/docker/containers/wg-easy
sudo nano docker-compose.yml
sudo nano Caddyfile
# 3. Avvia wg-easy
sudo docker compose up -d
# Segui i log (Ctrl+C per uscire)
sudo docker compose logs -f wg-easy
# 4. Apri il pannello: https://wg.example.com
Questo file ha bisogno di un server con IP pubblico
Contabo Cloud VPS 4 (4 vCPU, 8 GB di RAM, IPv4 dedicato, traffico illimitato): 5,50 € al mese con durata di 24 mesi (prezzo verificato il 17/10/2026), tutto ciò che serve a wg-easy.
Link di affiliazione: riceviamo una commissione senza costi aggiuntivi per te.
Carta rifiutata, o preferisci un provider statunitense? Il VPS Basic di Ultahost costa 5,52 $/mese su 24 mesi (letto il 21 ottobre 2026) e accetta anche Bitcoin, Alipay, WeChat Pay e Qiwi; controlla le sue condizioni per il tuo paese. Vedi i VPS Ultahost
Cos'è davvero wg-easy (e cosa non è)
wg-easy è un unico contenitore Docker che esegue un server WireGuard e una piccola applicazione web per gestirlo. La cosa importante da capire subito: non sostituisce né reimplementa WireGuard. Il tunnel è sempre lo stesso WireGuard del kernel, con le stesse chiavi e lo stesso protocollo sul filo. wg-easy è gestione, non una nuova VPN. Due conseguenze:
- Nessuna penalizzazione di velocità. Throughput e latenza sono identici a una configurazione scritta a mano, perché il percorso dei dati non tocca mai l'applicazione web.
- L'interfaccia web è la superficie d'attacco. La dashboard può creare client, quindi chi la controlla controlla la tua VPN. Proteggere quel pannello è tutta la storia della sicurezza (più sotto).
Cosa ottieni in cambio: una pagina del browser che elenca ogni client, creare/disabilitare/eliminare con un clic, un codice QR per client per i telefoni e un contatore di trasferimento in tempo reale per peer. Per attivare una manciata di dispositivi senza toccare il terminale, niente è più veloce.

Prima di iniziare: l'host che ti serve
wg-easy è un contenitore, quindi ti serve un host Linux capace di eseguire Docker e con un IP pubblico. Per una VPN raggiungibile da ovunque, significa un piccolo VPS - WireGuard è così leggero che un'istanza da 4-6 €/mese satura la sua porta di rete molto prima che la CPU se ne accorga. Contabo è qui l'esempio scelto per il rapporto prezzo/banda, e la procedura bare-metal è nella nostra guida a WireGuard auto-ospitato su Contabo se vuoi confrontare la via manuale.
Prendi un VPS Contabo per eseguire wg-easy →
Una seconda opzione se preferisci un periodo di rimborso di 30 giorni: il VPS Basic di Ultahost, letto su ultahost.com il 21 ottobre 2026 a 5,52 $ al mese fatturati su 24 mesi (prezzo di listino 9,19 $), con 1 core CPU, 1 GB di DDR5, 30 GB NVMe, un IPv4 dedicato e garanzia di rimborso di 30 giorni. 1 GB basta per Docker e il container wg-easy su una VPN personale. Il piano non pubblica né velocità della porta né volume di traffico, verificali prima di contarci per un uso intenso.
Sull'host ti servono Docker e il plugin Compose installati, il modulo kernel di WireGuard disponibile (ogni distro moderna, Linux 5.6+, lo include) e la possibilità di aprire l'UDP 51820 in sia il firewall dell'host sia il gruppo di sicurezza del tuo provider.
Il file docker-compose (wg-easy v15)
Verifica della versione (24 ottobre 2026): la versione attuale è la v15.5.0 (24 ottobre 2026). La v15 è una riscrittura completa:
WG_HOST,PASSWORD_HASHe quasi tutte le altre variabili della v14 sono sparite, e le loro impostazioni ora stanno nell'interfaccia web. Un tutorial v14 incollato sull'immagine:latestavvia un container che ignora in silenzio host e password. Tutto ciò che segue è il metodo v15, preso dal file compose e dalla documentazione del progetto.La v15.5.0 in un minuto: include le correzioni di sicurezza di Node.js di ottobre 2026, quindi aggiorna anche se tutto funziona:
sudo docker compose pull && sudo docker compose up -d(il tag:15usato sotto segue la nuova versione, client e chiavi restano nel volume). Porta inoltre il supporto integrato ad AmneziaWG alla versione 3.1, aggiungeWG_INTERFACE(predefinitowg0) per eseguire due istanze sullo stesso host eTRUSTED_PROXIESper un pannello dietro un reverse proxy (vedi la sezione sulla protezione). Fonte: note di rilascio v15.5.0 e documentazione della configurazione opzionale del progetto.
Questo file segue quello ufficiale, con una modifica voluta: l'interfaccia web è pubblicata solo su 127.0.0.1, quindi il pannello di amministrazione non è mai raggiungibile da Internet e lo apri tramite un tunnel SSH. Vuoi un pannello HTTPS sul tuo dominio con Caddy, o un primo avvio del tutto automatico? Il nostro generatore docker-compose per wg-easy scrive questa variante per te.
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:
Cosa fa ogni parte, e dove di solito si rompe:
127.0.0.1:51821:51821/tcptiene il pannello fuori dall'interfaccia pubblica. Conta più di quanto sembri: le porte pubblicate da Docker scavalcano UFW, quindi un semplice"51821:51821/tcp"è aperto al mondo anche seufw statusdice il contrario.INSECURE=trueserve perché qui il pannello è servito in HTTP semplice (la cifratura la fa il tunnel SSH). Senza, la v15 marca il cookie di accesso comeSecure, il browser lo scarta in HTTP e torni alla pagina di login a ogni tentativo.cap_add: NET_ADMINesysctls: net.ipv4.ip_forward=1permettono al container di creare l'interfaccia WireGuard e di instradare per i tuoi client. Se manca uno dei due, il tunnel si connette e poi non instrada nulla.- Il volume con nome
etc_wireguardcontiene il database con tutte le chiavi e i client, quindidocker compose downseguito daupconserva i tuoi dispositivi.
Mettilo al suo posto e avvialo, con la struttura di cartelle della documentazione ufficiale:
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
Poi apri il pannello dal tuo computer, attraverso il tunnel:
# 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
Primo avvio: la procedura guidata (addio PASSWORD_HASH)
Il PASSWORD_HASH bcrypt e il comando wgpw, a cui ogni tutorial v14 dedica una sezione, non esistono più. Alla prima visita la v15 apre invece una procedura guidata:
- Crea l'account di amministrazione: nome utente e password. wg-easy salva da solo la password come hash argon2, quindi non c'è nulla da generare né da proteggere con escape in un file
.env. - «Hai una configurazione esistente?» Rispondi No per un'installazione nuova (Sì è l'importazione della v14, più sotto).
- Host e porta: l'IP pubblico o il dominio che i client chiameranno (un indirizzo IPv6 va tra parentesi quadre, come
[2001:db8::1]) e la porta UDP,51820se non hai cambiato la mappatura. I client ricevono esattamente questo valore comeEndpoint.
DNS, intervallo di indirizzi dei client e allowed IPs predefiniti si impostano ora nel pannello di amministrazione, non più con variabili d'ambiente. Per saltare la procedura (Ansible, cloud-init), la v15 legge INIT_ENABLED=true con INIT_USERNAME, INIT_PASSWORD, INIT_HOST e INIT_PORT solo al primissimo avvio; rimuovile quando il container è partito, così la password non resta nel file. Il generatore può scrivere queste righe per te.
Password dimenticata? Reimpostala dal server:
cd /etc/docker/containers/wg-easy
sudo docker compose exec -it wg-easy cli db:admin:reset
Se arrivi dalla v14
Non esiste un aggiornamento sul posto. Nel vecchio pannello, clicca Backup per scaricare wg0.json e annota le vecchie variabili d'ambiente, esegui docker compose down, avvia il file v15 qui sopra, poi rispondi Sì nella procedura e carica wg0.json: chiavi e client vengono importati, le vecchie variabili no, quindi reimposta DNS e allowed IPs nel pannello di amministrazione. Un limite netto della guida di migrazione: gli host armv6 e armv7 (Raspberry Pi più vecchi) non possono passare alla v15 e devono restare fissati su :14.
Resti sulla v14 o abbandoni il pannello? Lo stesso file di backup si può incollare in WireGuard Manager, la nostra dashboard ospitata (gratis per 1 server e 3 peer): poiché wg0.json contiene la chiave privata di ogni client, il .conf e il codice QR di ogni dispositivo tornano subito disponibili, e genera un wg0.conf normale per wg-quick se dismetti wg-easy. L'importazione non cambia nulla sul server.
Aggiungi il tuo primo client
Nella dashboard, clicca New Client, dagli un nome (es. laptop, telefono-pixel), e wg-easy genera la coppia di chiavi e una configurazione pronta. Per un computer, scarica il .conf e importalo nell'app WireGuard o nei modelli di configurazione; per un telefono, clicca l'icona QR e scansionalo con l'app mobile WireGuard - niente da digitare, nessun trasferimento di file. L'interruttore per client disabilita un dispositivo all'istante senza eliminarlo, ed è il modo giusto di revocare un telefono perso.
Client importato ma non funziona niente? Tre cause coprono quasi tutti i casi, e ognuna ha il suo strumento. Lo stato resta senza handshake: la porta UDP 51820 non arriva al container, usa il verificatore di porta WireGuard, che scrive la regola del firewall del tuo host (ufw, firewalld, nftables, iptables) e un test tcpdump che mostra se i pacchetti arrivano. Handshake corretto ma pagine bloccate o caricate a metà: un problema di MTU, che il calcolatore MTU dimensiona per la tua linea (riporta il valore nella config del client). Vuoi far passare nel tunnel solo una parte del traffico, o continuare a vedere la rete di casa: il calcolatore AllowedIPs dà l'elenco esatto da incollare negli allowed IPs predefiniti di wg-easy.
Blindare il pannello di amministrazione - fallo subito, non dopo
L'interfaccia web può creare client VPN, quindi un pannello esposto e poco protetto è il vero pericolo di wg-easy. Tre livelli, in ordine di preferenza:
-
Non pubblicare mai 51821 su Internet. Nel firewall del tuo provider VPS, lascia aperto l'UDP 51820 e tieni il TCP 51821 chiuso al mondo. Raggiungi il pannello solo dal tuo IP, o - il modo più pulito - connettiti prima alla VPN e apri la dashboard attraverso il tunnel, così la porta di amministrazione non si affaccia mai su Internet.
-
Password robusta, poi 2FA. La v15 offre l'accesso a due fattori TOTP: apri il menu in alto a destra, poi Account, attiva l'autenticazione a due fattori e scansiona il codice QR con la tua app di autenticazione. Tratta l'accesso al pannello come una password di root.
-
Metti il TLS davanti se devi raggiungerla da remoto: un reverse proxy (Caddy, Traefik, nginx) che termina HTTPS con un certificato reale, idealmente con una lista di autorizzazione. HTTP in chiaro su una porta pubblica è l'unica configurazione da evitare.
Dalla v15.5.0 imposta anche
TRUSTED_PROXIEScon l'indirizzo di origine del tuo proxy (per un container Caddy sulla stessa rete Docker, il suo IP su quella rete). wg-easy leggeràX-Forwarded-HosteX-Forwarded-Forsolo da quell'indirizzo, e gli accessi falliti vengono registrati con il vero IP del client: uno strumento come CrowdSec blocca l'attaccante e non il tuo proxy. Un indirizzo scritto male impedisce l'avvio del container: controlladocker compose logsdopo la modifica.
Una VPN auto-ospitata a cui qualsiasi passante può aggiungersi è peggio di nessuna VPN. Il pannello sono le chiavi del regno - proteggilo di conseguenza.
wg-easy contro le alternative
- vs PiVPN - PiVPN installa WireGuard direttamente sull'host e gestisce i peer dal terminale (
pivpn add,pivpn -qr). Niente contenitore, niente interfaccia web. Scegli PiVPN per una macchina bare-metal snella e scriptabile; scegli wg-easy quando vuoi davvero una dashboard cliccabile e statistiche in tempo reale. - vs una configurazione scritta a mano - Modificare
wg0.confda soli è l'opzione più trasparente e leggera, ideale per una macchina VPN a scopo unico e per l'infrastruttura come codice. wg-easy scambia un po' di superficie in più (l'app web) per una gestione dei client rapida e senza CLI. - vs altri stack auto-ospitati - Se vuoi un mesh (ogni dispositivo che parla direttamente, con il NAT traversal gestito per te) invece di un classico server a stella, wg-easy ha la forma sbagliata; quello è il terreno di Tailscale/Headscale/NetBird, confrontati nella nostra guida alla migliore VPN auto-ospitata.
wg-easy gira anche benissimo accanto ad altri contenitori, motivo per cui si abbina naturalmente a un'installazione di WireGuard in Docker più ampia.
Quando wg-easy è la scelta giusta - e quando no
Usa wg-easy quando attivi diverse persone o dispositivi, vuoi la configurazione del telefono via QR, ti piace vedere lo stato della connessione in tempo reale, o semplicemente preferisci un pannello a un file di configurazione. Trasforma «configurare un client VPN» da un'incombenza CLI di cinque minuti in due clic.
Evita wg-easy quando la macchina non fa altro che servire uno o due peer WireGuard (una configurazione a mano è più semplice e ha un componente mobile in meno), quando non puoi tenere in sicurezza la porta di amministrazione fuori da Internet, o quando in realtà vuoi un mesh e non un server. Per tutti gli altri, wg-easy è il percorso onesto più rapido da un VPS appena creato a una VPN WireGuard funzionante e gestibile.
Per avere l'essenziale a portata di mano: la WireGuard Cheat Sheet gratuita (PDF di 5 pagine in inglese, download diretto, senza registrazione) raccoglie le tabelle di keepalive e MTU, i comandi wg genkey/wg pubkey/wg genpsk e i quattro controlli del server in una riga da lanciare per primi quando un tunnel non fa passare traffico. Il WireGuard Self-Hosting Kit a pagamento (9 USD, in inglese) aggiunge una checklist di diagnosi con 12 cause e 11 modelli di configurazione, tra cui una per wg-easy.
Una VPN cambia il tuo IP. Non cambia il tuo browser.
Un tunnel sostituisce l'indirizzo che un servizio vede. Non cambia nulla di ciò che il tuo browser dichiara da solo - caratteri, schermo, fuso orario, stack grafico - e quella combinazione basta spesso a riconoscerti da una sessione all'altra.
Misura la tua impronta del browser - misurazione passiva, senza domande, senza account, senza email.
Il limite onesto
wg-easy rende WireGuard più facile da gestire, non più privato o più sicuro di quanto WireGuard già sia. Condivide il kernel dell'host, gira con NET_ADMIN, ed è blindato solo quanto l'host e il pannello di amministrazione che gli metti davanti. Non controlla i tuoi client, non impedisce da solo le fughe DNS (imposta il DNS nel pannello di amministrazione e verifica), e non ti protegge se lasci 51821 aperto. Trattalo come uno strato di comodità sopra il vero WireGuard: distribuiscilo, irrobustisci host e pannello, tieni la porta dati pubblica e quella di amministrazione privata - e avrai una VPN auto-ospitata che puoi davvero gestire per un'intera famiglia senza vivere nel terminale.
Link di affiliazione
★ Datacenter GDPR di Norimberga · ✓ IPv4 dedicato incluso · porta da 200 Mbit/s
Ospita la tua VPN sul tuo VPS → ContaboCloud VPS 4 · 5,50 €/mese · Carta o PayPal · ordini accettati anche fuori dall'UE→Prezzo verificato il 17/10/2026, durata 24 mesi


