Configurare il Raspberry Pi come VPN: tutorial con OpenVPN

La sicurezza delle reti pubbliche per accedere ad Internet lascia spesso a desiderare. Una soluzione per sentirsi sicuri navigando in rete, anche quando si è in giro, è quella di impostare una propria VPN (acronimo di “Virtual Private Network”, letteralmente rete privata virtuale). Chi realizza autonomamente una VPN ha inoltre accesso alla propria rete locale da qualsiasi connessione Internet.

Per la configurazione della propria rete virtuale privata serve un computer che svolga la funzione di server per permettere di creare questa rete. In questo caso il Raspberry Pi rappresenta un’opzione economica. Potete impostare una VPN sul Raspberry Pi con il software libero OpenVPN, che è disponibile da scaricare gratuitamente.

Impostare una propria VPN: un quadro generale delle funzioni

Si configura una VPN in una rete locale (LAN), anche per poter accedervi dall’esterno. Rappresenta una rete di comunicazione virtuale in cui vengono trasmesse soprattutto tramite Internet le richieste e le risposte scambiate tra server VPN e client VPN (i dispositivi connessi al server).

Con una VPN impostata manualmente è addirittura possibile accedere alla propria rete locale da un qualsiasi accesso Internet. Così potete accedere ai dati che si trovano nella LAN e interrogare i singoli dispositivi da remoto (ad esempio una stampante o un fax), oltre che utilizzare la connessione Internet della vostra rete locale. Grazie ad una connessione crittografata al vostro server VPN potete inoltre muovervi in modo più sicuro in rete, rispetto a quanto accadrebbe se vi collegaste ad Internet da reti pubbliche, più pericolose (com’è il caso delle reti Wi-Fi aperte a cui tutti si possono connettere).

Per fare in modo che sia possibile una connessione sicura ad un server VPN, dovete tuttavia impostare nella vostra rete locale su un computer un server VPN, che è costantemente connesso ad Internet. Il computer svolge quindi la funzione di host per la rete virtuale privata. Collegate i dispositivi (come notebook, smartphone o tablet) con il server grazie ad un software per il client. L’accesso al vostro server VPN con un client connesso ad Internet, che si trova al di fuori della propria rete LAN privata, si verifica attraverso una connessione crittografata tramite il cosiddetto tunnel VPN.

Questo tunnel VPN parte dal vostro client e termina nel vostro server VPN, quindi si estende lungo tutta la connessione Internet. Così il tunnel è molto più sicuro rispetto alla media delle connessioni Internet pubbliche e per gli hacker è perciò difficile intrufolarsi nel tunnel e carpire il suo traffico dati. Connettendosi ad una propria VPN, potete lavorare con dati sensibili anche nelle reti Wi-Fi pubbliche in modo molto sicuro (come nel caso dell’online banking).

Creare un server VPN con il Raspberry Pi e OpenVPN: i vantaggi

Creare un server VPN con Raspberry Pi è particolarmente consigliato per via dei suoi costi competitivi, infatti anche i prezzi di acquisto del mini computer e di tutto il necessario si mantengono bassi. Inoltre, anche il suo consumo energetico per mantenere sempre in funzione il server sul computer rimane relativamente modico. Quindi, in generale, il mini computer si contraddistingue per un buon rapporto qualità-prezzo (anche se nel frattempo esistono diverse alternative al Raspberry Pi).

Tra i vari software per creare una propria VPN, vi sono diversi motivi che spingono ad optare per OpenVPN: si tratta prima di tutto di un software gratuito e molto diffuso per i server VPN, che supporta una grande quantità di sistemi operativi (Windows, OS X, Android, iOS, Linux e altri). In più, il programma si contraddistingue per una configurazione relativamente semplice e una stabilità elevata.

Che cosa serve per la configurazione di un server VPN sul Raspberry Pi?

Per questo tutorial avrete bisogno dei seguenti componenti:

  • Un Raspberry Pi (si consiglia il modello 2 o superiore)
  • Una scheda Micro SD con installato il sistema operativo Raspbian Jessie
  • Una connessione Internet continua (meglio se tramite cavo di rete) e alimentazione elettrica (tramite cavo Micro USB) per il Raspberry Pi.

Inoltre dovete decidere se volete configurare il server VPN direttamente sul Raspberry Pi (collegando il monitor e relativi mouse e tastiera) o se preferite impostarlo tramite client SSH. La gestione remota del server tramite SSH è la variante consigliabile nella maggior parte dei casi, visto che così potete accedere da un altro computer al server VPN.

A questo scopo ci sono diversi software molto diffusi come PuTTY, WinSCP (per Windows) o OpenSSH (per i sistemi operativi Unix), tramite i quali potete far funzionare e amministrare il Raspberry Pi. Grazie al software SSH accedete al Raspberry Pi, inserendo il suo indirizzo IPv4 nel client (ovvero il computer con cui vorreste accedere al Raspberry Pi) e collegandoli tra di loro. Potete farvi mostrare l’indirizzo IP del vostro Raspberry Pi ad esempio dal menu del router sul browser, che raggiungete, di solito, all’indirizzo “192.168.0.1” (o “fritz.box“ nel caso in cui abbiate un router Fritz!Box) sul vostro browser.

Inserire gli indirizzi IP corretti

Per l’uso di un client SSH si consiglia di assegnare al Raspberry Pi un indirizzo IP privato statico nella rete locale, altrimenti dovete ricercare ogni volta che volete accedere al mini computer tramite SSH il suo nuovo indirizzo dinamico momentaneo e collegarvi il client. Ancora più importante è la connessione di un indirizzo privato già esistente con il Raspberry Pi per l’uso di OpenVPN: il server VPN deve essere permanentemente raggiungibile nella rete locale allo stesso indirizzo, di modo che si possa accedervi in maniera costante e quindi anche su Internet il server VPN deve essere raggiungibile sempre allo stesso indirizzo.

Di solito una connessione ad Internet dispone però solo di un indirizzo IP dinamico pubblico, che cambia massimo ogni 24 ore e impedisce quindi la raggiungibilità continua del server allo stesso indirizzo. Nel caso in cui la vostra connessione Internet non disponga di un indirizzo IP pubblico statico, potete impostare un DNS dinamico (DDNS).

Consultate l’articolo apposito, per saperne di più su come assegnare un indirizzo IP statico al Raspberry Pi e su quali possibilità ci sono per la configurazione del servizio DDNS. Se volete utilizzare il vostro Raspberry Pi come server e renderlo sempre disponibile, dovreste occuparvi regolarmente del suo aggiornamento e della sua sicurezza.

Installare un proprio server VPN sul Raspberry Pi con OpenVPN

Ora si può cominciare con la configurazione di OpenVPN. A questo scopo aprite il terminale (la riga di comando) del vostro Raspberry Pi.

Preparazione del Raspberry Pi

Prima di cimentarsi nell’installazione di OpenVPN, si consiglia di cercare e installare gli aggiornamenti per i pacchetti già presenti sul Raspberry Pi. Date quindi il seguente comando nella console:

sudo apt-get update

sudo apt-get upgrade

Nel caso in cui non abbiate ancora cambiato la password standard del vostro Raspberry Pi (nome utente: “Pi”; password: “Raspberry”), dovete correre immediatamente ai ripari, perché altrimenti chiunque può avere accesso al sistema, sia in locale sia tramite accesso SSH. Con il comando qui sotto iniziate la configurazione del mini computer, riuscendo così a impostare una password sicura.

sudo raspi-config

Installare OpenVPN e configurare il file easy-rsa

Prima di tutto installate con il comando seguente il software OpenVPN e OpenSSL, che serve per criptare la connessione ad Internet.

sudo apt-get install openvpn openssl

Dopo aver installato OpenVPN, copiate gli script già pronti presenti nella directory “easy-rsa” nella cartella di configurazione di OpenVPN. Qui create i diversi certificati e le chiavi. Il seguente comando funziona solo su Raspbian Jessie (nel sistema operativo precedente, Wheezy, gli script si trovano su “/usr/share/doc/openvpn/examples/easy-rsa/2.0”).

sudo cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa

Poi aprite nella console il file “/etc/openvpn/easy-rsa/vars”, dove eseguite il seguente comando:

sudo nano /etc/openvpn/easy-rsa/vars

Ora si deve modificare questo file con i giusti parametri. Modificate le impostazioni, sostituendo tutta la riga “export EASY_RSA="`pwd`"” con la seguente:

export EASY_RSA="/etc/openvpn/easy-rsa"

Nel file si deve modificare anche la lunghezza della chiave, impostando così il livello di sicurezza della crittografia. Un Raspberry Pi 3 dispone di una prestazione sufficiente per poter elaborare senza difficoltà una chiave di 2048 bit. Nel modello 2 questa crittografia porta già ad una diminuzione notevole della performance, così che in questo caso converrebbe utilizzare solo una crittografia a 1024 bit, a seconda se sia più importante per voi la velocità o la crittografia della connessione, mentre invece, una crittografia a 4096 bit è utile solo in pochissimi casi. Modificate la lunghezza della chiave inserendo il numero dei bit corrispondenti nella riga “export KEY_SIZE=2048”.

Ora tornate indietro nella cartella di configurazione “easy-rsa”, effettuate il login come utente root e integrate le impostazioni prese prima nelle variabili di ambiente, eseguendo lo script “vars” con il comando “source”. Infine rendete disponibile il file di configurazione derivato con un collegamento simbolico con il nome di “openssl.cnf”.

cd /etc/openvpn/easy-rsa
sudo su
source vars
ln -s openssl-1.0.0.cnf openssl.cnf

Creare certificati e chiavi per OpenVPN

Prima di tutto create le prime chiavi per OpenVPN, dopo aver resettato eventuali chiavi già esistenti.

./clean-all
./build-ca OpenVPN

Vi viene richiesto di inserire le due lettere del “Country Name” della vostra nazione (IT per Italia e CH per la Svizzera). Le richieste correlate non sono importanti e potete quindi confermare con il tasto invio.

Infine generate le chiavi per il server:

./build-key-server server

Inserite un’altra volta il codice a due cifre della nazione e lasciate i campi successivi vuoti. Infine confermate, premendo due volte su “Y”, se il certificato deve venire generato.

Dopo continuate con la configurazione di uno o più client VPN. Per fare ciò, create un certificato e una chiave per ogni dispositivo con il quale vorreste accedere al server VPN: in questo il procedimento è lo stesso di quello della configurazione del certificato e della chiave per il server (inserite l’indicazione della nazione e confermate per due volte). Potete assegnare ad ognuno dei dispositivi un nome specifico (nel comando qui sotto ne viene dato uno per ogni client, rispettivamente “notebook”, “smartphone” e “tablet”).

./build-key laptop
./build-key smartphone
./build-key tablet
…

Se volete inserire una password per i client, utilizzate al posto dei comandi qui sopra quelli seguenti:

./build-key-pass laptop
./build-key-pass smartphone
./build-key-pass tablet
…

Concludete la generazione dei certificati e della chiave con il comando per lo scambio di chiavi Diffie-Hellman:

./build-dh

A seconda dei casi potrebbe essere necessario un po’ di tempo. Non appena avete terminato il procedimento, fate il logout come utente root:

exit

Generare il file di configurazione per il server OpenVPN

Aprite il file di configurazione di OpenVPN

sudo nano /etc/openvpn/openvpn.conf

Riempite il file vuoto con i diversi comandi che vi illustriamo di seguito. Prima di tutto attivate il routing attraverso “dev tun” tramite un tunnel IP e scegliete il protocollo di rete UDP con “proto udp” (nel caso in cui vogliate utilizzare quello TCP, scegliete “proto tcp”). Nella riga seguente stabilite che il server OpenVPN è raggiungibile alla porta 1194, ma potete anche cambiarla.

dev tun
proto udp
port 1194

Successivamente create un certificato di root SSL/TLS (ca), un certificato digitale (cert) e una chiave digitale (key) tramite la cartella “easy-rsa”. Inoltre dovreste fare attenzione ad inserire la giusta crittografia di bit (1024, 2048, ecc.).

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem

Ora stabilite che il Raspberry Pi venga impostato come server VPN. Qui inserite l’indirizzo IP e la maschera di sottorete che devono essere assegnati alla VPN.

server 10.8.0.0 255.255.255.0

Con il comando “redirect-gateway def1 bypass-dhcp” inoltrate ora il traffico IP completo tramite il tunnel IP. Se mirate a misure di sicurezza elevate potete sperimentare con questa impostazione, ma nel caso in cui sorgano difficoltà o si navighi troppo lentamente si consiglia di toglierla. Dovreste, invece, utilizzare sempre le altre direttive elencate sotto per stabilire i server DNS pubblici con i quali il server VPN lavorerà. Nel comando successivo è elencato un server di 1&1 “217.237.150.188” e uno di Google “8.8.8.8”, ma potete anche inserire gli indirizzi IPv4 di altri server DNS. Tramite “log-append /var/log/openvpn” impostate poi che i log vengano scritti nel file “/var/log/openvpn”.

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 217.237.150.188"
push "dhcp-option DNS 8.8.8.8"
log-append /var/log/openvpn

Tramite “persist-key” non vengono letti di nuovo i file “key” e con “persist-tun” non vengono avviati di nuovo i driver TUN e TAP per l’accesso di rete. Riducete i permessi del demone di OpenVPN tramite “user nobody” e “group nogroup”. Con “status /var/log/openvpn-status.log” create un file per le informazioni di stato, che vi mostrano la connessione attuale. Inoltre si consiglia di concordare l’eseguibilità delle informazioni di log con il comando “verb”. Se scegliete “0”, non ricevete nessun output, a parte un messaggio di errore. Un valore compreso tra 1 e 4 si adatta a un uso normale, mentre i valori superiori sono utili a risolvere gli errori. Infine stabilite tramite il comando “client-to-client” che il client VPN non solo riconosca il server, ma anche gli altri client VPN e attivate con “comp-lzo” la compressione LZO (dovete autorizzarla anche nel file config del client).

persist-key
persist-tun
user nobody
group nogroup
status /var/log/openvpn-status.log
verb 3
client-to-client
comp-lzo

Con “CTRL + O” salvate le modifiche e con “CTRL + X” chiudete l’editor.

Impostare lo script per l’accesso ad Internet con un client

Per poter accedere tramite il vostro tunnel VPN alla connessione Internet della vostra rete locale, dovete impostare un inoltro. Prima di tutto create quindi il file “/etc/init.d/rpivpn:

Sudo nano /etc/init.d/rpivpn

Copiando i seguenti commenti nel file, create l’header per lo script di Linux, init:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rpivpn
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: VPN initialization script
### END INIT INFO

Dopo attivate “ip_forward”, scrivendo un “1” in questo file:

echo 'echo "1" > /proc/sys/net/ipv4/ip_forward' | sudo -s

Fatto ciò, impostate tramite il filtro del pacchetto “iptables” un inoltro per i pacchetti VPN.

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

Ora sono ancora obbligatori i comandi, che consentono ai vostri client VPN di accedere alla LAN e ad Internet. Li configurate con le righe seguenti:

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Salvate e chiudete il file nuovamente con “CTRL + O” e “CTRL + X”.

Affinché l’inoltro funzioni, dovete assegnare allo script ancora i permessi relativi e installarlo come script init.

sudo chmod +x /etc/init.d/rpivpn
sudo update-rc.d rpivpn defaults

Ora eseguite lo script e subito dopo riavviate il server OpenVPN.

sudo /etc/init.d/rpivpn
sudo /etc/init.d/openvpn restart

Terminare la configurazione dei client

Nell’ultimo passaggio unite insieme i certificati e la chiave di ogni client in un unico pacchetto. Per questo vi loggate di nuovo come utente root, aprite la cartella “/etc/openvpn/easy-rsa/keys/” e create il file di configurazione del client. Con i comandi seguenti aprite il file del client “notebook”. La configurazione di ogni client funziona sempre allo stesso modo, quindi dovrete solo cambiare il nome del dispositivo da impostare.

sudo su
cd /etc/openvpn/easy-rsa/keys
nano laptop.ovpn

Nel file “.ovpn” del client inserite ora il comando seguente:

dev tun
client
proto udp
remote x.x.x.x 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert laptop.crt
key laptop.key
comp-lzo
verb 3

Il contenuto del file qui sopra deve essere ancora modificato nel modo opportuno. Nella quarta riga sostituite “x.x.x.x” con l’indirizzo IP del vostro servizio DDNS (nel caso in cui utilizziate un indirizzo IP statico pubblico, potete semplicemente inserirlo), seguito dalla porta alla quale dovrebbe essere raggiungibile il server VPN. Nella terzultima e nella quartultima riga inserite il nome del vostro client (in questo caso: “notebook”). Dopo aver apportato le modifiche, salvatele con “CTRL + O” e chiudete l’editor con “CTRL + X”.

Infine comprimete insieme in un file zip il file di configurazione con i certificati e le chiavi. Nel caso in cui non abbiate installato alcun pacchetto zip sul Raspberry Pi, fatelo con il seguente comando:

apt-get install zip

Per creare un file zip utilizzate i seguenti comandi e fate di nuovo attenzione che abbiate impostato dappertutto il nome giusto del client.

zip /home/pi/raspberry_laptop.zip ca.crt laptop.crt laptop.key laptop.ovpn

Ora dovete ancora assegnare i permessi dei file e dopo terminate la configurazione con “exit”.

chown pi:pi /home/pi/raspberry_laptop.zip
exit

Il file zip è ora pronto e potete trasferirlo dal Raspberry Pi al client (ad esempio tramite un programma SCP o SFTP) e lo impostate poi sul dispositivo del client. Adesso potete accedere con il dispositivo da qualsiasi connessione Internet alla rete locale collegata al client e alla sua connessione Internet.

Configurare un proprio server VPN sul Raspberry Pi conviene

Creare e gestire una propria VPN è molto meno costoso di quanto si immagini: grazie al basso consumo energetico del Raspberry Pi non ci sono costi enormi da sostenere e i singoli componenti del server (Raspberry Pi, carta Micro-SD, ecc.) sono molto facili da reperire.

Inoltre un server VPN sul Raspberry Pi è in grado di fare molte cose. Infatti con il vostro server VPN dedicato sul Raspberry Pi potete accedere da ogni connessione Internet alla vostra rete locale. Perciò la connessione VPN è criptata e vi consente di muovervi in modo molto più sicuro in rete, sia che utilizziate una rete Wi-Fi aperta e/o non sicura, sia che sfruttiate la connessione dati del vostro gestore di telefonia mobile. Difficilmente una connessione Internet da dispositivi mobili riuscirà a offrirvi una maggiore protezione.