WIREGUARD: VPN SEMPLICE, SICURA E VINCENTE!

GNU/LINUXGUIDESISTEMI E RETI

Ecco un nuovo articolo dedicato alle Virtual Private Network. Come dici? Ancora un articolo su questo argomento? Hai ragione sono in fissa per la riservatezza online.

Questa volta non ricorreremo a script preconfezionati ma ci cimenteremo nella creazione di una infrastruttura VPN di ultimissimo grido attraverso l’uso del protocollo (e relativo programma) Wireguard.

L’architettura di rete basata su Wireguard risulta, altrettanto sicura di quella basata sul tradizionale protocollo OpenVPN, tuttavia anche più semplice e veloce.

 

RASPBERRYPI OS: PRIMO AGGIORNAMENTO

Utilizzeremo per questa esperienza un Raspberry Pi 3 Model B+ da dedicare a questo scopo in qualità di server dotato del suo sistema operativo ufficiale RaspberryPi OS.

A fine di non rendere eccessivamente prolissa la trattazione, si darà per scontato che tu già sappia installare quest’ultimo e collegarti in SSH al SoC del Lampone.

Come richiede la buona prassi, una volta collegato al PC provvedo ad aggiornarlo con i comandi:

sudo apt update

sudo apt upgrade

 

INSTALLAZIONE DI WIREGUARD LATO SERVER

Procediamo con l’installazione di Wireguard con il comando:

sudo apt install wireguard

Una volta installato, dovremo accedere alla cartella /etc/wireguard che però appartiene di default all’utente root per ragioni di sicurezza, pertanto dovremo digitare sudo -s seguito da cd /etc/wireguard

A questo punto, essendo la configurazione di Wireguard basata sulla coppia di chiavi asimmetriche di server e client (anche qui do per scontato che tu sappia cosa sia la crittografia asimmetrica) dovremo per prima cosa generare queste chiavi, rispettivamente per server e client con i seguenti comandi:

wg genkey | tee serverprivkey | wg pubkey > serverpubkey

wg genkey | tee client1privkey | wg pubkey > client1pubkey

In ogni caso ricorda che dovrai proteggere le chiavi private e i file di configurazione dell’interfaccia virtuale di rete wg0 (che vedremo tra qualche secondo), in caso contrario chi ne dovesse entrare in possesso sarà in grado di de-crittografare tutto il traffico generato all’interno della nostra VPN:

cd /etc/wireguard

chmod 600 serverprivkey

chmod 600 client1privkey

Ti invito a notare che i nomi che ho adottato sono del tutto arbitrari, pertanto, puoi chiamare le chiavi pubbliche e private, rispettivamente di server e client, come più ti piace, nel mio caso ho preso a prestito queste denominazioni perché mi rendono più agevole comprendere la tipologia delle chiavi di cifratura generate.

Tieni presente che le chiavi (pubblica e privata) del client è possibile generarle in alternativa anche sul solo client: non cambia niente.

Per funzionare, Wireguard utilizza due file di configurazione, l’uno per il server e l’altro per il client (per semplicità qui parleremo di un rapporto uno a uno, ma se ci fossero più client avremo per ciascuno un autonomo file di configurazione). Segnatamente, ci occuperemo della modalità di accesso client-server (ossia tipologia “Road warrior”) e non client-client.

Ogni file di configurazione risulta rivolto alla gestione dell’interfaccia di rete virtuale di Wireguard viene denominata wg0.

Prima di procedere alla creazione del file di configurazione, poiché il programma preinstallato openresolv generava errori nella creazione del tunnel, lo sostituiamo con il comando:

sudo apt install resolvconf

Procediamo con la creazione del file di configurazione:

sudo -s 

cd /etc/wireguard

touch wg0.conf

chmod 600 wg0.conf

nano wg0.conf

e copiamo all’interno il seguente testo di configurazione:

 

[Interface]

Address = 10.0.0.1/24

SaveConfig = true

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;

PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;

ListenPort = 51820

PrivateKey = CC5frWWWRKpwAe5dYKFTYjiIOJoUZ+T/1k5gEiek/TJKM5EUmg=

 [Peer]

PublicKey = 5W7MDLEmRnklNKLNLKLlònklnKLyWjOIjo=

AllowedIPs = 10.0.0.2/24

 

Diamo un’occhiata alla sintassi della sezione “Interface”:

Address: indirizzo attribuito al server all’interno del tunnel VPN

SaveConfig: é opzionale. Se impostato su true, lo stato corrente dell’interfaccia viene salvato nel file di configurazione all’arresto.

PostUp e PostDown: regole di Iptables rivolte rispettivamente a gestire l’apertura e la chiusura del tunnel VPN.

Faccio presente che ho utilizzato l’interfaccia eth0 perché si tratta dell’interfaccia fisica con cui il mio Raspberry é collegato al router, tu dovrai scoprire la tua interfaccia di rete utilizzata con il comando ip addr e sostituirla a eth0.

Listen port: la porta in cui risulta in ascolto il server. Per comodità utilizziamo la porta 51820 UDP, ossia quella di default di Wireguard, ma sentiti libero di specificare qualsiasi porta purché non già utilizzata. Ricorda altresì di effettuare il port forwarding sul tuo router per la porta che avrai scelto.

PrivateKey: é la chiave privata del server. Ovviamente ci devi inserire quella che hai precedentemente creato. Non c’é bisogno di specificare anche la chiave pubblica del server.

La sezione “Peer” riguarda, in questo caso i client da collegare al server:

PublicKey: é la chiave pubblica del client. Ovviamente ci devi inserire quella che hai precedentemente creato.

AllowedIPs: é l’indirizzo IP del client all’interno della rete VPN

Si ricorda che le sezioni “Peer” saranno tante quante saranno i client.

 

A questo punto, dovremo inoltrare tutto il traffico generato all’interno del tunnel e per effettuare ciò dovremo digitare quanto segue:

sudo nano /etc/sysctl.conf

decommentiamo la riga net.ipv4.ip_forward=1

applichiamo la regola con sysctl -p

e procediamo all’installazione di iptables con apt install iptables

Riavviamo il server con sudo reboot 

 

Adesso possiamo avviare il nostro server Wireguard e il suo tunnel in due modi:

– manualmente ad ogni riavvio con il comando wg-quick up wg0

(wg-quick down wg0 é il comando opposto per chiudere il tunnel)

– automaticamente con il comando sudo systemctl enable wg-quick@wg0

Verifichiamo che la connessione sia attiva sul server con ip addr che ci dovrebbe restituire tra le interfacce anche wg0

e sinceriamoci anche che il servizio sia attivo con il comando sudo systemctl status wg-quick@wg0

Infine verifichiamo che il server sia attivo con sudo wg

 

INSTALLAZIONE DI WIREGUARD SUL CLIENT

Per prima cosa, anche qui – dopo aver applicato gli ultimi aggiornamenti – installiamo Wireguard e resolvconf:

sudo apt install wireguard

sudo apt install resolvconf

Successivamente – se non abbiamo già provveduto – creiamo una coppia di chiavi (pubblica e privata) per il client:

sudo -s

cd /etc/wireguard

wg genkey | tee client1privkey | wg pubkey > client1pubkey

Procediamo in ogni caso alla creazione del file di configurazione con:

nano wg0.conf

e copiamo all’interno il seguente testo di configurazione (ricordiamo comunque che anche qui la chiave privata del client ed il file wg0.conf debbono essere protetti in modo analogo a quanto già anteposto precedentemente)

 

[Interface]

Address = 10.0.0.2/24

PrivateKey = CC5frNN1mRKpwAe5dYKiHHIopfuu567UZ+T/1k5gEiek/TJKM5EUmg=

DNS = 8.8.8.8

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;

PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;

[Peer]

PublicKey = 5W7MDLEghjgkjmRLwgdw2Ipjijoew72839ZjZPdbfEHAdUwqdoqG9yWjOIjo=

Endpoint = ddnsserver.it:51820

AllowedIPs = 0.0.0.0/0

PersistentKeepAlive=30

 

In questo caso, siamo nell’ipotesi speculare a quella precedente in cui la sezione “Interface” riguarda il client, mentre quella “Peer” il server.

Address: é l’indirizzo attribuito al client all’interno della VPN

PrivateKey: é la chiave privata del client. Ovviamente ci devi inserire quella che hai precedentemente creato.

DNS: é il DNS che il client chiede al server di utilizzare all’interno del tunnel VPN

PostUp e PostDown: regole di Iptables rivolte rispettivamente a gestire l’apertura e la chiusura del tunnel VPN.

Anche qui rammento che ho utilizzato l’interfaccia eth0 perché si tratta dell’interfaccia fisica con cui il mio client è collegato al router, tu dovrai scoprire la tua interfaccia di rete utilizzata con il comando ip addr e sostituirla a eth0.

PublicKey: é la chiave pubblica del server. Ovviamente ci devi inserire quella che hai precedentemente creato.

Endpoint: é l’indirizzo IP pubblico attribuito al tuo server oppure il suo FQDN ad esso attribuito dal provider DNS (o DDNS) seguito dalla porta di ascolto del medesimo precedentemente predisposta in ascolto

AllowedIPs: Usiamo 0.0.0.0/0 perché instradiamo il traffico e vogliamo che il peer del server invii pacchetti con qualsiasi IP di origine.

PersistentKeepAlive: consente di stabilire ogni quanti secondi deve essere inviato un pacchetto per tenere attiva la connessione

A questo punto, se il nostro server é già attivo, siamo pronti ad avviare il nostro tunnel client-side sempre con il comando:

wg-quick up wg0

(wg-quick down wg0 é il comando opposto per chiudere il tunnel)

 

CONFIGURAZIONE DEL FIREWALL

 Se decidi di dedicare il tuo Raspberry a fungere da server dovrai installare il firewall con le seguenti regole:

sudo apt install ufw

ufw allow ssh

ufw allow 51820/udp

sudo ufw enable

sudo ufw status

 

INSTALLAZIONE DI UN’INTERFACCIA GRAFICA LATO CLIENT

Lo so, lo so, dopo questo tutorial non hai voglia di buttarti ulteriori paranoie e quindi vuoi evitare di incappare ancora nel terminale.

Se, come me, stai usando Linux Mint MATE – al momento in cui sto scrivendo questo testo – non troverai Wireguard all’interno della GUI del Network Manager per fare tutto da interfaccia grafica. Quindi ho scovato per te un interessante programma su GitHub che propone un’estensione del Network Manager in ambiente GNOME.

sudo apt install git

sudo apt install build-essential libgtk-3-dev libnma-dev libsecret-1-dev

git clone https://github.com/max-moser/network-manager-wireguard

cd network-manager-wireguard

./autogen.sh –without-libnm-glib

./configure –prefix=/usr \

              –without-libnm-glib \

              –sysconfdir=/etc \

              –libdir=/usr/lib/x86_64-linux-gnu \

              –libexecdir=/usr/lib/NetworkManager \

              –localstatedir=/var

make

sudo make install

sudo reboot

 Adesso ti basterà accedere al Network Manager del tuo pc client, cercare Wireguard ed inserire i parametri corrispondenti a quelli che hai già inserito manualmente nel file di configurazione del client.

Come vedi non é stato troppo difficile, vero? Ti ricordo che Wireguard offre le proprie app anche in ambiente Android e iOS, nonché Windows e Mac. Qui abbiamo trattato solo di Gnu/Linux ma i principi e le regole che hai appreso sono replicabili in modo identico su qualsiasi altro sistema operativo, mobile o desktop.

Buona privacy!