In questa guida andremo a scoprire WireGuard, software per realizzare una VPN alternativo a OpenVPN che comporta tutta una serie di vantaggi in termini di prestazioni e velocità (secondo vari test, WireGuard è migliore rispetto a OpenVPN, poiché utilizza meno dati ed ha un impatto minore sulle risorse hardware, tuttavia richiede un client specifico da installare, un’app apposita che è  comunque disponibile su Google Play, Apple Store, PC con Windows, GNU/Linux e Mac OS. Per un elenco dei download per i vari sistemi operativi, clicca qui.)

Nel nostro caso, ho installato e usato per anni con successo WireGuard su un Raspberry PI 1 B, ma anche sul Raspberry PI 2 B, un po’ vecchiotti, ma comunque sufficienti a far funzionare il server VPN. Daremo per scontato che abbiate già installato un sistema operativo tipo Raspberry PI OS (ex Raspbian) / Debian / Ubuntu. Potete seguire questa guida anche se NON avete un Raspberry PI, va bene un qualsiasi computer che utilizziate come server.

Premessa

Questa guida dà per scontato che abbiate una connessione a internet via Fibra / VDSL / ADSL o che comunque abbiate la possibilità di aprire porte sul vostro indirizzo IP pubblico, poiché se ciò non fosse possibile, sarebbe totalmente inutile. Servirà anche di sapere come aprire una porta sul vostro modem/router esponendo il server VPN (altrimenti diventa inutile, visto che da fuori casa non potrete collegarvi).

In questa guida sono presenti link ad altri tutorial, man mano che risulta necessario, tuttavia prima di procedere, se già avete un’infarinatura di base non sarebbe affatto male 🙂

Importante: la vostra velocità di connessione, una volta connessi alla VPN, sarà limitata alla massima velocità disponibile in upload sulla vostra linea di casa. Quindi per il client, la velocità di download massima sarà equiparabile alla massima velocità di upload della vostra connessione sulla quale attiverete la VPN in ascolto. Quindi è importante disporre di una connessione decente (almeno 10 mbps in upload) per non avere problemi di navigazione.

Inoltre, vi consigliamo di installare Pi-hole, il server DNS di cui vi abbiamo spiegato in questa guida, poiché in accoppiata con PiVPN è il massimo, per avere una VPN che filtra e ti protegge dalla pubblicità e altre cose indesiderate, bloccandole preventivamente.

In ultimo, a meno che non abbiate un indirizzo IP Pubblico Statico, vi servirà sicuramente un Dynamic DNS (DDNS) e uno dei più noti provider è No-IP che trovate qui.

Installazione

Come primo step e per semplicità, installeremo WireGuard tramite uno script che ci semplificherà molto la vita, denominato PiVPN. Questo script è in grado di installare sia OpenVPN che WireGuard, noi copriremo la parte di WireGuard, poiché su hardware limitati funzionerà molto meglio. Diamo un’occhiata, prima di eseguire il comando da terminale, al codice sorgente dello script (che è sempre cosa buona, visto che non è saggio eseguire comandi nel terminale senza sapere che cosa facciano) ed eseguiamo quindi il comando:

curl -L https://install.pivpn.io | bash

Verranno scaricati e installati tutti i pacchetti di base necessari a proseguire l’installazione, esempio:

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 162 100 162 0 0 322 0 --:--:-- --:--:-- --:--:-- 322
100 110k 100 110k 0 0 99k 0 0:00:01 0:00:01 --:--:-- 292k
:::
::: sudo will be used for the install.
::: Hostname length OK
::: Verifying free disk space...
:::
::: Package Cache update is needed, running apt-get update -y ...
done!
:::
::: Checking apt-get for upgraded packages.... done!
:::
::: There are 9 updates available for your system!
::: We recommend you update your OS after installing PiVPN! 
:::
::: Checking for git... already installed!
::: Checking for tar... already installed!
::: Checking for curl... already installed!
::: Checking for grep... already installed!
::: Checking for dnsutils... already installed!
::: Checking for grepcidr... not installed!
::: Checking for whiptail... already installed!
::: Checking for net-tools... already installed!
::: Checking for bsdmainutils... not installed!
::: Checking for bash-completion... already installed!
::: Checking for dhcpcd5... already installed!
::: Checking for iptables-persistent... not installed!

Ma tranquilli, l’installazione sarà un po’ più grafica e semplificata, infatti, dopo aver recuperato e installato i prerequisiti in automatico, ci comparirà la seguente schermata di benvenuto:

PIVPN - Benvenuti

Premiamo INVIO e proseguiamo, trovando un nuovo messaggio informativo che ci avvisa della necessità di impostare un indirizzo IP statico sul nostro nuovo server VPN / Raspberry PI. Abbiamo 2 modi per farlo: o agiamo tramite la configurazione di rete del Raspberry PI e impostiamo l’attuale indirizzo IP come statico, oppure entriamo sulla configurazione del modem/router e impostiamo da lì l’assegnazione di un indirizzo IP statico al nostro nuovo server.

PiVPN - IP Statico

Diamo nuovamente INVIO e ci ritroveremo davanti a una scelta, relativa al networking IPv6. Sostanzialmente lo script ci consiglia di incanalare anche tutto il traffico IPv6 nel server VPN che stiamo configurando, così da prevenire eventuali leak di dati.

Essendo una cosa consigliata, risponderemo Sì schiacciando INVIO:

PiVPN - IPv6 Leak

A questo punto PiVPN ci chiederà su quale interfaccia di rete configureremo il server VPN WireGuard.  Se avete la possibilità, è consigliabile scegliere sempre la connessione via cavo LAN, così da evitare problemi con il Wi-Fi. Quindi scegliamo la prima opzione, nel nostro caso (N.B: per riconoscere quale interfaccia di rete è via cavo e quale è via wireless basta guardare con quali lettere comincia.

Ad esempio quella via cavo può iniziare per: eth o en, mentre quella wireless può iniziare per: wl). Basta usare le frecce della tastiera e il tasto barra spaziatrice per selezionare un’interfaccia (compare un asterisco (*) su quella scelta, quindi evidenziare Ok e premere INVIO):

PiVPN - Scelta interfaccia di rete

Fatto ciò, ci verrà chiesto come intendiamo procedere: se utilizziamo la Prenotazione DHCP [DHCP Reservation] che è sostanzialmente l’assegnazione di un IP Statico lato Modem/Router e quindi preventivamente, abbiamo configurato il nostro router, oppure no. Nel dubbio, PiVPN, se non sapete cosa sia e non sapete come fare, vi propone di rispondere No, che è la scelta predefinita:

PiVPN - DHCP Reservation

Fate la scelta più consona alla vostra situazione, se non sapete cosa scegliere andate con l’opzione predefinita (No), quindi premete INVIO.

A questo punto verremo informati della necessità di utilizzare un utente locale sul Sistema Operativo con il quale salvare i profili di configurazione per la VPN. NON SCHIACCIARE SUBITO INVIO:

PiVPN - Utente locale

Prima di dare INVIO, nel caso in cui non lo avessimo già fatto, ci converrebbe creare un utente apposito, anche per questioni di sicurezza. È in questo momento che converrebbe aprire una nuova sessione SSH al vostro sistema o un nuovo terminale se utilizzate l’ambiente desktop e state installando tutto in locale e aggiungere un utente specifico per PiVPN, tramite il comando:

sudo adduser pivpn

E digitiamo la password per questo utente, rispondendo poi come segue:

Aggiunta dell'utente «pivpn» ...
Aggiunta del nuovo gruppo «pivpn» (1001) ...
Aggiunta del nuovo utente «pivpn» (1001) con gruppo «pivpn» ...
Creazione della directory home «/home/pivpn» ...
Copia dei file da «/etc/skel» ...
Nuova password: 
Reimmettere la nuova password: 
passwd: password aggiornata correttamente
Modifica delle informazioni relative all'utente pivpn
Inserire il nuovo valore o premere INVIO per quello predefinito
Nome completo []: 
Stanza n° []: 
Numero telefonico di lavoro []: 
Numero telefonico di casa []: 
Altro []: 
Le informazioni sono corrette? [S/n] s

Fatto ciò premiamo INVIO sulla schermata di PiVPN, dove ci proporrà un elenco di utenti disponibili e andremo a selezionare quello appena creato (pivpn se avete eseguito precisamente questo tutorial). Se vi siete dimenticati di creare un utente apposito, potete proseguire con l’utente attualmente attivo sul sistema, oppure scegliere l’opzione Cancel (terminerà l’installazione e dovrete ripetere il tutorial da capo, ma sarà un po’ più veloce):

PiVPN - Scelta utente

Selezioniamo quindi l’utente creato usando le frecce + barra spaziatrice, evidenziamo Ok e diamo INVIO. Visualizzeremo temporaneamente qualche operazione sul terminale, dove comparirà la scritta che abbiamo scelto un utente per la VPN e altre cose, dopodiché ci verrà mostrata nel giro di qualche secondo, la seguente schermata:

PiVPN - Installazione

Ed eccoci finalmente nella fase principale dell’installazione. PiVPN ci chiede quale VPN installare, informandoci che WireGuard è di nuova generazione e porta tutta una serie di benefici, mentre OpenVPN è più standard e funziona in maniera tradizionale. Scegliamo quindi WireGuard, anche per benefici sulla durata della batteria, evidenziamo Ok e diamo INVIO.

Lo script eseguirà una serie di comandi da terminale e si occuperà di installare tutto il necessario in base alla nostra scelta, dopodiché ci accoglierà con una schermata sulla quale ci permetterà di scegliere una porta per WireGuard:

PiVPN - Porta

A noi va benissimo la porta di default di WireGuard (51820 su UDP), ricordiamocela e apriamola subito sul nostro Modem/Router, ci sarà sicuramente una sezione Firewall / Port Forwarding dalla quale avremo la possibilità di aprire una o più porte per il nostro Raspberry PI / server VPN. Se non sapete come fare, vi consiglio questa guida

Proseguiamo quindi dando INVIO. Ci verrà chiesto se le informazioni sono corrette. Diamo nuovamente INVIO rispondendo Yes:

PiVPN - Porta corretta

Se avete seguito in precedenza la nostra guida su Pi-hole e lo avete quindi installato, PiVPN se ne accorgerà e vi proporrà di utilizzarlo come server DNS per la VPN, così da filtrare tutto il traffico e bloccare banner pubblicitari eccetera:

PiVPN + Pi-hole

Rispondiamo Yes premendo INVIO, così facendo ci verrà chiesto se vogliamo utilizzare l’indirizzo IP pubblico rilevato da PiVPN o se vogliamo usare un dominio. Essendo che tipicamente le connessioni domestiche sono soggette a cambio di indirizzo IP pubblico, non possiamo procedere con la prima opzione, ma dovremo procurarci un DDNS (Dynamic DNS) da un provider, come No-IP.

Quindi se già non l’abbiamo fatto, procuriamoci un DDNS, alcuni Modem/Router supportano un elenco di provider che ci semplifica tantissimo le cose, poiché configurandolo lì sarà cura del Modem/Router aggiornare il record DDNS con il nostro attuale indirizzo IP pubblico, altrimenti servirà di installare un’applicazione o direttamente sul Raspberry PI o su un PC per far sì che venga aggiornato in automatico il DDNS.

Andiamo avanti e digitiamo il nostro DDNS:

PiVPN - Dominio

Quindi evidenziamo Ok e diamo INVIO. Ci verrà chiesta conferma, verifichiamo nuovamente e diamo INVIO:

PiVPN - Conferma dominio

A questo punto si visualizzerà un messaggio che ci informerà che siamo nella fase di generazione delle chiavi crittografiche per il server VPN. Diamo nuovamente INVIO:

PiVPN - Chiavi crittografiche server

Si visualizzerà temporaneamente il terminale e dopodiché un nuovo messaggio informativo ci dirà che, dal momento che esporremo il server VPN su Internet, è bene abilitare gli ‘unattended upgrades’, ovvero una serie di aggiornamenti di sicurezza automatici ricercati e installati ogni giorno e che non riavvierà automaticamente il dispositivo (quindi periodicamente, dovremo farlo noi, per applicare gli aggiornamenti, ad esempio quelli del kernel). Diamo nuovamente INVIO:

PiVPN - Unattended upgrades

Ci verrà chiesto se vogliamo attivare gli aggiornamenti automatici. Essendo caldamente consigliato, scegliamo di sì e quindi optiamo per Yes:

PiVPN - Abilitazione aggiornamenti

PiVPN si occuperà di configurare anche qui tutto il necessario per abilitarli. E questa era la fase finale dell’installazione, se tutto sarà andato a buon fine visualizzeremo il seguente messaggio:

PiVPN - Installazione completata

Sostanzialmente da questo momento potremo utilizzare i comandi pivpn add e pivpn help per aggiungere un profilo VPN o per visualizzare l’elenco completo dei comandi disponibili per PiVPN.

Premiamo nuovamente INVIO e ci verrà chiesto se vogliamo riavviare il sistema. Dal momento che è consigliato, scegliamo Yes:

PiVPN - reboot

E visualizzeremo che verrà effettuato il riavvio:

PiVPN - Riavvio

Diamo INVIO e il sistema si riavvierà.

Come far funzionare la navigazione su Internet

Con l’attuale installazione completata, PiVPN vi permetterà di raggiungere SOLAMENTE il Raspberry PI su cui lo avete installato, NON vi permetterà di uscire su Internet con l’IP pubblico che vi fornisce il vostro ISP, motivo per cui è necessario abilitare l’inoltro dei pacchetti IPv4 e IPv6 a livello del kernel GNU/Linux (Packet Forwarding).

Per fare ciò è un’operazione molto semplice, si tratta infatti di modificare il file /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Quindi individuate le seguenti righe:

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
# Enabling this option disables Stateless Address Autoconfiguration
# based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1

E rimuovete il commento (il cancelletto #) da net.ipv4.ip_forward=1 e net.ipv6.conf.all.forwarding=1:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
# Enabling this option disables Stateless Address Autoconfiguration
# based on Router Advertisements for this host
net.ipv6.conf.all.forwarding=1

Quindi uscite dall’editor e impartite il comando:

sudo sysctl -p

Per ricaricare le impostazioni variate e applicarle. Adesso, se eravate già connessi in VPN, sarete in grado di uscire su Internet con l’IP Pubblico del Raspberry PI!

Creazione profilo VPN e QR Code

Attendiamo quindi che tutto torni operativo e dopodiché procediamo con il comando per creare un profilo VPN da utilizzare ad esempio sul nostro PC portatile / laptop o su tablet / smartphone. Consigliamo quindi di scaricarvi preventivamente l’applicazione WireGuard e installarla come anticipato a inizio guida. Digitiamo quindi, aprendo una sessione SSH:

pivpn add

Ci verrà chiesto il nome da assegnare al client, digitiamo un nome e verrà generato automaticamente tutto il necessario:

Enter a Name for the Client: MioTablet
::: Client Keys generated
::: Client config generated
::: Updated server config
::: Updated hosts file for Pi-hole
::: WireGuard reloaded
======================================================================
::: Done! MioTablet.conf successfully created!
::: MioTablet.conf was copied to /home/pivpn/configs for easytransfer.
::: Please use this profile only on one device and create additional
::: profiles for other devices. You can also use pivpn -qr
::: to generate a QR Code you can scan with the mobile app.
======================================================================

Il vantaggio dell’utilizzo di PiVPN sta anche nel fatto della possibilità di generare un QR Code per installare il profilo VPN sull’app presente su tablet o smartphone.

Generiamo quindi il QR Code, con il comando:

pivpn -qr

Ci verrà chiesto per quale profilo generare il codice QR. Possiamo sia digitare il nome del profilo, sia digitare il numero nell’elenco. Digitiamo quindi 1, essendo l’unico profilo creato finora e diamo INVIO:

PiVPN - QR Code

Inquadrando il codice QR tramite l’app avrete la possibilità di installare il profilo istantaneamente, in maniera semplice e veloce.

Vi basterà quindi attivare la connessione al vostro profilo sull’app WireGuard ogni volta che vorrete collegarvi alla vostra VPN.