6 999
contributi
Wtf (discussione | contributi) |
S3v (discussione | contributi) (collegamenti esterni e modifiche minori) |
||
Riga 1: | Riga 1: | ||
{{Versioni compatibili}} | {{Versioni compatibili}} | ||
== 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.<br/> | ||
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 28: | Riga 28: | ||
# echo "tun" >> /etc/modules | # echo "tun" >> /etc/modules | ||
</pre> | </pre> | ||
{{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''). | {{Box|Nota|La creazione del device virtuale <code>'''/dev/net/tun'''</code> permetterà sia a <code>tun</code> che a <code>tap</code> 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 44: | Riga 44: | ||
</pre> | </pre> | ||
==Generazione delle chiavi== | == Generazione delle chiavi == | ||
Se non l'abbiamo già fatto: | Se non l'abbiamo già fatto: | ||
<pre> | <pre> | ||
Riga 50: | Riga 50: | ||
</pre> | </pre> | ||
Effettuiamo il collegamento fra due macchine, una chiamata in maniera molto originale '''server''' e una '''client'''. <br>Queste due macchine sono di due diversi utenti che possono risiedere ovunque nel mondo. La macchina server | Effettuiamo il collegamento fra due macchine, una chiamata in maniera molto originale '''server''' e una '''client'''. <br> | ||
Queste due macchine sono di due diversi utenti che possono risiedere ovunque nel mondo. La macchina server sarà quella in ascolto.<br> | |||
Spostiamoci sul server, esattamente in <code>/etc/openvpn</code> e creiamo la nostra chiave con: | Spostiamoci sul server, esattamente in <code>/etc/openvpn</code> e creiamo la nostra chiave con: | ||
<pre> | <pre> | ||
# openvpn --genkey --secret zmo.key | # openvpn --genkey --secret zmo.key | ||
</pre> | </pre> | ||
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: file di configurazione]]). | 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 <code>scp</code> (''dalla suite Openssh'': vedi la guida [[OpenSSH: file di configurazione]]).<br> | ||
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 69: | Riga 70: | ||
</pre> | </pre> | ||
;<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 | ;<code>'''dev'''</code>: identifica il device utilizzato per il tunnel. I possibili device utilizzabili da openvpn sono <code>tun</code> e <code>tap</code>. La differenza tra i due device è fondamentale, in quanto <code>tun</code> si adopera per la trasmissione di pacchetti IP (''una specie di <code>ppp</code>'') e <code>tap</code> invece per la trasmissione di frame ethernet (''una specie di <code>eth</code>''). Per la creazione di LAN virtuali o per la condivisione di risorse come file-server, ftp-server, dobbiamo usare <code>tap</code>. | ||
;<code>'''port'''</code>: socket dell'applicazione, il default è la 5000, deve essere la stessa da ogni capo della | ;<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''). | ||
;<code>'''ifconfig'''</code>: determina l'IP dell'interfaccia virtuale (''tun o tap''). | ;<code>'''ifconfig'''</code>: determina l'IP dell'interfaccia virtuale (''<code>tun</code> o <code>tap</code>''). | ||
;<code>'''secret'''</code>: 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. | ||
;<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>''). | ;<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 <code>'''/etc/openvpn/client.conf'''</code> così: | Adesso sul client creiamo il file <code>'''/etc/openvpn/client.conf'''</code> così: | ||
<pre> | |||
remote www.hostremoto.net (che ovviamente corrisponderà al server) | remote www.hostremoto.net (che ovviamente corrisponderà al server) | ||
dev tap | dev tap | ||
Riga 108: | Riga 109: | ||
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> | ||
Nella riga <code>inet addr</code> vengono indicati | 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 115: | Riga 116: | ||
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=258 ms | 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=258 ms | ||
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=135 ms | 64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=135 ms | ||
</pre> | |||
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 125: | Riga 126: | ||
</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> | ||
Riga 157: | Riga 158: | ||
Ricapitolando dovremmo aver creato <code>'''ca.key rich.ca'''</code> e <code>'''ca.cert'''</code>. | 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 172: | Riga 173: | ||
# openssl dhparam -out dh.pem 1024 | # openssl dhparam -out dh.pem 1024 | ||
</pre> | </pre> | ||
{{Box|Nota|Il format di default adottato da dhparam è PEM (''adozione standard di Unix''). Per una ulteriore consultazione del flag dhparam, fare riferimento a questa pagina: [ | {{Box|Nota|Il format di default adottato da <code>dhparam</code> è PEM (''adozione standard di Unix''). Per una ulteriore consultazione del flag <code>dhparam</code>, fare riferimento a questa pagina: Openssl dhparam<sup>[[#Riferimenti|[1]]]</sup> | ||
}} | }} | ||
Riga 210: | Riga 211: | ||
</pre> | </pre> | ||
Una volta compilati i file, lanciamo openvpn su entrambe le macchine come in precedenza: | Una volta compilati i file, lanciamo <code>openvpn</code> su entrambe le macchine come in precedenza: | ||
<pre> | <pre> | ||
openvpn –config xxxx.conf | openvpn –config xxxx.conf | ||
</pre> | </pre> | ||
==Demonizzare Openvpn== | == Demonizzare Openvpn == | ||
===Lo script <code>/etc/init.d/openvpn</code>=== | === 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 <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. | Questo script, che demonizza <code>openvpn</code>, 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 | ||
</pre> | </pre> | ||
Una volta avviato lo script attiverà il demone. Per impostarlo al boot: | Una volta avviato lo script attiverà il [[demone]]. Per impostarlo al boot: | ||
<pre> | <pre> | ||
# update-rc.d openvpn defaults | # update-rc.d openvpn defaults | ||
Riga 230: | Riga 231: | ||
</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 <code>.conf</code>: | Per loggare l'output in un file qualunque (''anche se non esiste verrà creato'') aggiungere la riga al file <code>.conf</code>: | ||
<pre> | <pre> | ||
Riga 237: | Riga 238: | ||
Il file di log sarà più o meno forbito in base al valore che avremo dato al parametro <code>'''verb'''</code>. | Il file di log sarà più o meno forbito in base al valore che avremo dato al parametro <code>'''verb'''</code>. | ||
==Conclusioni== | == Conclusioni == | ||
[ | Openvpn<sup>[[#Riferimenti|[2]]]</sup> 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 sulle principali piattaforme allacciando quindi OS diversi. Anche se lo standard IPSEC è una realtà nei dispositivi di rete hardware, il livello di sicurezza che <code>openvpn</code> può raggiungere è indiscutibile. | ||
[http://openvpn.net Openvpn.net]<br> | == Riferimenti == | ||
[1] [http://www.mkssoftware.com/docs/man1/openssl_dhparam.1.asp OpenSSL dhparam]<br/> | |||
[2] [http://openvpn.net Openvpn.net]<br> | |||
[http://www.openssl.org www.openssl.org]<br> | [http://www.openssl.org www.openssl.org]<br> | ||
[http://milano.linux.it/contributi/ValentinoSquilloni.pdf Openvpn e reti private virtuali]<br> | <!-- [http://milano.linux.it/contributi/ValentinoSquilloni.pdf Openvpn e reti private virtuali]<br> | ||
[http:// | LINK ROTTO E AL MOMENTO IRRINTRACCIABILE --> | ||
[http://a2.pluto.it/a2/a263.htm#almltitle2684 Appunti Linux] | |||
{{Autori | {{Autori | ||
|Autore = [[Utente:Zmo.zmo|zmo]] | |Autore = [[Utente:Zmo.zmo|zmo]] | ||
}} | }} | ||
[[Categoria:VPN]] | [[Categoria:VPN]] |
contributi