Wireguard è un tunnel di rete di nuova generazione, ancora in fase di sviluppo, che mira a realizzare VPN: - ad altissime prestazioni [1]; - con una forte perfect forward secrecy [2] verificata formalmente [6]; - con protocollo stateless [3] [4]; - molto "silenziose" [5]; - di facile realizzazione;
(note a fine messaggio)
Il codice sta per essere inserito nel kernel Linux (meno di 4000 righe di codice), per il momento è disponibile attraverso modulo DKMS.
Voglio mostrarvi due esempi di realizzazione di una rete in quanto sebbene la documentazione sia ben scritta, ho passato molto tempo per capire come procedere (vedere esempio 2). Ringrazio Jason A. Donenfeld e Francesco Bonanno per i suggerimenti.
======== | Esempio 1 | ======== Descrizione: esempio con due host con IP pubblico che vogliono instaurare un tunnel
Su ogni host, dopo aver installato Wireguard # mkdir /etc/wireguard # cd /etc/wireguard # umask 077 si genera la chiave privata # wg genkey > privatekey si genera la chiave pubblica # wg pubkey < privatekey > publickey si crea il file di configurazione vuoto # touch wg0.conf dopodiché ad esempio, sull'host A il file wg0.conf viene modificato come segue
[Interface] Address = 10.1.0.1/24 # scegliete un IP per l'host all'interno della rete VPN PrivateKey = # la prendete dal file privatekey ListenPort = 51820
[Peer] # è l'altro host con il quale volete comunicare PublicKey = # è la chiave pubblica generata sull'altro host Endpoint = indirizzo ip pubblico:51820 # è l'IP attraverso il quale è raggiungibile l'altro host AllowedIPs = 10.1.0.2/32 # è l'IP che l'host dovrà avere all'interno della VPN
replicare la stessa cosa sull'altro host, con le dovute modifiche. Infine salvare i file, dopodiché # systemctl enable wg-quick@wg0.service # systemctl start wg-quick@wg0.service
in tal maniera si crea automaticamente una interfaccia di rete "wg0" che ha le caratteristiche presenti nel file di configurazione. L'interfaccia è automaticamente collegata.
======== | Esempio 2 | ======== Descrizione: configurazione leggermente più complessa: - host A: dietro NAT, tipico computer casalingo; - host B: gateway/server centrale della VPN, ha una interfaccia di rete con IP pubblico ed un'altra con IP corrispondente alla sottorete 192.168.1.0/24 dove risiede anche l'host C; - host C: macchina virtuale che gira sull'host B
si vuole che l'host A una volta collegato all'host B, possa comunicare anche con l'host C (e viceversa), e tutti gli altri eventuali host della VPN. Ecco i file di configurazione
=== Host A === # cat /etc/wireguard/wg0.conf [Interface] Address = 10.1.0.21/24 PrivateKey = *censurata*
[Peer] PublicKey = *censurata* è la PublicKey dell'host B Endpoint = vpn.foo.xx:51820 # vpn.foo.xx è l'indirizzo pubblico dell'host B AllowedIPs = 10.1.0.0/24
=== Host B (vpn.foo.xx) === # cat /etc/wireguard/wg0.conf [Interface] Address = 10.1.0.2/24 ListenPort = 51820 PrivateKey = *censurata*
[Peer] PublicKey = *censurata* AllowedIPs = 10.1.0.21/32
[Peer] PublicKey = *censurata* AllowedIPs = 10.1.0.22/32
=== Host C === # cat /etc/wireguard/wg0.conf [Interface] Address = 10.1.0.22/24 ListenPort = 51820 PrivateKey = *censurata*
[Peer] PublicKey = *censurata* Endpoint = 192.168.1.1:51820 AllowedIPs = 10.1.0.0/24
Che cosa è cambiato?
=== Host A: === - non ha ListenPort in quanto in questo esempio si assume che per vari motivi non si abbia la possibilità di aprire porte sul NAT, quindi l'host A non è raggiungibile direttamente, ma deve instaurare lui la connessione. Pertanto ListenPort è inutile; - c'è un solo [Peer] i cui attributi sono quelli di host B. Basta un peer in quanto tutti gli altri host della VPN devono passare per forza tramite host B per raggiungere host A; - AllowedIPs indica che qualsiasi IP della sottorete 10.1.0.0/24 può comunicare con host A.
=== Host B: === i due peer hanno un IP con la dicitura /32 perché non devono poter cambiare IP a loro piacimento
=== Host C: === come host A, tuttavia ha il parametro ListenPort perché è nella stessa sottorete di host B, quindi conviene agevolare il più possibile le possibilità di comunicazione tra i due host.
======== | Note | ========
[1]: https://www.wireguard.com/performance/ [2]: 5 Protocol & Cryptography - https://www.wireguard.com/papers/wireguard.pdf [3]: https://www.wireguard.com/protocol/#connection-less-protocol [4]: 6 Timers & Stateless UX - https://www.wireguard.com/papers/wireguard.pdf [5]: 5.1 Silence is a Virtue - https://www.wireguard.com/papers/wireguard.pdf [6]: https://www.wireguard.com/papers/wireguard-formal-verification.pdf
Il giorno mar, 21/11/2017 alle 12.31 +0100, Germano Massullo ha scritto:
Wireguard è un tunnel di rete di nuova generazione, ancora in fase di sviluppo, che mira a realizzare VPN: ....
Grazie mille, non conoscevo Wireguard.
Che mi dici a proposito di OpenVPN? per ora per fare dei tunnel come quelle da te illustrati uso OpenVPN con Preshared key
Sono stati fatti paragoni di prestazione e sicurezza?
Se puoi fammi sapere
Ciao e ancora Grazie
Il 21/11/2017 18:01, Dario Lesca ha scritto:
Che mi dici a proposito di OpenVPN? per ora per fare dei tunnel come quelle da te illustrati uso OpenVPN con Preshared key
Sono stati fatti paragoni di prestazione e sicurezza?
Il 21/11/2017 12:30, Germano Massullo ha scritto:
[...]
- ad altissime prestazioni [1];
[...] [1]: https://www.wireguard.com/performance/
OpenVPN gira user space, Wireguard kernel space. Per la sicurezza non ti so dire, non sono esperto di OpenVPN, tuttavia potresti dare un'occhiata qui https://www.cvedetails.com/vulnerability-list/vendor_id-3278/Openvpn.html mentre al momento cercando su internet "Wireguard CVE" non esce praticamente niente
seconda parte dell'esempio 2
=== Host B (gateway VPN) === quando viene creata l'interfaccia wg0, essa non essendo stata assegnata ad alcuna zona firewall, ricadrà nella zona di default, che blocca tutto tranne i pacchetti ICMP. Pertanto finché si tratta di effettuare dei ping sugli host (es. da A a C) tutto funziona, appena si prova ad utilizzare un servizio, non ci si riesce. Pertanto con # firewall-cmd --zone=trusted --add-interface=wg0 --permanent # firewall-cmd --reload si risolve il problema. Ora da host A si può eseguire correttamente $ ssh user@10.1.0.22 che è il server SSH in esecuzione sull'host C
it-users@lists.fedoraproject.org