<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>