Configurare la propria VPN su Raspberry tramite OpenVPN su Raspbian

6 minuti di lettura
● Resta sempre aggiornato grazie al nostro canale Telegram e alla nostra newsletter settimanale!
Scopi della guida:
  • Definire un servizio di VPN (Virtual Private Network) sfruttando Raspberry (con sistema operativo Raspbian) al fine di potersi collegare remotamente sulla propria rete locale domestica
  • Livello di difficoltà: medio
Concetti affrontati:
  • Configurazione software
Componenti software utilizzate:
Prerequisiti:
COMPONENTI FISICI UTILIZZATI:
PROGETTO MAGGIORMENTE INDICATO PER:

Raspbian Logo

Tutti gli ambienti

Note e disclaimer
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata ed realizzata SOLO da personale qualificato;
  • qualsiasi modifica attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno puro scopo didattico);
  • qualsiasi modifica attuata in proprio a un dispositivo ne fa decadere garanzia, omologazioni e certificazioni di qualità.
Revisione guida: 1.3

Abstract

La possibilità di collegarsi alla rete domestica “come si fosse fisicamente a casa” – ovvero ottenendo un indirizzo IP privato assegnato tipicamente dal DHCP presente sulla rete stessa – è qualcosa di utile e realizzabile facilmente e in buona sicurezza.

Alcuni modem/router evoluti, come per esempio i noti Fritz!, sono dotati (oltre delle comuni funzioni) anche di un server VPN (Virtual Private Network) il quale consente di definire un “tunnel sicuro” dentro il quale far transitare, criptato, il traffico da e per la rete locale domestica: un meccanismo per l’appunto cosiddetto di tunnelling.

Qualora non si disponga di questa funzionalità – ma piuttosto di un Raspberry Pi (magari per diversi usi, trai quali magari quello di ospitare un HUB personale software per domotica) dotato di sistema operativo Raspbian, è possibile installare una componente software che fornisca tale servizio (in caso si utilizzi un Raspberry Pi con a bordo HASSIO, la guida corretta è questa).

Attenzione però: questo tipo di configurazione (server) non è da confondersi con quella di un client VPN: negli ultimi anni c’è stato un proliferare di servizi VPN a pagamento, i quali consentono da dentro la propria rete domestica (o comunque un qualsiasi host connesso a Internet) di navigare in modo anonimo attraverso tale servizio. In sostanza ci si collega (sempre con la filosofia del tunnelling) alla rete del provider VPN e da lì si naviga anonimizzati verso Internet (per questioni di estrema privacy o altro).

Quello che faremo invece con questa guida è de facto promuovere il Raspberry Pi a una sorta di “provider VPN” al quale però ci collegheremo noi e soltanto noi (gratis, ovviamente), in modo da trovarci virtualmente sulla nostra rete locale domestica come se fossimo a casa.

Ma perché dovrei collegarmi con la rete di casa tramite VPN?

OpenVPN LogoInnanzitutto perché questo ci consente di non esporre troppi servizi/porte all’esterno utilizzando il port forwarding: mi serve infatti una sola porta esposta, quella del servizio VPN, dopodiché una volta connesso ho a disposizione tutti i servizi della mia rete (perché, per l’appunto, è come se fossi a casa).

In secondo luogo, tutte le trasmissioni sono crittografate, cosa che aumenta il grado di sicurezza laddove i servizi precedentemente esposti non prevedano tale grado di sicurezza (si pensi a certe IP Cam, per esempio, il quale traffico è tutto “in chiaro”).

In terzo luogo (ma si potrebbe andare avanti), è possibile contattare host presenti sulla rete locale che per motivi di sicurezza non siano stati esposti esternamente (si pensi per esempio a dei componenti domotici come del Sonoff con firmware modificato o a uno Shelly in modalità LAN, o altri).

Allo scopo utilizzeremo il collaudato server VPN OpenVPN, installandolo e configurandolo tramite il tool PiVPN.

Ma… cambia qualcosa rispetto alla connessione remota verso eventuali servizi presenti sulla mia rete ed esposti verso l’esterno? No: WireGuard viene “esposto” alla rete pubblica su una specifica porta; le precedenti implementazioni – quali siano – rimangono inalterate.

N.b. In caso si utilizzi un Raspberry Pi con sistema a bordo la distribuzione HASSIO, la guida corretta da leggere non è la presente ma questa.

Si parte

Installazione OpenVPN

In primis è necessario installare OpenVPN sul sistema operativo del Raspberry Pi, Raspbian.
Per farlo è necessario eseguire un comando via terminale (da CLI, via SSH oppure con control-alt-t da interfaccia desktop):

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

Tale comando scarica ed esegue l’ultima versione del tool PiVPN, strumento che utilizzeremo per installare e configurare OpenVPN.
Dopo aver eseguito il comando apparirà la seguente schermata:

PiVPN - Configurazione - 1

Premere invio per iniziare la configurazione.
PiVPN domanderà innanzitutto se l’indirizzo IP del Raspberry sia prefissato via DHCP (come da pre-requisiti) oppure si debba indicare un IP forzoso. Scegliere attribuzione automatica di IP fisso via DHCP e procedere oltre.

PiVPN - Configurazione - 2

Ora PiVPN chiederà con quale utente installare il servizio, Scegliere “pi” e procedere oltre:

PiVPN - Configurazione - 3

Nella fase che segue si sceglie quale standard installare, se OpenVPN o WireGuard. Questa guida persegue l’installazione di OpenVPN, lo standard più diffuso e supportato:

PiVPN - Configurazione - 4

Ora verrà chiesto il tipo di protocollo da utilizzare. Di default solitamente viene utilizzato il protocollo UDP; un rari casi però tale traffico potrebbe essere inibito (lato client o lato server) e a quel punto potrebbe essere necessario utilizzare il protocollo TCP.

Di default, scegliere UDP.

PiVPN - Configurazione - 5

A questo punto sceglieremo la porta. Quella tipicamente utilizzata da OpenVPN è la 1194, ma nulla ci vieta la possibilità di utilizzare un’altra porta personalizzata. Noi vi consigliamo di lasciare la 1194, porta che poi provvederemo in un secondo momento a girare dall’esterno della nostra rete all’interno, verso il Raspberry (approfondito a seguire).

PiVPN - Configurazione - 6

 

Giunti a questo punto potremo selezionare il server DNS da utilizzare per la risoluzione dei nomi Internet una volta connessi al nostro server VPN. Ci viene messa a disposizione un’ampia scelta, ma ciò non toglie che successivamente potremo andare a modificarli a mano nel file di configurazione del server. Noi vi consigliamo di selezionare quelli più veloci e con meno restrizioni, ovvero Cloudflare o OpenDNS.

PiVPN - Configurazione - 8

Non aggiungiamo alcun “custom search domain” selezionando “NO“:

PiVPN - Configurazione - 9

A questo punto ci verrà chiesto in che modo raggiungere il server VPN, se sfruttando direttamente l’IP pubblico assegnato al modem dal nostro gestore (solitamente non conviene selezionare questo perché il nostro provider ci assegnerà un IP dinamico) oppure sfruttare il nostro FQDN con risoluzione dinamica dell’IP*.

* La configurazione proposta da questa guida ipotizza che l’utente stia usando DuckDNS aggiornato direttamente da Raspberry. Non è un must: è possibile utilizzare un qualsiasi servizio DDNS e quindi un qualsiasi nome FQDN – basta che la risoluzione di tale nome sia sempre aggiornata con l’IP assegnato al modem di casa dall’operatore telefonico.

PiVPN - Configurazione - 10

Indicare dunque il proprio FQDN (eg. “miodominio.duckdns.org“):

PiVPN - Configurazione - 11

Alla scelta se utilizzare le “Elliptic Curves” selezionare “YES“:

PiVPN - Configurazione - 13

Verrà ora chiesto il livello di encryption (il numero di bit per la il certificato da utilizzare). 512 è il livello massimo, 256 il minimo, noi consigliamo 384:

PiVPN - Configurazione - 14

Ora PiVPN spiegherà perché sia utile attivare l’autoverifica degli aggiornamenti:

PiVPN - Configurazione - 16

Dopodiché attivarli selezionando “YES“:

PiVPN - Configurazione - 17

Al termine effettuare il reboot del Raspberry selezionando “YES“:

PiVPN - Configurazione - 19

Il Raspberry Pi verrà riavviato e l’installazione sarà stata completata.

Creazione dell’utenza d’accesso

Dopo l’avvenuto riavvio provvedere a ricollegarsi a terminale, così da avere l’opportunità di creare la propria utenza d’accesso VPN.
Per farlo, eseguire il seguente comando:

pivpn add

Il sistema chiederà il nome dell’utente da creare (“Enter a Name for the Client“), la durata del certificato (“How many days should the certificate last?“, lasciare 1080), dopodiché la password scelta (due volte).

L’output dopo questo ultimo passo sarà pressappoco il seguente:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019
Generating an EC private key
writing new private key to '/etc/openvpn/easy-rsa/pki/private/user1.key.BgIhj5Dzz1'
Enter PEM pass phrase:xxxxxx

Verifying - Enter PEM pass phrase:xxxxxx

-----
Using configuration from /etc/openvpn/easy-rsa/pki/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'xxxxx'
Certificate is to be certified until Jan 24 21:43:31 2023 GMT (1080 days)

Write out database with 1 new entries
Data Base Updated
Client's cert found: xxxxx.crt
Client's Private Key found: xxxxx.key
CA public Key found: ca.crt
tls Private Key found: ta.key

========================================================
Done! user1.ovpn successfully created! 
user1.ovpn was copied to:
  /ovpns
for easy transfer. Please use this profile only on one
device and create additional profiles for other devices.
========================================================

Port forwarding

Sebbene il nostro server VPN sia essenzialmente pronto, manca ancora un passo fondamentale per poterlo contattare dall’esterno: il port forwarding: è infatti necessario indicare al modem che, a fronte di una chiamata dall’esterno sulla porta 1194 UDP (o TCP, se prima si è scelto questo protocollo) tale traffico sia “girato” verso l’IP (fisso, of course) del Raspberry sulla sua porta 1194 UDP (o TCP).

Per far questo bisogna agire sul proprio modem; in ogni modem ovviamente questa procedura, spiegata qui, è variabile.

Uso

Terminata la configurazione del port forwarding abbiamo tutti gli elementi che ci servono:

  • un FQDN che, quando risolto, ritorna l’IP WAN del modem;
  • un port forwarding che gira le chiamate dall’esterno all’interno;
  • un server VPN;
  • credenziali per accedervi.

A questo punto non serve che un client OpenVPN per collegare il nostro computer/smartphone/tablet alla nostra rete tramite il tunnelling VPN.

I client che consigliamo sono:

Per collegarsi utilizzando uno dei client elencati (o uno comunque compatibile con OpenVPN) è necessario utilizzare il certificato emesso in fase di creazione dell’utenza, il quale si trova presso il percorso /home/pi/ovpns (con nome NOMEUTENTE.opvn). Basterà scaricarlo dal Raspberry e importarlo sul client: all’atto della richiesta di connessione sarà poi necessario inserire la password dell’utente precedentemente creato e voilà, ci troveremo collegati alla nostra rete locale.