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:
0 |
sudo apt-get install openvpn |
Seguite le istruzioni: il pacchetto sarà scaricato, decompresso ed installato. Riavviate con:
0 |
sudo reboot |
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.
0 |
sudo apt-get install easy-rsa |
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:
0 |
sudo -s |
Il prompt cambierà definitivamente in:
0 |
root@RASPBERRY |
Ora dovete creare una cartella che sia in grado di ospitare i vostri certificati (si tratta di cartelle speciali):
0 |
make-cadir /etc/openvpn/easy-rsa |
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:
0 |
cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa |
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.:
0 1 |
cd /etc/openvpn/easy-rsa nano vars |
Cercate la riga che inizia con:
0 |
export EASY_RSA= |
Editatela inserendovi il percorso della cartella che avete creato prima e che conterrà i certificati. Quindi:
0 |
export EASY_RSA="/etc/openvpn/easy-rsa" |
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.
0 |
export KEY_SIZE=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.
0 1 2 3 4 5 |
export KEY_COUNTRY=”IT” export KEY_PROVINCE=”Piemonte” export KEY_CITY=”Torino” export KEY_ORG=”ChiattoRaffaeleSpa” export KEY_EMAIL=”raffaele@chiatto.com” export KEY_OU=”ChiattoCasa” |
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:
0 |
cd /etc/openvpn/easy-rsa |
Digitiamo:
0 1 |
source ./vars ./clean-all |
Digitiamo:
0 |
./build-ca |
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:
0 |
./build-key-server ServerName |
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.
0 1 |
Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y |
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:
0 |
./build-dh |
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:
0 1 |
cd /etc/openvpn/easy-rsa openvpn --genkey --secret keys/ta.key |
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).
0 |
./build-key-pass rafiphone |
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.
0 1 |
Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y |
Se ci posizioniamo nella cartella:
0 |
cd /etc/openvpn/easy-rsa/keys |
troverete 3 files in più: rafiphone.crt, rafiphone.csr, rafiphone.key. Spostatevi quindi nella cartella keys e digitate:
0 |
openssl rsa -in rafiphone.key -des3 -out rafiphone.3des.key |
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:
0 |
nano /etc/openvpn/server.conf |
Riempitelo con il testo in calce, stando attenti a variare i dettagli come indicato dai commenti preceduti dallo sharp #:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# stessa porta configurata sul router port 1194 # configurazione di base di OpenVPN proto udp dev tun # Chiavi e certificati ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/ServerName.crt key /etc/openvpn/easy-rsa/keys/ServerName.key # This file should be kept secret # Parametri Diffie-Hellman dh /etc/openvpn/easy-rsa/keys/dh2048.pem # # HMAC firewall tls-server tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0 tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA # configurazione degli indirizzi della VPN server 192.168.50.0 255.255.255.0 # se un client si disconnette e si riconnette gli si # riassegna lo stesso vecchio IP nella classe 192.168.50.0 ifconfig-pool-persist /etc/openvpn/easy-rsa/ipp.txt # Si aggiunge una rotta tra tutti i client della VPN push "route 192.168.50.0 255.255.255.0" # Si aggiunge una rotta affinché i client raggiungano gli # indirizzi locali nella propria rete dietro il router push "route 192.168.100.0 255.255.255.0" # DNS - Se il vostro router non fa da DNS usate quello di Google 8.8.8.8 push "dhcp-option DNS 192.168.100.1" # L'IP DEL VOSTRO ROUTER # Traffico internet push "redirect-gateway def1" # in questo modo si dirotta tutto il traffico via VPN client-to-client # la connessione tra i client è punto-punto duplicate-cn keepalive 10 120 # cifratura cipher AES-256-CBC auth SHA512 key-direction 0 # compressione comp-lzo # massimo numero di client connessi max-clients 5 user nobody group users persist-key persist-tun # log status /var/log/openvpn-status.log 300 log /var/log/openvpn.log verb 1 mute 20 |
Cliccate su CTRL+X, uscite (S) e salvate (INVIO). Riavviate il servizio OpenVPN con:
0 |
/etc/init.d/openvpn restart |
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
0 |
cd /etc/openvpn |
digitare
0 |
/etc/init.d/openvpn stop |
quindi
0 |
openvpn server.conf |
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:
0 |
nano /etc/default/openvpn |
Eliminate il commento nella riga che contiene AUTOSTART e inserite il nome del vostro file di configurazione del server (appena creato):
0 1 2 |
... AUTOSTART="server" ... |
Riavviate con
0 |
reboot |
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:
0 |
nano /etc/openvpn/easy-rsa/keys/client-full.txt |
Incolliamo il seguente testo:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# Full Tunnel OpenVPN client configuration client dev tun proto udp resolv-retry infinite key-direction 1 nobind persist-key persist-tun # cambiate 'subdomain.domain.com' con il vostro dominio DynDNS o con l'IP pubblico statico remote subdomain.domain.com 1194 # cifratura cipher AES-256-CBC auth SHA512 # HMAC firewall - commentato per problemi con connessioni 3G/4G tls-client tls-cipher DHE-RSA-AES256-SHA # compressione comp-lzo # logging setup mute-replay-warnings verb 3 mute 20 |
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:
0 |
nano /etc/openvpn/easy-rsa/keys/MakeOVPN.sh |
Si tratta di un altro file vuoto (nuovo) che dovete riempire così :
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#!/bin/bash # Default Variable Declarations DEFAULT="client-full.txt" FILEEXT="-full.ovpn" CRT=".crt" KEY=".3des.key" CA="ca.crt" TA="ta.key" #Ask for a Client name echo "Please enter an existing Client Name:" read NAME #1st Verify that client's Public Key Exists if [ ! -f $NAME$CRT ]; then echo "[ERROR]: Client Public Key Certificate not found: $NAME$CRT" exit fi echo "Client's cert found: $NAME$CR" #Then, verify that there is a private key for that client if [ ! -f $NAME$KEY ]; then echo "[ERROR]: Client 3des Private Key not found: $NAME$KEY" exit fi echo "Client's Private Key found: $NAME$KEY" #Confirm the CA public key exists if [ ! -f $CA ]; then echo "[ERROR]: CA Public Key not found: $CA" exit fi echo "CA public Key found: $CA" #Confirm the tls-auth ta key file exists if [ ! -f $TA ]; then echo "[ERROR]: tls-auth Key not found: $TA" exit fi echo "tls-auth Private Key found: $TA" #Ready to make a new .opvn file - Start by populating with the default file cat $DEFAULT > $NAME$FILEEXT #Now, append the CA Public Cert echo "<ca>" >> $NAME$FILEEXT cat $CA >> $NAME$FILEEXT echo "</ca>" >> $NAME$FILEEXT #Next append the client Public Cert echo "<cert>" >> $NAME$FILEEXT cat $NAME$CRT | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $NAME$FILEEXT echo "</cert>" >> $NAME$FILEEXT #Then, append the client Private Key echo "<key>" >> $NAME$FILEEXT cat $NAME$KEY >> $NAME$FILEEXT echo "</key>" >> $NAME$FILEEXT #Finally, append the TA Private Key echo "<tls-auth>" >> $NAME$FILEEXT cat $TA >> $NAME$FILEEXT echo "</tls-auth>" >> $NAME$FILEEXT echo "Done! $NAME$FILEEXT Successfully Created." #Script written by Eric Jodoin |
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:
0 1 2 |
cd /etc/openvpn/easy-rsa/keys/ chmod 700 MakeOVPN.sh ./MakeOVPN.sh |
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:
0 1 2 3 4 |
Client's cert found: rafiphone Client's Private Key found: rafiphone.3des.key CA public Key found: ca.crt tls-auth Private Key found: ta.key Done! rafiphone-full.ovpn Successfully Created. |
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
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# Full Tunnel OpenVPN client configuration client dev tun proto udp resolv-retry infinite key-direction 1 nobind persist-key persist-tun # cambiate 'subdomain.domain.com' con il vostro dominio remote subdomain.domain.com 1194 # 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.100.0 255.255.255.0 # cifratura cipher AES-256-CBC auth SHA512 # HMAC firewall tls-client tls-cipher DHE-RSA-AES256-SHA # compressione comp-lzo # logging setup mute-replay-warnings verb 3 mute 20 <ca> -----BEGIN CERTIFICATE----- MIIEUzCCA7ygAwIBAgIJALj0XeQVm8sRMA0GCSqGSIb3DQEBCwUAMIHNMQswCQYD VQQGEwJJVDETMBEGA1UECBMKLlBpZW1vbnRlLjERMA8GA1UEBxMILlRvcmluby4x HTAbBgNVBAoTFC5DaGlhdHRvUmFmZmFlbGVTcGEuMRYwFAYDVQQLEw0uQ2hpYXR0 ... ... b0Nhc2EuMSAwHgYDVQQDExcuQ2hpYXR0b1JhZmZhZWxlU3BhLiBDQTEQMA4GA1UE KRMHRWFzeVJTQTErMCkGCSqGSIb3DQEJARYcLnJhZmZhZWxlLmNoaWF0dG9AZ21h aWwuY29tLjAeFw0xNjA5MjYxMTU5MjJaFw0yNjA5MjQxMTU5MjJaMIHNMQswCQYD utv8YtjYSg== -----END CERTIFICATE----- </ca> <cert> -----BEGIN CERTIFICATE----- MIIEoTCCBAqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBzTELMAkGA1UEBhMCSVQx EzARBgNVBAgTCi5QaWVtb250ZS4xETAPBgNVBAcTCC5Ub3Jpbm8uMR0wGwYDVQQK ... ... ExQuQ2hpYXR0b1JhZmZhZWxlU3BhLjEWMBQGA1UECxMNLkNoaWF0dG9DYXNhLjEg MB4GA1UEAxMXLkNoaWF0dG9SYWZmYWVsZVNwYS4gQ0ExEDAOBgNVBCkTB0Vhc3lS zB5e/gby6nfpKPbCEzkLBJ7Mz5r8qYrZ5NdEb6CvNHC6CI3cgA== -----END CERTIFICATE----- </cert> <key> -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,A8074E89D9085C5C SBFe4vJ5M2v2ZIR5p6zlKOYq4xVXCCVMzYyAyjl/lannHkRptZeqNLeFM7V9PfTr ... ... 62/+PPBqiJKcWk7gNnsDRa+oG12GijxNStkmgoGV1Xd36gjaf0akLw== -----END RSA PRIVATE KEY----- </key> <tls-auth> # # 2048 bit OpenVPN static key # -----BEGIN OpenVPN Static key V1----- 4f046dd1698fb5ef172e24686fad2d4f ... ... 3272bccb1332f78ecc3f458941dc7853 -----END OpenVPN Static key V1----- </tls-auth> |
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:
0 |
nano /etc/openvpn/easy-rsa/keys/client-split.txt |
Incolliamo il seguente testo:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# Split Tunnel OpenVPN client configuration client dev tun proto udp resolv-retry infinite key-direction 1 nobind persist-key persist-tun # cambiate 'subdomain.domain.com' con il vostro dominio DynDNS o con l'IP pubblico statico remote subdomain.domain.com 1194 # 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.100.0 255.255.255.0 # cifratura cipher AES-256-CBC auth SHA512 # HMAC firewall - commentato per problemi con connessioni 3G/4G tls-client tls-cipher DHE-RSA-AES256-SHA # compressione comp-lzo # logging setup mute-replay-warnings verb 3 mute 20 |
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:
0 |
nano /etc/openvpn/easy-rsa/keys/MakeOVPN.sh |
Si tratta di un altro file vuoto (nuovo) che dovete riempire così :
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#!/bin/bash # Default Variable Declarations DEFAULT="client-split.txt" FILEEXT="-split.ovpn" CRT=".crt" KEY=".3des.key" CA="ca.crt" TA="ta.key" #Ask for a Client name echo "Please enter an existing Client Name:" read NAME #1st Verify that client's Public Key Exists if [ ! -f $NAME$CRT ]; then echo "[ERROR]: Client Public Key Certificate not found: $NAME$CRT" exit fi echo "Client's cert found: $NAME$CR" #Then, verify that there is a private key for that client if [ ! -f $NAME$KEY ]; then echo "[ERROR]: Client 3des Private Key not found: $NAME$KEY" exit fi echo "Client's Private Key found: $NAME$KEY" #Confirm the CA public key exists if [ ! -f $CA ]; then echo "[ERROR]: CA Public Key not found: $CA" exit fi echo "CA public Key found: $CA" #Confirm the tls-auth ta key file exists if [ ! -f $TA ]; then echo "[ERROR]: tls-auth Key not found: $TA" exit fi echo "tls-auth Private Key found: $TA" #Ready to make a new .opvn file - Start by populating with the default file cat $DEFAULT > $NAME$FILEEXT #Now, append the CA Public Cert echo "<ca>" >> $NAME$FILEEXT cat $CA >> $NAME$FILEEXT echo "</ca>" >> $NAME$FILEEXT #Next append the client Public Cert echo "<cert>" >> $NAME$FILEEXT cat $NAME$CRT | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $NAME$FILEEXT echo "</cert>" >> $NAME$FILEEXT #Then, append the client Private Key echo "<key>" >> $NAME$FILEEXT cat $NAME$KEY >> $NAME$FILEEXT echo "</key>" >> $NAME$FILEEXT #Finally, append the TA Private Key echo "<tls-auth>" >> $NAME$FILEEXT cat $TA >> $NAME$FILEEXT echo "</tls-auth>" >> $NAME$FILEEXT echo "Done! $NAME$FILEEXT Successfully Created." #Script written by Eric Jodoin |
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:
0 1 2 |
cd /etc/openvpn/easy-rsa/keys/ chmod 700 MakeOVPN.sh ./MakeOVPN.sh |
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:
0 1 2 3 4 |
Client's cert found: rafiphone Client's Private Key found: rafiphone.3des.key CA public Key found: ca.crt tls-auth Private Key found: ta.key Done! rafiphone-split.ovpn Successfully Created. |
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.
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.
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:
0 |
nano /etc/sysctl.conf |
Rimuovete dalla riga successiva il simbolo di inizio commento (#). Che quindi diventa:
0 |
net.ipv4.ip_forward=1 |
Cliccate su CTRL+X, uscite e salvate. Per applicare i cambiamenti descritti nel file appena modificato digitate
0 |
sysctl -p |
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:
0 |
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
Riavviate per applicare tutte le impostazioni
0 |
reboot |
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
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.
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!
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
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…
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
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.
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 ?
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
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?
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