<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-15">
</head>
<body text="#000000" bgcolor="#FFFFFF">
Wireguard è un tunnel di rete di nuova generazione, ancora in fase
di sviluppo, che mira a realizzare VPN:<br>
- ad altissime prestazioni [1];<br>
- con una forte perfect forward secrecy [2] verificata formalmente
[6];<br>
- con protocollo stateless [3] [4];<br>
- molto "silenziose" [5];<br>
- di facile realizzazione;<br>
<br>
(note a fine messaggio)<br>
<br>
Il codice sta per essere inserito nel kernel Linux (meno di 4000
righe di codice), per il momento è disponibile attraverso modulo
DKMS.<br>
<br>
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.<br>
<br>
========<br>
| Esempio 1 |<br>
========<br>
Descrizione: esempio con due host con IP pubblico che vogliono
instaurare un tunnel<br>
<br>
Su ogni host, dopo aver installato Wireguard<br>
# mkdir /etc/wireguard<br>
# cd /etc/wireguard<br>
# umask 077<br>
si genera la chiave privata<br>
# wg genkey > privatekey<br>
si genera la chiave pubblica<br>
# wg pubkey < privatekey > publickey<br>
si crea il file di configurazione vuoto<br>
# touch wg0.conf<br>
dopodiché ad esempio, sull'host A il file wg0.conf viene modificato
come segue<br>
<br>
<pre wrap="">[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 = <span class="moz-txt-star"><span class="moz-txt-tag"># </span></span>è 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
<b class="moz-txt-star"><span class="moz-txt-tag"></span></b></pre>
replicare la stessa cosa sull'altro host, con le dovute modifiche.<br>
Infine salvare i file, dopodiché<br>
# systemctl enable <a class="moz-txt-link-abbreviated" href="mailto:wg-quick@wg0.service">wg-quick@wg0.service</a><br>
# systemctl start <a class="moz-txt-link-abbreviated" href="mailto:wg-quick@wg0.service">wg-quick@wg0.service</a><br>
<br>
in tal maniera si crea automaticamente una interfaccia di rete "wg0"
che ha le caratteristiche presenti nel file di configurazione.<br>
L'interfaccia è automaticamente collegata.<br>
<br>
<br>
========<br>
| Esempio 2 |<br>
========<br>
Descrizione: configurazione leggermente più complessa:<br>
- host A: dietro NAT, tipico computer casalingo;<br>
- 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;<br>
- host C: macchina virtuale che gira sull'host B<br>
<br>
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<br>
<br>
<pre wrap="">=== Host A ===
# cat /etc/wireguard/wg0.conf
[Interface]
Address = 10.1.0.21/24
PrivateKey = <b class="moz-txt-star"><span class="moz-txt-tag">*censurata*</span></b>
[Peer]
PublicKey = <b class="moz-txt-star"><span class="moz-txt-tag">*censurata</span><span class="moz-txt-tag">*</span></b> è 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 = <b class="moz-txt-star"><span class="moz-txt-tag">*censurata</span><span class="moz-txt-tag">*</span></b>
[Peer]
PublicKey = <b class="moz-txt-star"><span class="moz-txt-tag">*censurata</span><span class="moz-txt-tag">*</span></b>
AllowedIPs = 10.1.0.21/32
[Peer]
PublicKey = <b class="moz-txt-star"><span class="moz-txt-tag">*censurata</span><span class="moz-txt-tag">*</span></b>
AllowedIPs = 10.1.0.22/32
=== Host C ===
# cat /etc/wireguard/wg0.conf
[Interface]
Address = 10.1.0.22/24
ListenPort = 51820
PrivateKey = <b class="moz-txt-star"><span class="moz-txt-tag">*censurata</span><span class="moz-txt-tag">*</span></b>
[Peer]
PublicKey = <b class="moz-txt-star"><span class="moz-txt-tag">*censurata</span><span class="moz-txt-tag">*</span></b>
Endpoint = 192.168.1.1:51820
AllowedIPs = 10.1.0.0/24</pre>
<br>
Che cosa è cambiato?<br>
<br>
=== Host A: ===<br>
- 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;<br>
- 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;<br>
- AllowedIPs indica che qualsiasi IP della sottorete 10.1.0.0/24 può
comunicare con host A.<br>
<br>
=== Host B: ===<br>
i due peer hanno un IP con la dicitura /32 perché non devono poter
cambiare IP a loro piacimento<br>
<br>
=== Host C: ===<br>
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.<br>
<br>
<br>
========<br>
| Note |<br>
========<br>
<br>
[1]: <a class="moz-txt-link-freetext" href="https://www.wireguard.com/performance/">https://www.wireguard.com/performance/</a><br>
[2]: 5 Protocol & Cryptography -
<a class="moz-txt-link-freetext" href="https://www.wireguard.com/papers/wireguard.pdf">https://www.wireguard.com/papers/wireguard.pdf</a> <br>
[3]: <a class="moz-txt-link-freetext" href="https://www.wireguard.com/protocol/#connection-less-protocol">https://www.wireguard.com/protocol/#connection-less-protocol</a><br>
[4]: 6 Timers & Stateless UX -
<a class="moz-txt-link-freetext" href="https://www.wireguard.com/papers/wireguard.pdf">https://www.wireguard.com/papers/wireguard.pdf</a> <br>
[5]: 5.1 Silence is a Virtue -
<a class="moz-txt-link-freetext" href="https://www.wireguard.com/papers/wireguard.pdf">https://www.wireguard.com/papers/wireguard.pdf</a> <br>
[6]:
<a class="moz-txt-link-freetext" href="https://www.wireguard.com/papers/wireguard-formal-verification.pdf">https://www.wireguard.com/papers/wireguard-formal-verification.pdf</a><br>
</body>
</html>