
È giunto il momento in cui il VPN non è più uno strumento esotico usato solo da barbuti sistemisti. Gli utenti hanno esigenze diverse, ma il fatto è che il VPN è diventato necessario per tutti.
Il problema delle soluzioni VPN attuali è che sono difficili da configurare correttamente, costose da mantenere e piene di codice legacy di dubbia qualità.
Alcuni anni fa, lo specialista canadese in sicurezza informatica Jason A. Donenfeld ha deciso che era ora di dire basta e ha iniziato a lavorare su . Attualmente, WireGuard si sta preparando per essere incluso nel kernel di Linux, e ha persino ricevuto elogi da e in .
I vantaggi dichiarati di WireGuard rispetto ad altre soluzioni VPN sono:
- Facile da usare.
- Utilizza crittografia moderna: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF, ecc.
- Codice compatto e leggibile, più facile da analizzare per vulnerabilità.
- Elevate prestazioni.
- Chiaro e ben definito .
È stata trovata la soluzione ideale? È tempo di seppellire OpenVPN e IPSec? Ho deciso di approfondire e, nel frattempo, ho creato .
Principi di funzionamento
I principi di funzionamento possono essere descritti grossomodo così:
- Viene creato un'interfaccia WireGuard, a cui viene assegnata una chiave privata e un indirizzo IP. Vengono caricati i parametri degli altri peer: le loro chiavi pubbliche, indirizzi IP, ecc.
- Tutti i pacchetti IP che arrivano all'interfaccia WireGuard vengono incapsulati in UDP e agli altri peer.
- I clienti specificano l'indirizzo IP pubblico del server nelle impostazioni. Il server riconosce automaticamente gli indirizzi esterni dei clienti quando riceve dati correttamente autenticati.
- Il server può cambiare l'indirizzo IP pubblico senza interrompere il funzionamento. In questo caso, invia una notifica ai client connessi e questi aggiornano la loro configurazione al volo.
- Viene utilizzato il concetto di routing . WireGuard accetta e invia pacchetti in base alla chiave pubblica del peer. Quando il server decripta un pacchetto correttamente autenticato, verifica il suo campo src. Se corrisponde alla configurazione
allowed-ipsdel peer autenticato, allora il pacchetto viene accettato dall'interfaccia WireGuard. Quando viene inviato un pacchetto in uscita, si verifica una procedura corrispondente: viene preso il campo dst del pacchetto e in base ad esso viene scelto il peer corrispondente, il pacchetto viene firmato con la propria chiave, crittografato con la chiave del peer e inviato all'endpoint remoto.
L'intera logica principale di WireGuard occupa meno di 4.000 righe di codice, mentre OpenVPN e IPSec ne hanno centinaia di migliaia. Per supportare moderni algoritmi crittografici, si propone di includere un nuovo API crittografico nel kernel di Linux. Attualmente si sta discutendo quanto sia una buona idea.
Prestazioni
Il massimo vantaggio in termini di prestazioni (rispetto a OpenVPN e IPSec) sarà evidente sui sistemi Linux, poiché qui WireGuard è implementato come modulo del kernel. Inoltre, sono supportati macOS, Android, iOS, FreeBSD e OpenBSD, ma su di essi WireGuard funziona in userspace con tutte le conseguenze per le prestazioni. Il supporto per Windows è promesso in un prossimo futuro.
Risultati dei benchmark con :

La mia esperienza con l'utilizzo
Non sono un esperto di configurazione VPN. Una volta ho configurato OpenVPN manualmente e è stato molto noioso, mentre non ho nemmeno provato IPSec. Troppissime decisioni da prendere, è molto facile farsi del male. Pertanto, ho sempre usato script già pronti per configurare il server.
Ecco, WireGuard, dal mio punto di vista, è davvero ideale per l'utente. Tutte le decisioni di basso livello sono state adottate nella specifica, quindi il processo di preparazione di un'infrastruttura VPN tipica richiede solo pochi minuti. È praticamente impossibile sbagliare nella configurazione.
Il processo di installazione sito ufficiale, desidero sottolineare l'ottimo .
Vengono generati le chiavi di crittografia utilizzando wg:
SERVER_PRIVKEY=$( wg genkey )
SERVER_PUBKEY=$( echo $SERVER_PRIVKEY | wg pubkey )
CLIENT_PRIVKEY=$( wg genkey )
CLIENT_PUBKEY=$( echo $CLIENT_PRIVKEY | wg pubkey )In seguito, è necessario creare il file di configurazione del server /etc/wireguard/wg0.conf con il seguente contenuto:
[Interface]
Address = 10.9.0.1/24
PrivateKey = $SERVER_PRIVKEY
[Peer]
PublicKey = $CLIENT_PUBKEY
AllowedIPs = 10.9.0.2/32e avviare il tunnel con uno script wg-quick:
sudo wg-quick up /etc/wireguard/wg0.confNei sistemi con systemd, è possibile utilizzare al suo posto sudo systemctl start wg-quick@wg0.service.
Sulla macchina client, creare il file di configurazione /etc/wireguard/wg0.conf:
[Interface]
PrivateKey = $CLIENT_PRIVKEY
Address = 10.9.0.2/24
[Peer]
PublicKey = $SERVER_PUBKEY
AllowedIPs = 0.0.0.0/0
Endpoint = 1.2.3.4:51820 # IP esterno del server
PersistentKeepalive = 25 E allo stesso modo avviare il tunnel:
sudo wg-quick up /etc/wireguard/wg0.confResta da configurare il NAT sul server in modo che i client possano accedere a Internet, e il gioco è fatto!
Questa semplicità d'uso e compattezza della base di codice è stata raggiunta grazie all'abbandono della funzionalità di distribuzione delle chiavi. Non c'è un complicato sistema di certificati e tutto quel terribile corporativo, le chiavi di crittografia brevi vengono distribuite più o meno come le chiavi SSH. Tuttavia, questo comporta un problema: WireGuard non sarà così facile da implementare in alcune reti esistenti.
Tra i difetti va notato che WireGuard non funziona tramite proxy HTTP, poiché l'unico protocollo di trasporto disponibile è UDP. Si pone la domanda se sarà possibile offuscare il protocollo? Certo, non è un compito diretto per una VPN, ma per OpenVPN, ad esempio, esistono modi per mascherarsi da HTTPS, il che aiuta i residenti nei paesi totalitari a utilizzare appieno Internet.
Conclusioni
In sintesi, è un progetto molto interessante e promettente, già si può utilizzare sui server personali. Qual è il vantaggio? Alte prestazioni sui sistemi Linux, facilità di configurazione e supporto, codice compatto e leggibile. Tuttavia, è ancora presto per pensare a una migrazione complessiva dell'infrastruttura a WireGuard, è meglio attendere che venga incorporato nel kernel di Linux.
Per risparmiare il mio (e il vostro) tempo, ho sviluppato . Con questo, è possibile avviare una VPN personale per se stessi e per conoscenti senza nemmeno comprendere totalmente il funzionamento.
Fonte: habr.com
