WireGuard è un pro­to­col­lo moderno di rete privata virtuale (VPN) che consente con­nes­sio­ni sicure e crit­to­gra­fa­te tra i di­spo­si­ti­vi. Grazie a una base di codice semplice e ad alte pre­sta­zio­ni, si è affermato come al­ter­na­ti­va potente e a basso consumo di risorse rispetto ai vecchi pro­to­col­li VPN come IPsec e OpenVPN. In questo articolo scoprirai cosa con­trad­di­stin­gue WireGuard, come funziona e come in­stal­la­re questa soluzione VPN sul tuo sistema.

Che cos’è WireGuard?

WireGuard è un pro­to­col­lo VPN open source uti­liz­za­to per creare tunnel crit­to­gra­fa­ti tra di­spo­si­ti­vi. I flussi di dati vengono in­stra­da­ti at­tra­ver­so il tunnel e sono quindi protetti da accessi non au­to­riz­za­ti. Oltre a puntare su una crit­to­gra­fia robusta, WireGuard offre ot­ti­miz­za­zio­ni per i sistemi mobili e l’Internet delle cose (IoT). Il software è concesso in licenza come software libero con la licenza GPLv2 ed è di­spo­ni­bi­le in modalità mul­ti­piat­ta­for­ma. WireGuard è scritto nei linguaggi C e Go e funziona su Windows, macOS, BSD, iOS e Android.

Dal 2020 WireGuard è integrato di­ret­ta­men­te nel kernel Linux. Poiché Linux viene eseguito come sistema operativo standard su miliardi di di­spo­si­ti­vi connessi in tutto il mondo, WireGuard può essere uti­liz­za­to pra­ti­ca­men­te ovunque. Grazie alla con­fi­gu­ra­zio­ne semplice e al basso impatto sul sistema, viene uti­liz­za­to sempre più spesso da servizi VPN e aziende.

Quali fun­zio­na­li­tà offre WireGuard?

Una ca­rat­te­ri­sti­ca centrale di WireGuard è il co­sid­det­to cryptokey routing. In questo caso, al codice pubblico di un partner di con­nes­sio­ne vengono associati gli in­ter­val­li di indirizzi IP con­sen­ti­ti all’interno di un tunnel. I pacchetti in entrata di un partner di con­nes­sio­ne vengono decifrati grazie alla chiave pubblica. Un pacchetto in entrata, dopo la de­ci­fra­tu­ra, viene con­se­gna­to solo se proviene da un indirizzo IP cor­ri­spon­den­te alla chiave. In caso contrario, viene scartato.

A dif­fe­ren­za dei pro­to­col­li VPN più datati come IPsec e OpenVPN, WireGuard utilizza un set fisso di primitive crit­to­gra­fi­che moderne, senza ne­go­zia­zio­ne. Mentre nei pro­to­col­li con­so­li­da­ti le basi crit­to­gra­fi­che vengono definite durante l’handshake, WireGuard si affida a una com­bi­na­zio­ne di algoritmi fissa e con cro­no­lo­gia delle versioni. Se in futuro una base crit­to­gra­fi­ca dovesse essere con­si­de­ra­ta insicura, verrà ri­la­scia­ta una nuova versione del pro­to­col­lo, che includerà una selezione di algoritmi ag­gior­na­ta e sicura.

Il pro­to­col­lo utilizza algoritmi di crit­to­gra­fia moderni e altamente sicuri, tra cui:

  • Noise Protocol Framework per i processi di handshake e scambio di chiavi
  • Curve25519 per lo scambio di chiavi sicuro
  • ChaCha20 per la crit­to­gra­fia sim­me­tri­ca
  • Poly1305 per l’au­ten­ti­ca­zio­ne
  • BLAKE2 per una funzione veloce di hash crit­to­gra­fi­ca
  • SipHash24 per la ge­ne­ra­zio­ne di hash crit­to­gra­fi­ca­men­te sicuri
  • HKDF per il processo sicuro di de­ri­va­zio­ne delle chiavi

Quali sono i vantaggi di WireGuard?

WireGuard offre molti vantaggi, che lo rendono una scelta pri­vi­le­gia­ta per le moderne con­nes­sio­ni VPN. Di seguito una pa­no­ra­mi­ca dei prin­ci­pa­li vantaggi:

  • Base di codice snella: WireGuard ha una base di codice si­gni­fi­ca­ti­va­men­te più piccola, con circa 4.000 righe di codice rispetto alle circa 100.000–600.000 di OpenVPN o IPsec. Questa riduzione rende il pro­to­col­lo più sicuro, perché i bug possono essere in­di­vi­dua­ti più fa­cil­men­te, e meno esigente in termini di risorse, poiché richiede meno potenza di calcolo.
  • Pre­sta­zio­ni più elevate: grazie alla minore com­ples­si­tà, WireGuard offre una velocità di tra­smis­sio­ne più alta e una latenza inferiore rispetto a molti pro­to­col­li con­cor­ren­ti. Ciò lo rende par­ti­co­lar­men­te adatto ad ap­pli­ca­zio­ni che ri­chie­do­no una con­nes­sio­ne rapida e stabile, come streaming, giochi online e vi­deo­con­fe­ren­ze.
  • Ef­fi­cien­za ener­ge­ti­ca: WireGuard si attiva solo quando vengono ef­fet­ti­va­men­te trasmessi dei dati. Questo risparmio ener­ge­ti­co è par­ti­co­lar­men­te van­tag­gio­so per i di­spo­si­ti­vi mobili, poiché prolunga la durata della batteria.
  • Supporto del roaming: WireGuard supporta il passaggio senza in­ter­ru­zio­ni tra Wi-Fi e reti mobili, senza che la con­nes­sio­ne venga persa. Se la con­nes­sio­ne dovesse comunque in­ter­rom­per­si, la ri­sta­bi­li­sce di solito più ra­pi­da­men­te rispetto ad altri pro­to­col­li VPN.
  • Con­fi­gu­ra­zio­ne semplice: rispetto ad altri pro­to­col­li VPN, WireGuard non richiede l’im­po­sta­zio­ne manuale di una mol­ti­tu­di­ne di opzioni crit­to­gra­fi­che. Utilizza una con­fi­gu­ra­zio­ne pre­de­fi­ni­ta, ac­ces­si­bi­le sia agli utenti esperti sia a chi è agli inizi.

Come funziona WireGuard?

WireGuard è un pro­to­col­lo VPN peer-to-peer de­cen­tra­liz­za­to che non richiede alcun server centrale. Al contrario, è possibile creare di­ret­ta­men­te un tunnel tra due di­spo­si­ti­vi (“peer”). Un “server WireGuard” in questo caso è sem­pli­ce­men­te un di­spo­si­ti­vo che contiene i dati di con­fi­gu­ra­zio­ne per più peer.

La creazione della con­nes­sio­ne funziona in modo simile a Secure Shell (SSH): i peer generano coppie di chiavi pubbliche e private, le scambiano e le uti­liz­za­no per l’au­ten­ti­ca­zio­ne e la crit­to­gra­fia dei dati trasmessi. La crit­to­gra­fia si basa su metodi crit­to­gra­fi­ci moderni che ga­ran­ti­sco­no un livello di sicurezza elevato.

Oltre alla creazione delle chiavi crit­to­gra­fi­che, sui peer devono essere con­fi­gu­ra­te im­po­sta­zio­ni di rete e di routing (vedi la nostra guida più avanti). Questo include la con­fi­gu­ra­zio­ne degli in­ter­val­li di indirizzi IP con­sen­ti­ti, che vengono associati alle chiavi pubbliche. Solo i pacchetti pro­ve­nien­ti da questi indirizzi IP vengono accettati.

L’invio dei dati avviene tramite lo User Datagram Protocol (UDP), che è preferito per la sua velocità ed ef­fi­cien­za. Non richiede un’ampia cor­re­zio­ne degli errori come il Tran­smis­sion Control Protocol (TCP), il che consente una tra­smis­sio­ne più rapida.

La con­fi­gu­ra­zio­ne avviene di norma tramite lo strumento da riga di comando di WireGuard e i comuni strumenti di rete. Per gli utenti meno esperti, i servizi VPN com­mer­cia­li offrono app intuitive che con­sen­to­no una con­fi­gu­ra­zio­ne sem­pli­fi­ca­ta.

Primi passi con WireGuard

In linea di massima, WireGuard può essere in­stal­la­to e con­fi­gu­ra­to su un sistema Linux senza grandi sforzi. Sulle versioni più recenti di Ubuntu (a partire dalla 20.04 LTS) il pro­to­col­lo VPN è già integrato come modulo del kernel, quindi non è ne­ces­sa­ria l’in­stal­la­zio­ne ag­giun­ti­va di re­po­si­to­ry Personal Package Archive (PPA). Esegui sem­pli­ce­men­te il seguente comando:

sudo apt install wireguard
bash

In­stal­la­re WireGuard sul proprio sistema

L’in­stal­la­zio­ne di WireGuard sul tuo sistema è semplice e può essere eseguita con pochi comandi.

Per Ubuntu 20.04 LTS o versioni suc­ces­si­ve:

WireGuard è già integrato come modulo del kernel, quindi non sono necessari re­po­si­to­ry PPA ag­giun­ti­vi. Esegui sem­pli­ce­men­te il seguente comando:

sudo apt update
sudo apt install wireguard
bash

Per le versioni pre­ce­den­ti di Ubuntu:

Qui devi ag­giun­ge­re il PPA di WireGuard per poter ef­fet­tua­re l’in­stal­la­zio­ne:

sudo add-apt-repository ppa:wireguard/wireguard
sudo apt-get update
sudo apt-get install wireguard
bash

Generare le chiavi WireGuard

Come molti altri moderni pro­to­col­li VPN, anche WireGuard si basa sull’uso di chiavi crit­to­gra­fi­che per stabilire con­nes­sio­ni sicure tra peer. Ogni peer ha bisogno di una coppia di chiavi, una privata e una pubblica. La chiave privata resta sempre segreta, mentre la chiave pubblica viene condivisa con gli altri peer.

Esegui i seguenti comandi sulla riga di comando per generare una chiave privata e una chiave pubblica WireGuard:

# Creare la directory per le chiavi e impostare i permessi
sudo mkdir -p /etc/wireguard/keys
sudo chmod 700 /etc/wireguard/keys
cd /etc/wireguard/keys
# Impostare umask in modo che solo l’utente root possa leggere/scrivere
umask 077
# Generare la chiave privata e salvarla in un file
wg genkey | sudo tee privatekey | wg pubkey | sudo tee publickey
# Verificare l’output delle chiavi generate
sudo cat privatekey
sudo cat publickey
bash
N.B.

Le chiavi devono essere generate e ar­chi­via­te in un ambiente sicuro. I comandi sopra indicati sono adatti a scopi di test. In un ambiente di pro­du­zio­ne è ne­ces­sa­rio adottare ulteriori misure di sicurezza, come l’uso di directory sicure e controlli di accesso.

Con­fi­gu­ra­re le im­po­sta­zio­ni di rete per WireGuard

Dopo aver generato le chiavi crit­to­gra­fi­che, su ogni peer è ne­ces­sa­rio con­fi­gu­ra­re im­po­sta­zio­ni di rete e di routing spe­ci­fi­che. Questa con­fi­gu­ra­zio­ne è fon­da­men­ta­le per con­sen­ti­re la co­mu­ni­ca­zio­ne sicura tra i peer.

In sostanza viene creato un file di con­fi­gu­ra­zio­ne che contiene, tra le altre cose, le seguenti in­for­ma­zio­ni:

  • Chiavi private e pubbliche dei peer
  • Indirizzi IP con­sen­ti­ti (gli in­ter­val­li di IP con cui il peer è au­to­riz­za­to a co­mu­ni­ca­re)
  • Indirizzi dei peer, associati alle ri­spet­ti­ve chiavi pubbliche

Un esempio della con­fi­gu­ra­zio­ne di base di una con­nes­sio­ne WireGuard potrebbe essere il seguente:

[Interface]
# IP VPN interna del server
Address = 10.0.0.1/24
# Chiave privata (del server)
PrivateKey = <SERVER_PRIVATE_KEY>
# Porta UDP su cui WireGuard accetta le connessioni
ListenPort = 51820
# Client peer
[Peer]
# Chiave pubblica del client
PublicKey = <CLIENT_PUBLIC_KEY>
# IP VPN interna assegnata al client
AllowedIPs = 10.0.0.2/32
txt

Testare la con­nes­sio­ne e attivare WireGuard

Dopo aver in­stal­la­to e con­fi­gu­ra­to WireGuard sul tuo sistema, è il momento di testare la con­nes­sio­ne e attivare l’in­ter­fac­cia di rete. Puoi farlo da riga di comando eseguendo i seguenti comandi:

1. Attivare l’in­ter­fac­cia di rete

Per prima cosa devi attivare l’in­ter­fac­cia WireGuard che hai appena con­fi­gu­ra­to:

sudo systemctl enable --now wg-quick@wg0
bash

Questo comando attiva l’in­ter­fac­cia WireGuard (wg0) che hai creato in pre­ce­den­za. Se il comando viene eseguito cor­ret­ta­men­te, la con­nes­sio­ne dovrebbe essere pronta per inviare dati.

2. Testare la con­nes­sio­ne

Per ve­ri­fi­ca­re che la con­nes­sio­ne funzioni, puoi usare il comando ping per con­trol­la­re se il di­spo­si­ti­vo remoto è rag­giun­gi­bi­le. Esempio:

ping 192.168.1.2
bash

So­sti­tui­sci l’indirizzo IP con quello del peer remoto a cui sei connesso. Se il ping ha esito positivo, significa che la con­nes­sio­ne VPN funziona.

3. Ri­so­lu­zio­ne dei problemi

Se la con­nes­sio­ne non funziona come previsto, verifica i seguenti punti:

  • As­si­cu­ra­ti che gli indirizzi IP siano con­fi­gu­ra­ti cor­ret­ta­men­te.
  • Verifica che le chiavi pubbliche e private siano state scambiate cor­ret­ta­men­te tra loro.
  • As­si­cu­ra­ti che il firewall su entrambi i di­spo­si­ti­vi sia con­fi­gu­ra­to in modo da con­sen­ti­re il traffico WireGuard (di norma sulla porta 51820).

Se i problemi per­si­sto­no, puoi anche riavviare il servizio WireGuard:

sudo systemctl restart wg-quick@wg0
bash
Vai al menu prin­ci­pa­le