Installare OpenVPN su Raspberry PI e configurare una rete VPN domestica

Configurare una VPN domestica su Raspberry PI

Come ti avevo scritto nel precedente articolo della serie Come progettare una virtual private network “VPN” per la Domotica, avere a disposizione un server VPN ti da la possibilità di raggiungere in qualsiasi momento e da qualsiasi posizione i tuoi dispositivi di rete usati, ad esempio, per la domotica. Vediamo in dettaglio come puoi installare e configurare OpenVPN su un Raspberry PI, creando cosi’ la tua rete VPN domestica.

Materiale Richiesto:

Nota: La guida la scrivo tenendo in considerazione che sul Raspberry hai già installato Raspbian, per cui tutta la parte di installazione del Sistema Operativo la ometterò.

Le fasi per poter correttamente configurare openvpn sul raspberry sono le seguenti:

Configurare l’IP LAN del Raspberry in modalità statico

Per poter rendere il tuo Raspberry PI sempre reperibile all’interno della tua LAN mediante lo stesso IP, procedi alla configurazione dell’IP statico come ti mostro in questo articolo:

https://vixr.it/come-impostare-lip-statico-al-raspberry-pi/

Aggiornare Raspbian

Prima di ogni altro comando, è consigliabile procedere ad aggiornare eventuali pacchetti di Raspbian, per farlo puoi usare questi comandi:

sudo apt-get update
sudo apt-get upgrade
sudo reboot

A reboot effettuato, potrai continuare con le successive operazioni di configurazione.

Abilitare il server SSH

Tutti i comandi che ti mostrerò sono da intendersi eseguiti dalla shell, personalmente trovo molto prativo usare il mio computer per accedere da remoto alla shell dei miei Raspberry PI. Se vuoi farlo, devi abilitare il servizio SSH. Lancia il comando:

sudo raspi-config

Naviga in Interfacing Options poi P2 SSH e conferma l’abilitazione selezionando Si.

A questo punto, puoi collegarti mediante SSH, usando il comando (io uso Mac OS):

ssh [email protected]

Sostituisci xxx.xxx.xxx.xxx con l’IP della LAN assegnato al tuo raspberry.

Installare OpenVPN e configurare Easy-RSA

Per iniziare la configurazione, bisogna prima installare openvpn (che è il vero e proprio servizio VPN) e easyrsa (che servirà a facilitare la creazione dei certificati server e client).

Procedi installando openvpn e openssl:

sudo apt-get install openvpn openssl

Nella directory /usr/share/easy-rsa troverai i files modello per iniziare a configurare il server. Fanne una copia nella directory di openvpn:

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

A questo punto é necessario creare il file di configurazione/etc/openvpn/easy-rsa/vars.

Puoi crearne la tua versione partendo da questa:

set_var EASYRSA                 "$PWD"
set_var EASYRSA_PKI             "$EASYRSA/pki"
set_var EASYRSA_DN              "cn_only"
set_var EASYRSA_REQ_COUNTRY     "IT"
set_var EASYRSA_REQ_PROVINCE    "FR"
set_var EASYRSA_REQ_CITY        "Cassino"
set_var EASYRSA_REQ_ORG         "vixrit CERTIFICATE AUTHORITY"
set_var EASYRSA_REQ_EMAIL       "[email protected]"
set_var EASYRSA_REQ_OU          "VIXRIT EASY CA"
set_var EASYRSA_KEY_SIZE        2048
set_var EASYRSA_ALGO            rsa
set_var EASYRSA_CA_EXPIRE       7500
set_var EASYRSA_CERT_EXPIRE     365
set_var EASYRSA_NS_SUPPORT      "no"
set_var EASYRSA_NS_COMMENT      "VIXRIT CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR         "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF        "$EASYRSA/openssl-easyrsa.cnf"
set_var EASYRSA_DIGEST          "sha256"

Non é necessario modificare i parametri poiché, per la maggior parte dei casi, vanno bene i valori di default. Tuttavia puoi documentarti ed eventualmente modificare il contenuto. Copia ed incolla il contenuto del file usando:

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

Una considerazione invece va fatta sul valore di default impostato per la configurazione:

set_var EASYRSA_KEY_SIZE       2048

Il parametro EASYRSA_KEY_SIZE indica la lunghezza della chiave. Piú una chiave é lunga, maggiore é il livello di sicurezza.

Tuttavia, a livello computazionale, una chiave di dimensioni maggiori puó far calare le performances generali del Raspberry PI.

Per una board versione 2, ad esempio, il valore 2048 é già troppo elevato per il grado di capacità computazionale, in questo caso potete portare il valore a 1024.

Detto ciò, assicurati che il file vars acquisisca il permesso di eseguibile:

sudo chmod +x /etc/openvpn/easy-rsa/vars

A questo punto la configurazione e’ completata, possiamo procedere alla creazione dei certificati di base.

Creare i certificati necessari

Siccome tutti i comandi elencati dovranno essere eseguiti con permessi di root, per comodita’ puoi scalare la connessione all’ utente root con il comando:

sudo su

Fai molta attenzione nell’uso della shell con i permessi di root; se sbagli un comando di cancellazione, ad esempio, potresti compromettere il funzionamento del sistema operativo.

Recati nella directory di easy-RSA digitando:

cd /etc/openvpn/easy-rsa

A questo punto sei pronto per iniziare la generazione dei certificati.

Creare la CA Key

Prima di creare le chiavi Client e Server, devi creare la directory PKI (Public Key Infrastructure) e generare la CA key:

./easyrsa init-pki
./easyrsa build-ca

Specifica una password (che dovrai ricordare) per la generazione della CA Key. Se tutto fila liscio ritroverai il file:

/etc/openvpn/easy-rsa/pki/ca.crt

Creare la Server Key

Procedi alla creazione della Key del server, digita questo comando:

 ./easyrsa gen-req vixrit-server nopass

La stringa vixrit-server identifica il nome del server. Puoi sostituirla a tuo piacere, ma ricordati di sostituirla in qualsiasi parte essa comparirà.

Generato il file di chiave /etc/openvpn/easy-rsa/pki/private/vixrit-server.key, procedi a firmarlo con il Certificato CA:

./easyrsa sign-req server vixrit-server

Ti verrà richiesto di inserire la password della chiave CA, che hai specificato durante la fase di creazione.

Al termine della procedura avrai generato un nuovo file:

/etc/openvpn/easy-rsa/pki/issued/vixrit-server.crt

Il file rappresenta il certificato del tuo Server VPN.

Prima di proseguire con gli altri certificati, e’ buona regola verificare la correttezza delle operazioni precedenti; lancia il comando openssl:

openssl verify -CAfile pki/ca.crt pki/issued/vixrit-server.crt

Se tutto e’ andato liscio riceverai questo output:

pki/issued/vixrit-server.crt: OK

Generare i Client Key

Con il certificato Server creato, il server VPN e’ pronto per essere avviato. Tuttavia, per permettere la connessione alla VPN ai vari clients, dovrai procedere alla creazione di un Certificato per ogni client, identificando in modo univoco i client tra loro con un nome.

Questa operazione che stiamo per effettuare, quindi, la dovrai eseguire per ogni client che vorrai abilitare all’accesso della VPN.

Nel mio caso, il primo client che generero’ sara quello del mio smartphone, decido di chiamare il cliente iphone:

./easyrsa gen-req iphone nopass

Come fatto per il certificato Server, procediamo alla firma del certificato client iphone con il CA:

./easyrsa sign-req client iphone

Digita ‘yes’, premendo invio, e poi la password che hai scelto nel momento di creazione della CA Key. Se tutto va a buon fine, dovrai avere a disposizione il nuovo file:

/etc/openvpn/easy-rsa/pki/issued/iphone.crt

Esegui la verifica del certificando usando OpenSSL:

openssl verify -CAfile pki/ca.crt  pki/issued/iphone.crt

Se tutto e’ andato bene, dovresti ricevere questo output:

pki/issued/iphone.crt: OK

Generare la chiave Diffie-Hellman

Per migliorare la sicurezza e’ buona regola creare anche la DH Key (Diffie-Hellman), la cui lunghezza verra’ definita in base a quello che hai scelto di specificare nel file vars sotto la voce EASYRSA_KEY_SIZE, nel mio caso e’ 2048, attenzione ad usare questa dimensione su Raspberry PI di versioni vecchie.

Esegui quindi questo comando:

./easyrsa gen-dh

L’operazione impiegherà alcuni minuti, dipendentemente dal tuo Hardware. Noterai l’avanzare della procedura a video. Ad operazione conclusa noterai l’output: DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem

Copiare i certificati generati

Una volta generati i certificati per Client e Server, puoi spostarli nelle directory di OpenVPN, procedi quindi alla copia del:

Certificato Server

cp pki/ca.crt /etc/openvpn/server/
cp pki/issued/vixrit-server.crt /etc/openvpn/server/
cp pki/private/vixrit-server.key /etc/openvpn/server/

Certificato Client

cp pki/ca.crt /etc/openvpn/client/
cp pki/issued/iphone.crt /etc/openvpn/client/
cp pki/private/iphone.key /etc/openvpn/client/

Chiave DH

cp pki/dh.pem /etc/openvpn/server/

A questo punto i certificati Client e Server sono stati copiati nelle corrispondenti directory di configurazione di OpenVPN.

Configurare OpenVPN

Per continuare ad installare OpenVPN su Raspberry PI, con i certificati copiati nelle directory server e client, modifichiamo opportunamente il file di configurazione di openVPN:

cd /etc/openvpn/server/
vi server.conf

Puoi usare il mio file di configurazione, copia ed incolla il contenuto nel nuovo file server.conf sul tuo Raspberry:

# OpenVPN -  Porte, Protocollo, e Tun
port 1194
proto udp
dev tun

# OpenVPN - Certificato Server, CA, e key
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/vixrit-server.crt
key /etc/openvpn/server/vixrit-server.key

# Chiave DH
dh /etc/openvpn/server/dh.pem

# Configurazione di rete - Network Interna
server 10.5.0.0 255.255.255.0

# Decommenta questa riga per redirige tutte le connessioni attraverso il server OpenVPN
#push "redirect-gateway def1"

# Configurazione DNS - Usiamo quelli di Google
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

#Permetti la connessioni di client multipli con la stessa chiave
duplicate-cn

# Sicurezza TLS
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache

# Altro
keepalive 20 60
persist-key
persist-tun
compress lz4-v2
daemon
user nobody
group nogroup

# Log
log-append /var/log/openvpn.log
verb 3

Salva il file ed esci dall’editor. La tua configurazione e’ completata.

Se hai apportato delle impostazioni custom al firewall del raspberry, dovrai provvedere a configurarlo per abilitare l’uso del server VPN dall’esterno.

Avviare il server OpenVPN

Le precedenti operazioni richiedevano l’uso dell’escalation a root. Anche l’avvio del servizio openvpn richiede i permessi di root. Per semplicita’ ti riporto il comando da eseguire con l’utente non root (di default pi):

sudo systemctl start openvpn-server@server
sudo systemctl enable openvpn-server@server

A questo punto il servizio dovrebbe essere attivo, verificalo con il seguente comando:

sudo systemctl status openvpn-server@server

Se il servizio e’ attivo, dovrei leggere la stringa: Active: active (running).

Per controprova, lanciando il comando:

sudo netstat -plntu

Dovresti notare la presenza del servizio udp in ascolto sulla port 1194 (definita nel file server.conf):

udp 0 0 0.0.0.0:1194 0.0.0.0:* 14091/openvpn

Configurazione del Client

Per proseguire ad installare OpenVPN su Raspberry PI, come fatto per la Generazione del Client Key, anche questa procedura deve essere eseguita per ogni client.

Il mio consiglio, a tal proposito, e’ di iniziare da un file modello di configurazione di openvpn client, a cui poi andrai a sostituire solo alcuni parametri in base al client in esame.

client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194

cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256

resolv-retry infinite
compress lz4-v2
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

<ca>
ca-xxx
</ca>
<cert>
client-cert-xxx
</cert>
<key>
client-key-xxx
</key>

Per personalizzare il tuo template, procedi nel seguente modo per sostituire le stringhe ca-xxx, client-cert-xxx e client-key-xxx con i valori appropriati.

1) Ottieni il certificato CA digitando:

sudo cat /etc/openvpn/server/ca.crt

Copia tutto il contenuto compreso tra -----BEGIN CERTIFICATE----- e -----END CERTIFICATE----- (inclusi) e sostituisci la stringa ca-xxx.

2) Ottieni il certificato del client digitando:

sudo cat /etc/openvpn/client/iphone.crt

Anche per questo, copia tutto il contenuto compreso tra -----BEGIN CERTIFICATE----- e -----END CERTIFICATE----- (inclusi) e sostituisci la stringa client-cert-xxx.

3) Ottieni la chiave del client digitando:

sudo cat /etc/openvpn/client/iphone.key

Copia tutto il contenuto compreso tra -----BEGIN CERTIFICATE----- e -----END CERTIFICATE----- (inclusi) e sostituisci la stringa client-key-xxx.

4) Specifica l’IP del Raspberry PI

Nel file di configurazione del client, noterai la stringa xxx.xxx.xxx.xxx . Questa stringa va sostituita con l’IP mediante il quale il tuo client potrà raggiungere il tuo Server openVPN. Se stai usando un servizio di DynDNS, potrai specificare l’hostname.

Conclusioni

Di certo installare OpenVPN su Raspberry PI e configurare i vari client non è di facile esecuzione, soprattutto se sei nuovo nel mondo Unix. Il mio consiglio è di farsi aiutare (e spero che questa guida ti aiuti) cercando però di capire in autonomia le varie fasi della procedura.

Inoltre, adottare una VPN, ti garantisce una serie di vantaggi che le normali modalità di connessione non ti danno.

Se hai bisogno di un aiuto, puoi provare a scrivermi usando i social o disqus, se posso ti aiuterò volentieri.

Ciao!

 

Una risposta.

  1. giovanni laveglia ha detto:

    Salve,
    Ho seguito la procedura, complimenti spiega veramente bene.
    Come previsto riesco a collegarmi alla lan ma mon a sfogliare la rete o a pin gare il router.
    Cosa può essere, grazie 1000.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *