VPNSmith
self-host-vpnINFO

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 Gerard · Fondatore · VPNSmith - Specialista in VPN autogestite e VPS GDPR5 min letturaPhoto via Unsplash

Divulgazione affiliata - Questa guida contiene link a Contabo, il VPS che utilizziamo per il nostro WireGuard ospitato autonomamente. Se ordini tramite il nostro link, guadagniamo una commissione senza alcun costo aggiuntivo per te. Documentiamo solo ciò che effettivamente utilizziamo.

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.

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

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)

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:latest
    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. Noi lo eseguiamo su Contabo 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.

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.

★ Datacenter GDPR di Norimberga · ✓ IPv4 dedicato incluso · 200+ Mbps garantiti

Ospita la tua VPN sul tuo VPS → ContaboAccesso root completo · IPv4 pubblico · scegli la tua regione

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.