Openvpn: differenze tra le versioni

revisionata, corretti alcuni errori, modificata gerarchia titoli
Nessun oggetto della modifica
(revisionata, corretti alcuni errori, modificata gerarchia titoli)
Riga 1: Riga 1:
= Introduzione =
== Introduzione ==
Una VPN (''Virtual Private Network'') è un tipo di interconnessione tra computer che permette, sul piano logico, di comprendere in una LAN (''Local Area Network'') computer residenti in qualsiasi parte del pianeta.
Una VPN (''Virtual Private Network'') è un tipo di interconnessione tra computer che permette, sul piano logico, di comprendere in una LAN (''Local Area Network'') computer residenti in qualsiasi parte del pianeta.
Solitamente si considera una LAN come una rete di computer  locali, identificati da un indirizzo e una classe di IP (es: 192.168.0.0/24, 10.0.0.0/24 etc.). Con un collegamento VPN, un computer che si trovi fisicamente al di fuori di tale LAN, può risultarne un perfetto membro.  
Solitamente si considera una LAN come una rete di computer  locali, identificati da un indirizzo e una classe di IP (es: 192.168.0.0/24, 10.0.0.0/24 etc.). Con un collegamento VPN, un computer che si trovi fisicamente al di fuori di tale LAN, può risultarne un perfetto membro.  
Riga 17: Riga 17:
La tecnica che permette di creare connessioni sicure attraverso reti insicure consiste nell'utilizzare un [[glossario:Tunneling|tunnel]] criptato attraverso il quale far transitare le nostre comunicazioni, rendendole di fatto invisibili all'esterno.
La tecnica che permette di creare connessioni sicure attraverso reti insicure consiste nell'utilizzare un [[glossario:Tunneling|tunnel]] criptato attraverso il quale far transitare le nostre comunicazioni, rendendole di fatto invisibili all'esterno.


== Prima di cominciare ==
=== Prima di cominciare ===
La prima cosa da fare è verificare in /dev la presenza della dir '''net''' contenente il device virtuale '''tun'''. Se tutto ciò non ci fosse, crearlo con:
La prima cosa da fare è verificare in <code>/dev</code> la presenza della directory <code>'''net'''</code> contenente il device virtuale <code>'''tun'''</code>. Se tutto ciò non ci fosse, crearlo con:
<pre>
<pre>
# mkdir /dev/net && mknod /dev/net/tun c 10 200
# mkdir /dev/net && mknod /dev/net/tun c 10 200
Riga 27: Riga 27:
# echo "tun" >> /etc/modules
# echo "tun" >> /etc/modules
</pre>
</pre>
{{Box|Nota|La creazione del device virtuale '''/dev/net/tun''' permetterà sia a tun che a tap di funzionare e di poter essere richiamati dall'applicazione al momento della connessione (''modo dinamico'') ; ed è lo stesso device che permette ad Openvpn di crearsi quei device in modo permanente (''modo statico'').
{{Box|Nota|La creazione del device virtuale <code>'''/dev/net/tun'''</code> permetterà sia a tun che a tap di funzionare e di poter essere richiamati dall'applicazione al momento della connessione (''modo dinamico'') ; ed è lo stesso device che permette ad Openvpn di crearsi quei device in modo permanente (''modo statico'').
}}
}}


Riga 35: Riga 35:
</pre>
</pre>


== Openvpn & Iptables ==
===Openvpn & Iptables===
Diamo le opportune regole al firewall:
Diamo le opportune regole al firewall:
<pre>
<pre>
Riga 43: Riga 43:
</pre>
</pre>


=Generazione delle chiavi=
==Generazione delle chiavi==
Se non l'abbiamo già fatto:
Se non l'abbiamo già fatto:
<pre>
<pre>
Riga 54: Riga 54:
# openvpn --genkey --secret zmo.key
# openvpn --genkey --secret zmo.key
</pre>
</pre>
Una volta creata dovremmo poterla copiare nella stessa dir del client. Questo passaggio dovrebbe essere fatto nel più sicuro dei modi ad esempio tramite mail crittografate, o utilizzando scp (''dalla suite Openssh'').
Una volta creata dovremmo poterla copiare nella stessa directory del client. Questo passaggio dovrebbe essere fatto nel più sicuro dei modi ad esempio tramite mail crittografate, o utilizzando scp (''dalla suite Openssh'': vedi la guida [[OpenSSH: configurazione di base]]).
Utilizzando queste chiavi su tutti gli host (''crittografia simmetrica'') otteniamo una  notevole cifratura del nostro canale in maniera davvero rapida.
Utilizzando queste chiavi su tutti gli host (''crittografia simmetrica'') otteniamo una  notevole cifratura del nostro canale in maniera davvero rapida.


=Collegamento=
==Collegamento==
==Configurazione shared-keys==
===Configurazione shared-keys===
Spostiamoci sul server e creiamo in <code>/etc/openvpn</code> il file <code>server.conf</code> editandolo così:
Spostiamoci sul server e creiamo in <code>/etc/openvpn</code> il file <code>server.conf</code> editandolo così:
<pre>
<pre>
Riga 68: Riga 68:
</pre>
</pre>


;'''dev''': identifica il device utilizzato per il tunnel. I possibili device utilizzabili da openvpn sono tun e tap. La differenza tra i due device è fondamentale, in quanto tun si adopera per la trasmissione di pacchetti IP (''una specie di ppp'') e tap invece per la trasmissione di frame ethernet (''una specie di eth''). Per la creazione di lan virtuali o per la condivisione di risorse come file-server, ftp-server, dobbiamo usare tap.
;<code>'''dev'''</code>: identifica il device utilizzato per il tunnel. I possibili device utilizzabili da openvpn sono tun e tap. La differenza tra i due device è fondamentale, in quanto tun si adopera per la trasmissione di pacchetti IP (''una specie di ppp'') e tap invece per la trasmissione di frame ethernet (''una specie di eth''). Per la creazione di lan virtuali o per la condivisione di risorse come file-server, ftp-server, dobbiamo usare tap.
;'''port''': socket dell'applicazione, il default è la 5000, deve essere la stessa da ogni capo della vpn. È da sottolineare che sul server invece di ''port'' si scriverà '''lport''' (''local'') mentre sui client '''rport''' (''remote'').
;<code>'''port'''</code>: socket dell'applicazione, il default è la 5000, deve essere la stessa da ogni capo della vpn. È da sottolineare che sul server invece di <code>''port''</code> si scriverà <code>'''lport'''</code> (''local'') mentre sui client <code>'''rport'''</code> (''remote'').
;'''ifconfig''': determina l'IP dell'interfaccia virtuale (''tun o tap'').  
;<code>'''ifconfig'''</code>: determina l'IP dell'interfaccia virtuale (''tun o tap'').  
;'''secret''': a questa stringa diamo il path della key creata in precedenza con openvpn.
;<code>'''secret'''</code>: a questa stringa diamo il path della key creata in precedenza con openvpn.
;'''verb''': verb definisce il grado di verbose stampato a video in output durante l'esecuzione (''da 0 a 11 sono spiegati dando openvpn --help'').
;<code>'''verb'''</code>: verb definisce il grado di verbose stampato a video in output durante l'esecuzione (''da 0 a 11 sono spiegati dando <code>openvpn --help</code>'').


Adesso sul client creiamo il file '''/etc/openvpn/client.conf''' così:
Adesso sul client creiamo il file <code>'''/etc/openvpn/client.conf'''</code> così:
  <pre>
  <pre>
remote www.hostremoto.net (che ovviamente corrisponderà al server)
remote www.hostremoto.net (che ovviamente corrisponderà al server)
Riga 84: Riga 84:
</pre>
</pre>


;'''remote''': a remote diamo l'IP pubblico della macchina alla quale ci connetteremo, oppure l'hostname come nell'esempio.
;<code>'''remote'''</code>: a remote diamo l'IP pubblico della macchina alla quale ci connetteremo, oppure l'hostname come nell'esempio.


A questo punto lanciamo il collegamento su entrambe le macchine, indicando al programma di attenersi alle regole appena definite nei rispettivi server.conf e client.conf:
A questo punto lanciamo il collegamento su entrambe le macchine, indicando al programma di attenersi alle regole appena definite nei rispettivi <code>server.conf</code> e <code>client.conf</code>:
<pre>
<pre>
# openvpn --config /etc/openvpn/xxxx.conf
# openvpn --config /etc/openvpn/xxxx.conf
Riga 107: Riga 107:
           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
</pre>
</pre>
Nlla riga ''inet addr'' vengono indicati ip, broadcast e netmask.<br>
Nella riga <code>inet addr</code> vengono indicati ip, broadcast e netmask.<br>
Proviamo a pingare l'host che sappiamo connesso:
Proviamo a pingare l'host che sappiamo connesso:
<pre>
<pre>
Riga 117: Riga 117:
In questo modo disporremo rapidamente di un canale cifrato relativamente sicuro, per lo scambio di dati privati.
In questo modo disporremo rapidamente di un canale cifrato relativamente sicuro, per lo scambio di dati privati.


==Configurazione SSL/TLS==
===Configurazione SSL/TLS===
===Openvpn & Openssl===
====Openvpn & Openssl====
Adesso, avvalendoci di SSL/TLS, configureremo un CA (''Certificate Authority'') che servirà a firmare i certificati degli host e a rendere disponibile il proprio; creeremo le rispettive chiavi (''una anche per il CA stesso'') facendo in modo che ognuno detenga una chiave e un certificato firmato. Infine, per lo scambio sicuro di tali dati, creeremo un Diffie-Hellman.
Adesso, avvalendoci di SSL/TLS, configureremo un CA (''Certificate Authority'') che servirà a firmare i certificati degli host e a rendere disponibile il proprio; creeremo le rispettive chiavi (''una anche per il CA stesso'') facendo in modo che ognuno detenga una chiave e un certificato firmato. Infine, per lo scambio sicuro di tali dati, creeremo un Diffie-Hellman.
<pre>
<pre>
Riga 124: Riga 124:
</pre>
</pre>


===Configurazione CA===
====Configurazione CA====
Il CA risiederà sul server, ma distinguiamo le entità in questo modo:  
Il CA risiederà sul server, ma distinguiamo le entità in questo modo:  
CA – Server – Client0 – Client1...<br>
CA – Server – Client0 – Client1...<br>
Occupiamoci del CA; facciamogli generare una sua chiave (''ca.key''), una sua richiesta di certificato (''rich.ca''), facciamogliela autofirmare (''ca.cert'') e depositare successivamente su ogni host. Dunque, sempre sul server, torniamo in <code>/etc/openvpn</code>.
Occupiamoci del CA; facciamogli generare una sua chiave (<code>ca.key</code>), una sua richiesta di certificato (<code>rich.ca</code>), facciamogliela autofirmare (<code>ca.cert</code>) e depositare successivamente su ogni host. Dunque, sempre sul server, torniamo in <code>/etc/openvpn</code>.
   
   
<pre>
<pre>
Riga 154: Riga 154:
Getting Private key
Getting Private key
</pre>
</pre>
Ricapitolando dovremmo aver creato '''ca.key  rich.ca''' e '''ca.cert'''.
Ricapitolando dovremmo aver creato <code>'''ca.key  rich.ca'''</code> e <code>'''ca.cert'''</code>.


===TLS-Server & TLS-Client===
====TLS-Server & TLS-Client====
Occupiamoci ora di server e client, la loro configurazione è pressoché uguale.<br>
Occupiamoci ora di server e client, la loro configurazione è pressoché uguale.<br>
Sul server:
Sul server:
Riga 181: Riga 181:
Spediamo il certificato al CA (''che risiede sul server''), facciamocelo firmare e rispedire in <code>/etc/openvpn</code> (''stessa procedura del server per la firma'').
Spediamo il certificato al CA (''che risiede sul server''), facciamocelo firmare e rispedire in <code>/etc/openvpn</code> (''stessa procedura del server per la firma'').


'''Server.conf'''<br>
<code>'''Server.conf'''</code><br>
Compilare così il file per il server:
Compilare così il file per il server:
<pre>
<pre>
Riga 195: Riga 195:
</pre>
</pre>


'''Client.conf'''<br>
<code>'''Client.conf'''</code><br>
Compilare così il file per il client:
Compilare così il file per il client:
<pre>
<pre>
Riga 214: Riga 214:
</pre>
</pre>


=Demonizzare Openvpn=
==Demonizzare Openvpn==
==Lo script /etc/init.d/openvpn==
===Lo script <code>/etc/init.d/openvpn</code>===
Questo script, che demonizza openvpn, una volta lanciato va a cercare nella dir <code>/etc/openvpn</code> il file con estensione '''.conf''' che dovrà corrispondere al file di configurazione. Dico questo poiché in varie documentazioni lo troverete con estensioni diverse (''es: .ovpn etc..'') che lo script non riconoscerebbe come valido.  
Questo script, che demonizza openvpn, una volta lanciato va a cercare nella dir <code>/etc/openvpn</code> il file con estensione <code>'''.conf'''</code> che dovrà corrispondere al file di configurazione. Dico questo poiché in varie documentazioni lo troverete con estensioni diverse (''es: .ovpn etc..'') che lo script non riconoscerebbe come valido.  
<pre>
<pre>
# /etc/init.d/openvpn start
# /etc/init.d/openvpn start
Riga 229: Riga 229:
</pre>
</pre>


==Openvpn & log==
===Openvpn & log===
Per loggare l'output in un file qualunque (''anche se non esiste verrà creato'') aggiungere la riga al file .conf:
Per loggare l'output in un file qualunque (''anche se non esiste verrà creato'') aggiungere la riga al file <code>.conf</code>:
<pre>
<pre>
log /var/log/openvpn.log
log /var/log/openvpn.log
</pre>
</pre>
Il file di log sarà più o meno forbito in base al valore che avremo dato al parametro '''verb'''.
Il file di log sarà più o meno forbito in base al valore che avremo dato al parametro <code>'''verb'''</code>.


=Conclusioni=
==Conclusioni==
[http://www.openvpn.net Openvpn] permette la creazione di vpn da applicativo ad applicativo, non necessitando quindi di modifiche nel kernel come nel caso di vpn che implementino IPSEC. Gira su le principali piattaforme allacciando quindi OS diversi.Anche se lo standard IPSEC è una realtà nei dispositivi di rete hardware, il livello di sicurezza che openvpn può raggiungere è indiscutibile.
[http://www.openvpn.net Openvpn] permette la creazione di vpn da applicativo ad applicativo, non necessitando quindi di modifiche nel kernel come nel caso di vpn che implementino IPSEC. Gira su le principali piattaforme allacciando quindi OS diversi.Anche se lo standard IPSEC è una realtà nei dispositivi di rete hardware, il livello di sicurezza che openvpn può raggiungere è indiscutibile.
==Riferimenti:==
===Riferimenti:===
[http://openvpn.net Openvpn.net]<br>
[http://openvpn.net Openvpn.net]<br>
[http://www.openssl.org www.openssl.org]<br>
[http://www.openssl.org www.openssl.org]<br>
1 508

contributi