Installazione e Configurazione di OpenVPN Server su Raspberry PI

by | Set 26, 2016

Una VPN (acronimo di Virtual Private Network) può essere considerata come un’estensione di una rete privata che si occupa di instaurare dei “collegamenti” tra due o più sistemi che debbono scambiarsi dati in modo sicuro, utilizzando una rete condivisa o comunque pubblica qual è Internet.
Una rete VPN permette di scambiare dati in modo simile a quanto accade in una connessione privata punto-punto. L’approccio utilizzato dà modo di rendere il computer remoto parte di una rete privata interna alla struttura aziendale creando un “tunnel” virtuale attraverso la rete Internet.
Per simulare un collegamento punto-punto, i dati vengono incapsulati con l’aggiunta di un’intestazione che fornisce le informazioni di routing e cifrati in modo da renderne possibile la lettura da parte di eventuali aggressori, sprovvisti delle necessarie chiavi crittografiche.

OpenVPN è una valida soluzione opensource, disponibile per svariati sistemi operativi, che consente di implementare una VPN a costo zero senza quindi doversi necessariamente rivolgere a Windows Server.

PRE-REQUISITI

– Raspberry Pi 2 o l’ultima versione 3
– Micro SD Card
– Cavo ethernet per il collegamento del Raspberry alla rete
– Configurazione IP Statico sulla Raspberry
– Impostare il Port Forwarding sul Router verso il Raspberry per la porta UDP 1194

INSTALLAZIONE OPENVPN SERVER (Version:2.3.4-5+deb8u1)

Per realizzare la nostra VPN installeremo ed utilizzeremo il pacchetto OpenVPN. Digitate:

Seguite le istruzioni: il pacchetto sarà scaricato, decompresso ed installato. Riavviate con:

INSTALLAZIONE EASY RSA (Version: 2.2.2-1)

Esattamente come una chiave che apre la porta principale di casa vostra, la VPN ha bisogno di generare le proprie chiavi per assicurarvi che solo i dispositivi autorizzati possano collegarsi ad essa. Al fine di connette in modo sicuro due computer, OpenVPN utilizza infatti chiavi che forniscono lo strato di autenticazione e di sicurezza. E ‘importante proteggere le chiavi che stiamo per generare assicurandoci che nessuno possa accedervi.

E’ necessario installare Easy_RSA, un pacchetto semplice che vi permetterà di usare la cifratura RSA e generare chiavi univoche.

La prossima serie di comandi devono necessariamente essere eseguiti con privilegi di super amministratore (root). Fino a questo momento il vostro prompt recitativa:

Digitando sudo prima di un comando, voi dite al sistema operativo di eseguirlo con privilegi di amministratore, nella cartella root. Dovendo digitare moti comandi, per evitare di scrivere in continuazione sudo + comando, digitiamo una volta per tutte:

Il prompt cambierà definitivamente in:

Ora dovete creare una cartella che sia in grado di ospitare i vostri certificati (si tratta di cartelle speciali):

Copiamo in questa cartella i files di EasyRSA che dovranno essere editati: in questo modo avremo a disposizione un backup nel caso qualcosa andasse storto:

In pratica abbiamo copiato tutti i files da cartella easy-rsa alla nostra nuova cartella. Prossimo passo: spostiamoci di cartella e andiamo a modificare il file di testo che contiene i parametri di base, quali il percorso delle chiavi, la nostra nazione, la provincia, la città, etc.:

openvpn-rasp-01

Cercate la riga che inizia con:

Editatela inserendovi il percorso della cartella che avete creato prima e che conterrà i certificati. Quindi:

openvpn-rasp-02

Ora spostate il cursore un po’ più sotto. Se siete paranoici, potete impostare la dimensione della chiave di cifratura a 2048 bit. Servirà molto tempo per la generazione delle chiavi, e la connessione sarà un po’ più lenta, ma potrete vivere sonni assolutamente tranquilli. Io, con un Raspberry Pi 2, tendo a a lasciarla a 1024.

Andando ancora più giù, riempite gli ultimi parametri dettando dei nuovi defaults. Queste voci vi faranno risparmiare tempo in fase di creazione delle chiavi, ma sono di fatto ininfluenti per il corretto funzionamento della VPN.

Ovviamente sostituite i valori tra le virgolette con i vostri parametri. Per salvare premete CTRL+X (insieme) e rispondete SI (S o Y). Quando vi verrà chiesto se volete cambiare il nome al file, accettate senza modificare nulla.

LE CHIAVI DELLE CERTIFICATION AUTHORITY

Creiamo a questo punto i certificati che la VPN userà per garantire le autorizzazioni ai dispositivi che vorranno connettersi. Aprite la cartella easy-rsa ed eseguite i seguenti comandi:

openvpn-rasp-03

Digitiamo:

openvpn-rasp-04

Digitiamo:

Digitare IT quindi Invio

Digitare sempre Invio fino al termine delle domande

Nell’ultimo passo viene scritta la chiave privata nel file ca.key, mentre un certificato nel file ca.crt. Vi verranno chieste una serie di informazioni che però dovreste avere già popolato nel file vars.

LE CHIAVI DEL SERVER

Dare un nome al server VPN è come dare un nome ad un proprio figlio: non si cambia e non si può scordare. Digitate:

openvpn-rasp-05

ATTENZIONE! Anche in questo caso rispondete alle domande che vi vengono poste scegliendo eventualmente di lasciare i valori di default (esattamente come nel caso precedente in cui vi chiedevano la Nazione, il Nome, etc). Fate però attenzione a due cose importanti:

Common Name: deve essere uguale al ServerName che avete scelto;
Challenge password: deve essere lasciata blank (vuota);

Firmate il certificato ed eseguite il commit.

SCAMBIO DI CHIAVI DIFFIE-HELLMAN

Lo scambio di chiavi Diffie-Hellman (Diffie-Hellman key exchange) è un protocollo crittografico che consente a due entità di stabilire una chiave condivisa e segreta utilizzando un canale di comunicazione insicuro (pubblico) senza la necessità che le due parti si siano scambiate informazioni o si siano incontrate in precedenza. Digitate:

openvpn-rasp-06

Se avete scelto una profondità di 2048 bit, potreste dover aspettare più di un’ora. A 1024 bit l’operazione impiega pochi minuti.

PROTEZIONE DA DOS: HMAC

OpenVPN è in grado di difendervi da attacchi di tipo Denial of Services (o anche operazioni di port Scanning, buffer overflow, etc) generando una chiave statica pre-condivisa HMAC (hash-based message code). Questo significa che il server non proverà nemmeno ad autenticare un accesso se non viene rilevata questa chiave. Per generare la chiave HMAC digitate:

LE CHIAVI DEL CLIENT

Il vostro server VPN è praticamente configurato. Adesso è necessario creare le chiavi per ciascun dispositivo che debba connettersi. Potreste anche decidere di usare la stessa chiave per tutti i dispositivi, ma avreste il vincolo che non si potranno connettere contemporaneamente. Creiamo, ad esempio, la chiave per il mio smartphone che chiamerò rafiphone (voi ovviamente usate un altro nome).

Anche in questo caso vi verranno chieste alcune cose:

PEM pass phrase: scegliete una password che dovrete ricordare. Dovrete digitarla due volte!
Challenge password: deve essere lasciata blank (vuota);

Firmate anche questa volta il certificato ed eseguite il commit.

Se ci posizioniamo nella cartella:

troverete 3 files in più: rafiphone.crt, rafiphone.csr, rafiphone.key. Spostatevi quindi nella cartella keys e digitate:

Quest’ultima istruzione aggiunge un ulteriore strato di cifratura (3DES) in modo da rendere la vita degli hackers un po’ più complicata. Vi verrà chiesta la password scelta precedentemente. Vi verrà chiesto inoltre di generare una ulteriore password (PEM pass phrase): io vi consiglio di usare la solita, in modo da doverne ricordare solo una per certificato.

Ripetete l’operazione qui descritta per ogni utente o dispositivo a cui volete concedere l’accesso alla VPN.

CHIAVI E CERTIFICATI

Abbiamo generato un certificato/chiave master per la CA, una chiave Diffie-Hellman, una chiave HMAC, un certificato/chiave per il server ed un certificato/chiave per ogni client (nel nostro esempio solo 1):

Filename Sono utilizzati da Scopo File segreto
ca.crt server + all clients Root CA certificate NO
ca.key key signing machine only Root CA key SI
dh1024.pem server only Diffie Hellman parameters NO
ServerName.crt server only Server Certificate NO
ServerName.key server only Server Key SI
ta.key server + all clients HMAC Key SI
rafiphone.crt client1 only Client1 Certificate NO
rafiphone.key client1 only Client1 Key SI

Vedremo successivamente come usarli.

CONFIGURZIONE DEL SERVER

Ora abbiamo creato serrature e chiavi. Non ci resta che dire al Raspberry Pi dove mettere le porte. In pratica dobbiamo istruire OpenVPN ad usare le chiavi che abbiamo creato ed il giusto IP con relativa porta. Creiamo un file di configurazione a partire da un foglio bianco:

Riempitelo con il testo in calce, stando attenti a variare i dettagli come indicato dai commenti preceduti dallo sharp #:

Cliccate su CTRL+X, uscite (S) e salvate (INVIO). Riavviate il servizio OpenVPN con:

L’esempio del file di configurazione creerà una VPN usando una interfaccia di rete virtuale TUN (per il routing), si metterà in ascolto dei clients sulla porta UDP 1194 e distribuirà indirizzi IP virtuali nella sottorete 192.168.50.0/24.

NOTA: Per testare rapidamente la configurazione è sufficiente lanciare direttamente OpenVPN (assicurandosi prima di aver fermato il demone lanciato dall’init script durante l’installazione):

posizionarsi nella cartella

digitare

quindi

Se non ricevete nessun errore allora la vostra configurazione è corretta, potete interrompere l’esecuzione con Ctrl+C.

AUTOSTART DI OPENVPN SERVER

Editate il file /etc/default/openvpn con:

Eliminate il commento nella riga che contiene AUTOSTART e inserite il nome del vostro file di configurazione del server (appena creato):

Riavviate con

CONFIGURAZIONE DEL CLIENT

Abbiamo creato le chiavi per i client (computer e dispositivi vari) che vogliamo che si connettano alla nostra VPN. Dobbiamo però ancora dire ai nostri client dove trovare il server, come connettersi o quali chiavi usare. Ci sono due possibili impostazioni per i vostri client, che determinano il modo in cui il traffico viene gestito dalla VPN.

FULL TUNNEL: si indirizza tutto il traffico Internet attraverso il server OpenVPN. Se ad esempio volete connettervi attraverso un hotspot pubblico ma in sicurezza. Per esempio se voleste consultare la vostra home banking, i server della vostra banca vi vedranno arrivare esattamente come se vi foste collegati da casa.Utilizzare la configurazione full tunnel è una buona idea se si desidera proteggere il 100% di tutto il traffico in uscita dal dispositivo client. Questo è il metodo utilizzato normalmente per le connessioni di utenti in paesi in cui l’accesso alla rete è fortemente regolamentata (ad esempio la Cina) o per le connessioni attraverso accessi pubblici controllati.Facendo passare tutto il traffico in modo sicuro attraverso la propria rete domestica, si ottiene lo stesso livello di sicurezza e di fiducia della propria rete domestica. Lo svantaggio qui può essere prestazionale, dal momento che la larghezza di banda è limitata dalle possibilità del vostro Raspberry Pi e dal vostro contratto internet.

SPLIT TUNNEL: si indirizza attraverso il server VPN solo il traffico Internet che ha bisogno di raggiungere l’interno della vostra rete domestica. Ad esempio se voleste accedere al vostro NAS per vedere un film da remoto. Il nome split deriva dal fatto che il traffico ha un percorso diverso a seconda se si stia andando alla rete domestica oppure no. Tutto il traffico Internet viene quindi veicolato attraverso il gateway predefinito della vostra connessione.Usare la configurazione split tunnel è una buona idea se non siete preoccupati dal livello generale di sicurezza della vostra connessione e volete semplicemente accedere alla vostra rete di casa, magari in mobilità con il vostro smartphone o dalla rete del vostro ufficio.

CONFIGURAZIONE FULL TUNNEL

Se avete creato differenti chiavi per ciascuno dei client (o come nel nostro caso avete differenti modalità di tunneling), potrebbe essere un po’ noioso generare un file di configurazione per ogni differente client partendo da zero. Per fortuna Eric Jodoin dell’istituto SANS ci ha preparato un comodo script.

Prima di tutto creeremo un file intermedio (diciamo di appoggio) contenente i parametri fondamentali per una connessione “full tunnel” e lo salveremo sul Raspberry Pi. Useremo questo file successivamente per produrre il file di configurazione vero e proprio da installare sul client. Apriamo l’editor di testo e creiamo quindi un file nuovo client-full.txt:

Incolliamo il seguente testo:

Ovviamente modificate il testo con i vostri parametri come indicato nei commenti. Salvate ed uscite.

Ora creiamo il nostro primo file di profilo: un file di configurazione che contiene tutti parametri, ma anche le chiavi ed i certificati necessari a far collegare un client al Server VPN.  Creiamo lo script di Eric Jodoin che ci faciliterà il compito:

Si tratta di un altro file vuoto (nuovo) che dovete riempire così :

Questo file altro non fa che creare un file .opvn (cioè il profilo di configurazione del client) concatenando i parametri di default che avete impostato nel file client-full.txt, i certificati e le chiavi.

Salvate ed uscite (CTRL+ X, S, INVIO). Diamo a questo script permessi di esecuzione, e lanciamolo:

Vi chiederà di inserire il nome del client per generare il profilo: nel mio caso ho inserito rafiphone. Verificate che tutto sia andato a buon fine:

Il vostro primo files di configurazione è pronto: lo trovate nella cartella /etc/openvpn/easy-rsa/keys/ con il nome rafiphone-full.ovpn

Qui un esempio

CONFIGURAZIONE SPLIT TUNNEL

Ripetiamo più o meno le stesse operazioni fatte per la connessione full: cambia ovviamente qualcosa nella configurazione.

Qui di seguito, creeremo un file intermedio (diciamo di appoggio) contenente i parametri fondamentali per una connessione “split tunnel” e lo salveremo sul Raspberry Pi. Useremo questo file successivamente per produrre il file di configurazione vero e proprio da installare sul client. Apriamo l’editor di testo e creiamo un file nuovo:

Incolliamo il seguente testo:

Ovviamente modificate il testo con i vostri parametri come indicato nei commenti. Salvate ed uscite.

Ora creiamo il nostro primo file di profilo: un file di configurazione che contiene tutti parametri, ma anche le chiavi ed i certificati necessari a far collegare un client al Server VPN.  Creiamo lo script di Eric Jodoin che ci faciliterà il compito:

Si tratta di un altro file vuoto (nuovo) che dovete riempire così :

Questo file altro non fa che creare un file .opvn (cioè il profilo di configurazione del client) concatenando i parametri di default che avete impostato nel file client-split.txt, i certificati e le chiavi.

Salvate ed uscite (CTRL+ X, S, INVIO). Diamo a questo script permessi di esecuzione, e lanciamolo:

Vi chiederà di inserire il nome del client per generare il profilo: nel mio caso ho inserito rafiphone. Verificate che tutto sia andato a buon fine:

Il vostro primo files di configurazione è pronto: lo trovate nella cartella /etc/openvpn/easy-rsa/keys/ con il nome rafiphone-split.ovpn

ESPORTAZIONE DELLE CHIAVI SUL DISPOSITIVO CLIENT

Per prelevare i file di configurazione appena creati possiamo utilizzare WinSCP accedendo con l’utenza di root e copiandoli sul nostro PC.

openvpn-rasp-07

Selezionare il file e fare un drag&drop sul desktop

A questo punto per inviarlo al dispositivo client (nel mio caso un Iphone) possiamo allegarlo ad una mail e procedere alla relativa configurazione.

Configurare connessione OpenVPN su Iphone

CONFIGURAZIONE IP FORWARDING

A questo punto un’ultima configurazione per essere sicuri che il vostro Raspberry Pi possa conoscere come gestire l’inoltro del traffico internet attraverso la nuova rete. Digitate:

Rimuovete dalla riga successiva il simbolo di inizio commento (#). Che quindi diventa:

Cliccate su CTRL+X, uscite e salvate. Per applicare i cambiamenti descritti nel file appena modificato digitate

FIREWALL

Raspbian ha un firewall integrato che bloccherà tutte le connessioni in ingresso: è quindi necessario permettere al traffico autorizzato di attraversare OpenVPN.

Inseriamo all’interno di IPtables la seguente regole digitando:

Riavviate per applicare tutte le impostazioni

 

Questo tutorial è stato redatto leggendo diverse guide su internet e in particolar modo prendendo spunto dal seguente link apportando alcune modifiche per un corretto funzionamento

Una VPN con il Raspberry Pi

 

Scritto da Raffaele Chiatto

Sono Raffaele Chiatto, un appassionato di informatica a 360 gradi.
Tutto è iniziato nel 1996, quando ho scoperto il mondo dell'informatica grazie a Windows 95, e da quel momento non ho più smesso di esplorare e imparare.
Ogni giorno mi dedico con curiosità e passione a scoprire le nuove frontiere di questo settore in continua evoluzione.

Articoli Recenti

Veeam Backup

Monitoring

Friends

  • My English Lab  English School
  • ChrSystem   Infrastrutture IT
  • ACT For Cange  Mental Coach
  • Since 01  Kreative Graphics

Database

Networking

Autori

  • Raffaele Chiatto  Amministratore
  • Marco Valle  Autore Collaboratore

Related Post

9 Comments

  1. WebMaster

    Buongiorno Nicola, innanzitutto grazie per i complimenti…. Per quanto riguarda il tutorial effettivamente è datato e di sicuro con la nuova release del sistema operativo e relativi aggiornamenti qualcosa è cambiato… appena ho un po’ di tempo scriverò un nuovo tutorial aggiornato!

  2. Buongiorno Raffaele, cercavo una guida del genere da parecchio tempo, una guida chiara e ben scritta come la tua, che spiega passo passo cosa bisogna fare. Se quella in alto al tuo articolo è la data in cui hai scritto la guida, ad oggi un po’ di tempo è passato, e credo che alcune cose siano cambiate. Mi spiego meglio… Premetto che non sono assolutamente un utente esperto, quindi quando ciò che incontro nella mia esperienza è troppo diverso da ciò che leggo in una guida, mi fermo a quello step senza poter più proseguire. In particolare (e siamo ancor prima di generare le chiavi..), il file “vars” da modificare, non è più strutturato con le diciture che indichi (come ad esempio: export EASY_RSA= ). Per quanto abbia cercato di intuire come poter cambiare la directory, non sono riuscito più ad andare avanti, perchè tutti i comandi successivi, non davano buon esito. Prima di metterla in pratica ho letto tutta la tua guida per cercare di capire se era alla mia portata, ed effettivamente è scritta in maniera chiarissima. Hai fatto un gran lavoro, e sarebbe veramente un peccato se questa guida non possa essere fruibile a tutte quelle persone che come me, non sono molto pratiche col terminale di linux. Sarebbe gentile da parte tua se gli potessi dare una rivisitata da adattarla a quella che è la situazione odierna. Intanto ti saluto e ti ringrazio.
    Nicola

  3. WebMaster

    Ciao Americo è corretto perché la vpn di solito serve a collegare un pc esterno ad un lan interna e non il contrario. Si può fare quello che dici tu ma dovresti aggiungere delle rotte statiche sulla raspberry che ti girerebbero il traffico al contrario. Io per fare quello che dici tu utilizzerei un software tipo il teamviewer…

  4. Ciao Raffaele, il mio problema è leggermente diverso, è tutto funzionante, riesco a raggiungere la mia lan dal lato client ma non riesco a fare l’opposto, ovvero, se provo a pingare il mio router da un client della VPN funziona tutto e ho accesso a tutta la mia rete lan interna (stampanti, nas, pc, ecc ecc… ) dal pi se pingo un ip di un client vpn, nel mio caso 10.8.0.2 raggiungo il client. Quello che non funziona è raggiungere i client dalla mia lan, ovvero se da un pc connesso al router (ovviamente dove è connesso anche il server OpenVPN) provo a pingare un ip di un client 10.8.0.2 ho come risposta “no route to host”. Secondo te posso risolvere in qualche modo ?

    Grazie Mille

  5. Ciao raffaele,

    ho eseguito alla lettera la tua guida ed ho creato solo un client-full.
    Quando vado ad avviarlo sia da android che da windows mi da il seguente errore:
    WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.
    Deprecated TLS cipher name ‘DHE-RSA-AES256-SHA’, please use IANA name ‘TLS-DHE-RSA-WITH-AES-256-CBC-SHA’

    Cosa può essere?
    Grazie.

  6. WebMaster

    Ho modificato l’articolo…. grazie ancora!
    Quindi riepilogando se da rete 4G riesci a chiudere la VPN vuol dire che la configurazione del Port Forwarding sul Router è corretta.
    Il problema è che dalla rete VPN non riesci a raggiungere la rete tua locale giusto?
    Questo secondo me perchè non è impostato correttamante il routing sulla raspberry.
    Hai dato il comando : iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ?

  7. Queste righe subito dopo la riga con l’indirizzo remote di connessione:

    # si ignora l’impostazione delle rotte del server
    route-nopull
    # si sovrascrive il gateway
    route 0.0.0.0 192.0.0.0 net_gateway
    route 64.0.0.0 192.0.0.0 net_gateway
    route 128.0.0.0 192.0.0.0 net_gateway
    route 192.0.0.0 192.0.0.0 net_gateway

    # si aprono le rotte verso la sola propria rete locale
    route 192.168.1.0 255.255.255.0

    Si esatto mi viene assegnato l’IP dal tunnel del range impostato (192.168.50.x) e posso raggiungere il raspberry al suo indirizzo su tutte le porte (come dovrebbe essere essendo in VPN) però solo lui e non posso vedere null’altro sulla rete nemmeno il router.
    Sto provando mettendo il raspberry in rete con port forwarding sul router e connettendomi in VPN da una connessione 4G.
    Non ho capito che gateway devo provare a pingare, il router della connessione VDSL sotto cui è il raspberry ?
    se si certo altrimenti non mi ci potrei connettere.
    Grazie
    Ciao

  8. WebMaster

    Ciao Claudio grazie per la correzione . Se mi indichi quali righe ho dimenticato le aggiungo volentieri nell’ articolo.
    Per quanto riguarda il tuo problema se ho capito bene riesci a chiudere la vpn senza problemi e quindi il tuo client riceve un ip dal dhcp del tunnel. La mia domanda è riesci a pingare il gateway del tunnel una volta chiusa la vpn?

  9. Buongiono Raffaele,
    Innanzitutto volevo segnalarti un refuso nella guida, hai riportato una conf errata per il file client-split.txt, lo hai messo uguale al full, mentre dal link che hai riportato ho visto che ci sono varie righe di route, che ho copiato nel mio file.
    Ma ti scrivo per un altro problema, mi connetto al PI ma non riesco a vedere il resto della rete interna, ho provato sia con connessione full che split, per altro con la full in realtà non riesco nemmeno a navigare in Internet.
    In pratica raggiungo colo il PI, dal PI invece ved la rete.
    Ho modificato sia il file di donf della rete che iptable come indicato, non so più cosa provare, hai qualche idea ?

    Grazie
    Ciao
    Claudio

Submit a Comment

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

Virtualizzazione

Linux

Microsoft

Apple

Backup

Database

Security

Automazione