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:
- Un Raspberry PI (consiglio almeno la versione 3 Model B+) https://amzn.to/2Aad8yt
- Connessione ad Internet
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!
Ciao, mi chiamo Alessandro Lanni. Sono un professionista nel settore IT, ho iniziato la carriera da sviluppatore nel 2002. Mi appassiona l’elettronica amo condividere il know-how: “Cercare risposte e’ meglio che fare domande”
Una risposta.
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.