WireGuard in Docker (2026): il modo pulito per ospitare autonomamente con docker-compose

Esegui WireGuard in Docker nel modo giusto: linuxserver/wireguard vs wg-easy, il file docker-compose, le insidie di NET_ADMIN e sysctl, la persistenza e quando un container supera un'installazione bare-metal.

Di Eric GerardFondatore · VPNSmith - Specialista in VPN autogestite e VPS GDPR

Aggiornato 7 min lettura7 min

Link di affiliazione: possibile commissione, senza costi extra. Metodo

Genera la mia configLeggi la guida

fig. 01 / self-host-vpnencrypted tunnelUDP 51820DEVICE10.8.0.2SERVER10.8.0.1INTERNETNATAllowedIPs = 0.0.0.0/0, ::/0ListenPort = 51820 (server)
fig. 01 / self-host-vpn

Eseguire WireGuard in Docker ti offre ciò che rende i container così preziosi: un server che puoi avviare, smantellare, versionare e trasferire su un altro host in pochi minuti, senza installare pacchetti sulla macchina stessa. Il problema è che un container VPN non è un container normale - interagisce con lo stack di rete del kernel, quindi alcuni flag sono imprescindibili. Se li imposti correttamente, un WireGuard containerizzato è veloce quanto uno bare-metal. Se li imposti male, il tunnel si connette ma non instrada nulla in silenzio.

fig. 01 / self-host-vpnencrypted tunnelUDP 51820DEVICE10.8.0.2SERVER10.8.0.1INTERNETNATAllowedIPs = 0.0.0.0/0, ::/0ListenPort = 51820 (server)
fig. 01 / self-host-vpn

Questo è il modo pulito e orientato alla produzione per farlo.

Non hai ancora un host? Gli esempi partono da un Contabo Cloud VPS (link affiliato), da 5,50 € al mese su 24 mesi (prezzo rilevato il 17 ottobre 2026): gira sotto KVM, quindi l'host ha un proprio kernel con il modulo WireGuard integrato su cui si appoggia il container. Se preferisci un provider statunitense con 30 giorni soddisfatti o rimborsati, il VPS Basic di Ultahost costa 5,52 $ al mese su 24 mesi (1 GB di RAM, IPv4 dedicato, letto il 21 ottobre 2026), e anche i suoi VPS girano su KVM (indicato su ultahost.com, letto il 26 ottobre 2026), quindi il modulo del kernel c'è. Un'altra opzione: HostPapa Unmanaged VPS Lite (link affiliato) a 2,95 $ al mese con un impegno di 3 anni, poi a tariffa normale (1 core, 1 GB di RAM, 25 GB NVMe, accesso root via SSH, rimborso entro 30 giorni, rilevato il 28 ottobre 2026).

Prima di tutto, l'errore comune su "WireGuard in Docker"

WireGuard è un modulo del kernel. Quando "esegui WireGuard in Docker", la crittografia e l'instradamento avvengono ancora nel kernel Linux dell'host - il container contiene solo gli strumenti user-space (wg, wg-quick) e la tua configurazione. Questo è il motivo per cui non c'è penalità sulle prestazioni: il percorso dei dati non entra mai nel container.

Spiega anche i requisiti. Per creare e gestire un'interfaccia di rete dall'interno di un container, quel container necessita di capacità di rete elevate (NET_ADMIN), e l'host deve essere autorizzato a inoltrare pacchetti (net.ipv4.ip_forward=1). Queste non sono scelte opzionali di hardening - senza di esse il container rifiuta di avviarsi o si avvia morto.

Scegli la tua immagine: linuxserver/wireguard vs wg-easy

Due immagini coprono quasi tutti i casi d'uso:

  • linuxserver/wireguard - un server pulito, guidato dalla configurazione. Definisci i peer tramite variabili d'ambiente o modificando file in una directory /config montata. Genera configurazioni client e codici QR al primo avvio. Ideale quando desideri infrastruttura come codice, molti peer o impegnare la tua configurazione in un repository privato.
  • wg-easy - WireGuard più una dashboard web. Crea e revoca peer da un browser, scansiona codici QR per telefoni, osserva le statistiche di trasferimento live per cliente. Ideale per un numero limitato di dispositivi e un onboarding rapido senza toccare la CLI. Lo trattiamo dall'inizio alla fine - compreso il cambio di password della v14 - nella guida completa a wg-easy self-host.

Entrambe sono mature e ampiamente utilizzate. La decisione è dashboard vs file, non qualità.

Il file docker-compose (wg-easy)

Verifica della versione (25 ottobre 2026): questo esempio usa le variabili di wg-easy v14, quindi è fissato all'immagine :14. wg-easy v15 (versione attuale 15.5.0) non legge più WG_HOST, PASSWORD_HASH né WG_DEFAULT_DNS. Per ottenere un file v15 in un minuto, usa il nostro generatore docker-compose per wg-easy.

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.

Come raggiungerai il pannello?

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

docker-compose.yml
# 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
Caddyfile
wg.example.com {
	reverse_proxy wg-easy:80
}

03Esegui i comandi di installazione

install.sh
# 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

Vedi il piano su Contabo

Rack server illuminati di blu in un data center
Rack server illuminati di blu in un data center

services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy:14
    container_name: wg-easy
    environment:
      - WG_HOST=vpn.example.com        # il tuo dominio VPS o IP pubblico
      - PASSWORD_HASH=<bcrypt-hash>     # login UI web
      - WG_DEFAULT_DNS=1.1.1.1
    volumes:
      - ./config:/etc/wireguard         # persistenza - mantieni questo sull'host
    ports:
      - "51820:51820/udp"               # dati WireGuard
      - "51821:51821/tcp"               # UI web (proteggi questo con firewall sul tuo IP)
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

Tre righe fanno il grosso del lavoro e sono i punti di fallimento usuali:

  • cap_add: NET_ADMIN permette al container di gestire l'interfaccia wg0. Senza di essa, il container non può attivare il tunnel.
  • sysctls: net.ipv4.ip_forward=1 trasforma la macchina in un router. Senza di essa, il tunnel si connette ma nessun traffico lo attraversa - la causa più comune di "dice connesso ma nulla funziona".
  • volumes: ./config mantiene chiavi e peer sull'host in modo che una ricreazione non cancelli ogni client.

Esponi pubblicamente la porta dati UDP; proteggi con firewall la porta TCP della UI web sul tuo IP - non lasciare mai la 51821 aperta su internet.

La checklist dell'host (fai questo prima di incolpare il container)

Un container può essere perfetto e ancora non instradare nulla a causa del livello sottostante:

  1. Firewall cloud: apri 51820/udp nel gruppo di sicurezza del tuo provider, non solo sull'host. Questo è il fallimento silenzioso numero uno su un VPS. Vedi quale porta usa WireGuard e come aprirla se cambi la porta predefinita.
  2. Modulo kernel host: la maggior parte delle distro moderne include il modulo WireGuard nel kernel (Linux 5.6+). Se modprobe wireguard fallisce sull'host, installa gli header del kernel - il container non può caricare un modulo che l'host non ha.
  3. DNS per i client: imposta WG_DEFAULT_DNS in modo che i client non perdano query al resolver che stavano usando. Abbinalo alla nostra guida alla prevenzione delle perdite DNS di WireGuard.

Quando un container è la scelta giusta - e quando non lo è

Usa Docker quando esegui altri servizi sulla stessa macchina e vuoi WireGuard isolato e riproducibile, quando desideri la dashboard di wg-easy, o quando ridistribuisci spesso su host diversi. L'intera configurazione diventa un file compose che puoi versionare e spostare.

Evita Docker quando il VPS non fa altro che WireGuard. Un apt install wireguard bare-metal più un file di configurazione è più semplice, ha una parte mobile in meno ed è facilmente scriptabile - vedi i nostri modelli di configurazione WireGuard e la guida completa Contabo + WireGuard per l'auto-ospitazione. Per una VPN a scopo unico, il container aggiunge un packaging di cui non hai bisogno.

Il VPS sottostante

Containerizzato o meno, WireGuard necessita di un host con un IP pubblico e una buona connessione in uscita. Un piccolo VPS è sufficiente - 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:

Ottieni un VPS Contabo per il tuo container WireGuard →

Per il confronto completo prezzo/prestazioni tra i provider, vedi il VPS più economico per una VPN WireGuard.

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.

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.

La limitazione onesta

Docker rende WireGuard portabile, non più sicuro. Il container condivide il kernel dell'host, funziona con NET_ADMIN ed è sicuro solo quanto l'host. Non isola WireGuard dalla macchina - chiunque abbia accesso root sull'host possiede il tunnel. Considera il container come una comodità di distribuzione, indurisci l'host come se WireGuard fosse installato direttamente su di esso e tieni la porta della UI web fuori da internet pubblico. Fai questo, e WireGuard containerizzato è la configurazione di auto-ospitazione più pulita che ci sia.

Link di affiliazione

Prezzo verificato il 17/10/2026, durata 24 mesi

Domande frequenti

WireGuard è più lento in Docker rispetto a bare metal?
Nessuna differenza significativa. WireGuard gira nel kernel Linux dell'host, non all'interno del container - il container contiene solo gli strumenti user-space (wg, wg-quick) e la configurazione. Il percorso dei dati è lo stesso modulo del kernel in entrambi i casi, quindi throughput e latenza corrispondono a un'installazione bare-metal. Il container è un packaging, non un livello di prestazioni.
Quale immagine dovrei usare - linuxserver/wireguard o wg-easy?
linuxserver/wireguard è il server minimale, guidato da file di configurazione: gestisci i peer modificando file o variabili d'ambiente. wg-easy aggiunge una UI web per creare peer, mostrare codici QR e vedere statistiche di trasferimento live - molto più amichevole per pochi dispositivi. Scegli linuxserver/wireguard per infrastruttura come codice e molti peer; scegli wg-easy quando desideri una dashboard e un rapido onboarding dei client.
Perché il mio container WireGuard non si avvia o non inoltra il traffico?
Tre cause usuali. Primo, il container necessita della capacità NET_ADMIN (e su alcune configurazioni SYS_MODULE) per gestire l'interfaccia - aggiungi `cap_add: [NET_ADMIN]`. Secondo, l'inoltro IP deve essere attivo: imposta `sysctl: net.ipv4.ip_forward=1` in compose o sull'host. Terzo, la porta UDP pubblicata (default 51820/udp) deve essere aperta sia nel firewall cloud che sull'host. Se manca uno di questi, il tunnel si avvia ma non instrada nulla.
Ho ancora bisogno di un VPS per eseguire WireGuard in Docker?
Solo se desideri un punto di uscita pubblico con un IP stabile - per l'accesso remoto a una rete domestica puoi eseguire il container su un server domestico dietro il port-forwarding. Per una VPN a cui connettersi da ovunque (e per ottenere un IP statico pulito), un piccolo VPS è la scelta standard. Un'istanza da 4-6 €/mese satura facilmente la sua connessione con WireGuard.
Come posso mantenere peer e chiavi attraverso i riavvii del container?
Esegui un bind-mount della directory di configurazione sull'host (es. `./config:/config`). Le chiavi e le definizioni dei peer vivono lì, quindi `docker compose down && up` mantiene ogni client funzionante. Non memorizzare mai le chiavi solo all'interno del layer scrivibile del container - una ricreazione le cancella e ogni client deve essere ri-registrato.