[Ninux-Wireless] WireGuard: Next Generation Kernel Network Tunnel

114 views
Skip to first unread message

Germano Massullo

unread,
Nov 21, 2017, 6:31:20 AM11/21/17
to wireless ninux ML
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-q...@wg0.service
# systemctl start wg-q...@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
signature.asc

Germano Massullo

unread,
Nov 21, 2017, 12:57:36 PM11/21/17
to wireless ninux ML
seconda parte dell'esempio 2, per chi ha una distro Linux basata su
Firewalld, come Fedora/RHEL/CentOS

=== 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 us...@10.1.0.22
che è il server SSH in esecuzione sull'host C
_______________________________________________
Wireless mailing list
Wire...@ml.ninux.org
http://ml.ninux.org/mailman/listinfo/wireless

Germano Massullo

unread,
Dec 12, 2017, 3:51:41 AM12/12/17
to wireless ninux ML
Pull request per supporto su systemd-networkd
https://github.com/systemd/systemd/pull/4191

Rugantio

unread,
Dec 13, 2017, 3:29:12 PM12/13/17
to wire...@ml.ninux.org
Il 2017-12-12 08:51 Germano Massullo ha scritto:
> Pull request per supporto su systemd-networkd
> https://github.com/systemd/systemd/pull/4191

Grazie del contributo!
La sto provando su Debian (è in unstable) e sembra fare il suo dovere.
In questi giorni la provo su arch e vi faccio sapere come va.
Mi piacerebbe però saperne di più riguardo la sicurezza di wireguard,
sai se qualcuno ha fatto un audit?

Germano Massullo

unread,
Dec 13, 2017, 6:35:02 PM12/13/17
to wire...@ml.ninux.org, Jason A. Donenfeld
Il 13/12/2017 21:26, Rugantio ha scritto:
> Mi piacerebbe però saperne di più riguardo la sicurezza di wireguard,
> sai se qualcuno ha fatto un audit?

Jason A. Donenfeld, il creatore di Wireguard ha detto:

===========
WireGuard has undergone several intense code reviews, and of course it's
been
written by a guy who audits other people's codebases for a living, but it
hasn't _yet_ been audited. And now is *not* the time to audit it either!
It's
still undergoing changes, so as to make any audit done now not very
useful. I
suspect after we post the first RFC to netdev, there will be a flurry of
changes requested. After those are made, and the structure of the code base
solidifies, we'll be in a good place to request audits. Fortunately
being from
the security industry myself, I know a few different companies who want
to take
a look at it. So hold tight -- they'll be comin'.
===========

da https://xn--4db.cc/HtJY8GOU

Germano Massullo

unread,
Jan 10, 2018, 6:57:27 AM1/10/18
to wireless ninux ML
Il 12/12/2017 09:51, Germano Massullo ha scritto:
> Pull request per supporto su systemd-networkd
> https://github.com/systemd/systemd/pull/4191
Pull request approvata, ora WireGuard è disponibile in systemd-networkd
https://lists.zx2c4.com/pipermail/wireguard/2018-January/002274.html

Stefano De Carlo

unread,
Apr 4, 2018, 5:42:41 AM4/4/18
to wire...@ml.ninux.org
Il 10/01/2018 12:57, Germano Massullo ha scritto:
> Pull request approvata, ora WireGuard è disponibile in systemd-networkd

È interessante che Torvalds stesso spinge per avere Wireguard incluso in
Linux: https://lkml.org/lkml/2018/2/13/752

Stefanauss.

Germano Massullo

unread,
Apr 4, 2018, 8:48:20 AM4/4/18
to wireless ninux ML
Il 4 aprile 2018 11:42, Stefano De Carlo <stefa...@gmail.com> ha scritto:
> Il 10/01/2018 12:57, Germano Massullo ha scritto:
>> Pull request approvata, ora WireGuard è disponibile in systemd-networkd
>
> È interessante che Torvalds stesso spinge per avere Wireguard incluso in
> Linux: https://lkml.org/lkml/2018/2/13/752

Bene!
Spero che si diffonda anche nella comunità BSD, così da poterlo avere
in futuro anche in FreeNAS

Germano Massullo

unread,
Jul 2, 2018, 4:27:21 PM7/2/18
to wireless ninux ML
Notizia simpatica:
US Senator Recommends Open-Source WireGuard To NIST For Government VPN
https://www.phoronix.com/scan.php?page=news_item&px=WireGuard-Senator-Recommends

Germano Massullo

unread,
Jul 2, 2018, 4:33:33 PM7/2/18
to wireless ninux ML

Germano Massullo

unread,
Aug 3, 2018, 10:14:52 AM8/3/18
to wireless ninux ML
[ Linus Torvalds Is Hoping WireGuard Will Be Merged Sooner Rather Than
Later ]

Linus wrote:
"Btw, on an unrelated issue: I see that Jason actually made the pull
request to have wireguard included in the kernel.

Can I just once again state my love for it and hope it gets merged soon?
Maybe the code isn't perfect, but I've skimmed it, and compared to the
horrors that are OpenVPN and IPSec, it's a work of art."

https://www.phoronix.com/scan.php?page=news_item&px=Linus-Likes-WireGuard
Reply all
Reply to author
Forward
0 new messages