WIREGUARD: VPN SEMPLICE, SICURA E VINCENTE!

WIREGUARD: VPN SEMPLICE, SICURA E VINCENTE!

Giugno 13, 2021 0 Di Kubrick

Salve a tutti i lettori, ecco un nuovo articolo dedicato alle Virtual Private Network. Come dici? Ancora un articolo su questo argomento? Scusami ma non è colpa mia se 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 programma) Wireguard.

Oltre ad essere sensibilmente più veloce e snella, l’architettura di rete basata su Wireguard risulta altrettanto sicura di quella basata sul tradizionale protocollo OpenVPN ma anche più semplice da implementare da zero.

 

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 originale RaspberryPi OS.

A fine di non rendere eccessivamente prolissa la trattazione, darò per scontato che tu già sappia installare quest’ultimo e collegarti in SSH al microcomputer 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 a root per ragioni di sicurezza del sistema, 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 periodo) da occhi indiscreti con

cd /etc/wireguard

chmod 600 nomefile

Ti invito a notare che i nomi che ho adottato sono del tutto arbitrari, pertanto, puoi chiamare le chiavi pubbliche e private 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 del client puoi generarle anche sul client stesso: 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 (aka Road warrior) e non client-client.

Ogni file di configurazione risulta rivolto alla gestione dell’interfaccia di rete virtuale di Wireguard 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 con:

cd /etc/wireguard

touch 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 %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -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à ho utilizzato 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

appliamo la regola con sysctl -p

 

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

Quando abbiamo attivato la conne

 

INSTALLAZIONE DI WIREGUARD SUL CLIENT

Per prima cosa, anche qui installiamo Wireguard e resolvconf:

sudo apt install wireguard

sudo apt install resolvconf

Successivamente creiamo una coppia di chiavi (pubblica e privata) per il client se non lo abbiamo già fatto precedentemente in ambiente server con i comandi:

sudo -s

cd /etc/wireguard

wg genkey | tee client1privkey | wg pubkey > client1pubkey

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

touch wg0.conf

nano wg0.conf

e copiamo all’interno il seguente testo di configurazione:

 

[Interface]

Address = 10.0.0.2/24

PrivateKey = CC5frNN1mRKpwAe5dYKiHHIopfuu567UZ+T/1k5gEiek/TJKM5EUmg=

DNS = 8.8.8.8

PostUp = iptables -I OUTPUT ! -o %i -m mark ! –mark $(wg show %i fwmark) -m addrtype ! –dst-type LOCAL -j REJECT && ip6tables -I OUTPUT ! -o %i -m mark ! –mark $(wg show %i fwmark) -m addrtype ! –dst-type LOCAL -j REJECT

PreDown = iptables -D OUTPUT ! -o %i -m mark ! –mark $(wg show %i fwmark) -m addrtype ! –dst-type LOCAL -j REJECT && ip6tables -D OUTPUT ! -o %i -m mark ! –mark $(wg show %i fwmark) -m addrtype ! –dst-type LOCAL -j REJECT

 

[Peer]

PublicKey = 5W7MDLEghjgkjmRLwgdw2Ipjijoew72839ZjZPdbfEHAdUwqdoqG9yWjOIjo=

Endpoint = ddnsserver.it:51820

AllowedIPs = 0.0.0.0/0

 

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 PreDown: sono opzionali. Creano un sistema di killswitch, in modo tale che, se dovesse cadere la connessione VPN i dati non siano trasmessi in chiaro, evitando così un data-leak degli stessi.

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

Endpoint: é l’indirizzo attribuito al tuo server dal provider DDNS oppure direttamente l’IP del tuo server 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.

 

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

 

Lo so, lo so, dopo questo tutorial non hai voglia di buttarti paranoie una volta configurato il server di sistema 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!