Terzo episodio della serie sul server casalingo. Nel precedente abbiamo installato Ubuntu Server e reso il server raggiungibile via SSH.

Ora costruiamo il componente più importante dell’intera architettura: la VPN. È la porta blindata che separa la zona privata — Vaultwarden, Portainer, l’accesso amministrativo — dal resto di internet. Senza di essa, tutto quello che installeremo dopo sarebbe esposto o inaccessibile da fuori casa. Con essa, la zona privata risponde solo a chi ha la chiave giusta.


Perché una VPN, e perché WireGuard

L’idea è semplice: alcuni servizi non devono mai essere raggiungibili dal web pubblico. Il tuo gestore di password non dovrebbe avere una pagina di login esposta su internet, per quanto robusta. La soluzione è nasconderlo dietro una VPN: da fuori casa ti connetti prima al tunnel cifrato, e solo dentro quel tunnel i servizi privati diventano visibili. Per un attaccante che scansiona internet, semplicemente non esistono.

WireGuard è la tecnologia VPN che useremo. Rispetto ai vecchi OpenVPN e IPsec ha tre vantaggi decisivi: è molto più veloce, ha un codice minuscolo (poche migliaia di righe, quindi più facile da verificare e con meno superficie d’attacco) ed è ormai integrato direttamente nel kernel Linux. La cifratura è moderna e non negoziabile — niente configurazioni deboli possibili. È lo standard de facto per chi fa self-hosting oggi.


wg-easy: WireGuard senza il mal di testa

WireGuard puro si configura a mano, modificando file di testo e generando coppie di chiavi con la riga di comando. Funziona, ma è facile sbagliare. Per questo useremo wg-easy: un’interfaccia web che mette una faccia amichevole su WireGuard. Ti permette di creare un nuovo client con un clic, mostra un QR code da inquadrare con l’app WireGuard dello smartphone, e ti fa vedere a colpo d’occhio chi è connesso.

Lo installeremo con Docker, il sistema che impacchetta ogni servizio in un contenitore isolato. Se non hai ancora Docker sul server, installalo con lo script ufficiale:

curl -fsSL https://get.docker.com | sudo sh

Docker sarà la base anche per tutti i servizi delle prossime puntate, quindi questo passaggio si fa una volta sola.


Installazione passo dopo passo

1. Crea la cartella e il file di configurazione. Sul server, crea una cartella per wg-easy e un file docker-compose.yml:

mkdir -p ~/wg-easy && cd ~/wg-easy
nano docker-compose.yml

Incolla una configurazione minima, sostituendo WG_HOST con il tuo IP pubblico (o un dominio dinamico, se ce l’hai) e scegliendo una password per il pannello:

services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy
    environment:
      - WG_HOST=IL_TUO_IP_PUBBLICO
      - PASSWORD_HASH=...   # genera l'hash come da documentazione
    volumes:
      - ./config:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    restart: unless-stopped

2. Avvia il contenitore:

sudo docker compose up -d

3. Apri il pannello. Dal browser del tuo computer in rete locale, vai su http://192.168.1.100:51821 (l’IP fisso assegnato nel secondo episodio). Inserisci la password: ecco l’interfaccia di wg-easy.

4. Apri la porta sul router. Perché la VPN sia raggiungibile da fuori casa, il router deve inoltrare la porta UDP 51820 verso l’IP del server. Cerca nel router la sezione “Port Forwarding” e crea la regola. È l’unica porta che aprirai verso l’esterno per la zona privata — tutto il resto resta chiuso.


Connettere il primo client

Nel pannello wg-easy clicca “New Client”, dagli un nome (es. smartphone) e comparirà un QR code. Installa l’app WireGuard ufficiale sul telefono, tocca ”+”, scegli “Scansiona da QR code” e inquadra lo schermo. Attiva il tunnel: da quel momento, ovunque tu sia, il telefono è virtualmente dentro la tua rete di casa. Prova a spegnere il Wi-Fi e a raggiungere il pannello wg-easy tramite l’IP interno: se risponde solo con la VPN attiva, la porta blindata funziona.


Conclusione

Hai una VPN WireGuard funzionante, gestibile da un pannello web, con una sola porta aperta verso internet. La zona privata del tuo server ora ha una serratura vera: da qui in poi ogni servizio sensibile vivrà dietro questo tunnel. Nel prossimo episodio ci mettiamo il primo inquilino: Vaultwarden, il gestore di password self-hosted compatibile con Bitwarden, raggiungibile solo attraverso la VPN che hai appena costruito.


Fonti: