# OpenVPN

OpenVPN è un programma VPN open source scritto da James Yonan e rilasciato con licenza GPL. È usato per creare tunnel crittografati punto-punto sicuri fra due computer attraverso una rete non sicura, ad esempio Internet. Permette agli host di autenticarsi l'uno con l'altro per mezzo di chiavi private condivise, certificati digitali o credenziali utente/password. Usa le librerie di cifratura OpenSSL e il protocollo SSLv3/TLSv1. È disponibile su una vasta gamma di piattaforme come GNU/Linux, xBSD, macOS, Solaris, Android e Windows. L'intero programma è contenuto in un singolo file eseguibile che può funzionare sia in modalità server che client, da un file di configurazione opzionale e da uno o più file contenenti le chiavi, in funzione del metodo di autenticazione usato.

## Crittografia

OpenVPN usa le librerie OpenSSL per la cifratura sia del canale dati che del canale di controllo. Fa eseguire a OpenSSL tutto il lavoro di cifratura e autenticazione, permettendo a OpenVPN di scegliere fra tutti gli algoritmi di cifratura disponibili nel pacchetto OpenSSL. Il supporto per mbed TLS è disponibile a partire dalla versione 2.3. Può usare l'accelerazione hardware per avere migliori prestazioni nella cifratura.

## Autenticazione

OpenVPN permette ai computer diversi metodi di autenticarsi l'uno con l'altro:
* chiave segreta condivisa
* certificati digitali
* credenziali utente/password.
Il metodo con chiave segreta condivisa è il più semplice ed immediato da implementare, quello basato sui certificati è il più robusto e versatile ma richiede la definizione di una Public Key Infrastructure (PKI). L'autenticazione con utente/password è una caratteristica nuova introdotta con la versione 2.0 e si può usare con o senza il certificato del client (il server deve comunque avere il proprio certificato). Il pacchetto tar del codice sorgente include uno script perl per verificare le credenziali utente/password per mezzo dei moduli PAM e dei plugin in C auth-pam.

## Rete

OpenVPN concentra tutto il traffico dati e di controllo su una singola porta. Può usare una porta UDP (preferita e predefinita) oppure TCP. A differenza di altri programmi o protocolli VPN, come LP2P o PPTP, non richiede altri protocolli per gestire autenticazione o dati, cosa che gli permette di funzionare attraverso la maggior parte dei server proxy (HTTP incluso), evitare limiti e blocchi imposti dall'ISP e semplificare molto l'integrazione con i NAT. Il server può "inviare" alcune opzioni di configurazione di rete ai client. Fra queste, l'indirizzo IP, gli instradamenti, e alcune opzioni di connessione.
OpenVPN offre due tipi di interfaccia di rete avvalendosi del driver Universal TUN/TAP; può creare sia tunnel IP punto-punto al livello 3 dello stack OSI (configurazione routing), come anche interfacce Ethernet virtuali "tap" a livello 2 sulle quali veicolare l'intero traffico Ethernet, broadcast inclusi (configurazione bridging). OpenVPN può anche usare, come opzione, la libreria di compressione LZO per comprimere il flusso di dati.
IANA ha assegnato ufficialmente la porta 1194 a OpenVPN, e le versioni più recenti del programma ora la usano come predefinita. La versione 2.0 permette ad un processo di gestire più tunnel contemporanei, superando la restrizione di "un tunnel per processo" della serie 1.x.
Sebbene OpenVPN possa funzionare utilizzando il protocollo TCP, il suo uso richiede una connessione tra client e server con buona stabilità, banda passante e latenza, al fine di garantire che le connessioni TCP tunnellizzate non vadano in timeout. In caso contrario le prestazioni degradano molto, questo è noto come il “TCP meltdown problem”.

## Estensibilità e piattaforme di utilizzo
### Estensibilità

OpenVPN può essere esteso con plugins di terze parti o scripts, che possono essere chiamati a punti di ingresso definiti. Lo scopo di questo è spesso quello di estendere OpenVPN con logging più avanzati, migliorare l’autenticazione di username e password, rendere più veloce l’aggiornamento dei firewall e così via. I plugins sono moduli caricabili velocemente, solitamente scritti in linguaggio C, mentre gli scripts interface possono eseguire qualsiasi script. Nel codice sorgente di OpenVPN ci sono alcuni esempi di questi plugins, incluso un plugin di autenticazione (PAM). Molti plugin esistono anche per autenticare contro database LDAP o SQL tra i quali SQLite e MYSQL.

## Sicurezza

OpenVPN offre diverse caratteristiche di sicurezza interne: può rilasciare i privilegi di root (non disponibile su Microsoft Windows), può usare mlockall per evitare che dati sensibili siano paginati nella memoria virtuale su disco, e può essere costretto ad una chroot jail (non disponibile su Microsoft Windows) dopo l'inizializzazione.
Inoltre è disponibile anche la funzione di autenticazione di singolo pacchetto HMAC per aggiungere un ulteriore livello di sicurezza alla fase in cui viene instaurata la connessione (definito "HMAC Firewall" dall'autore); in questo caso ogni pacchetto che non presentasse la firma HMAC prestabilita verrebbe semplicemente scartato senza essere elaborato, il che permette di difendere l'host da:
* attacchi di tipo DoS (Denial of Service)
* tentativi di Port scanning
* vulnerabilità di buffer overflow nelle librerie SSL/TLS
* richieste di connessione da macchine non autorizzate.
Infine, configurando i client per accettare solo certificati di tipo server dalla macchina che richiede una connessione, può evitare attacchi del genere Man in the middle.

## Implementazioni del firmware e del software
### Implementazioni del firmware

OpenVPN è stato integrato in firmware packages del router come Vyatta, pfSense, DD-WRT, OpenWrt e Tomato, permettendo così agli utenti di passare OpenVPN nella modalità client o server a partire dai loro routers di rete. Un router che fa funzionare OpenVPN nella modalità client ad esempio, permette ad ogni dispositivo su una rete di accedere a VPN senza necessitare l’esigenza di installare OpenVPN. È stato implementato in alcuni router del produttore come il D-Link DSR 250 ed alcuni MikroTik Routers. L’implementazione di MikroTik non supporta il protocollo UDP o la compressione LZO, la quale limita la velocità di trasferimento raggiungibile. MikroTik ha detto nel 2010 che non avrebbe continuato a sviluppare OpenVPN, bensì SSTP.

### Implementazioni del software

OpenVPN è stato integrato a SoftEther VPN, un protocollo multiplo VPN server open-source, per consentire agli utenti di connettersi al server VPN a partire da clients OpenVPN già esistenti.
Di seguito una lista di software che utilizza OpenVPN.
| Firmware Package | Licenza | Sviluppatore | Link |
| DD-WRT | Gratuita | NewMedia-NET GmbH | dd-wrt.com |
| IPFire | Gratuita | Community driven development | ipfire.org |
| OpenWRT | Gratuita | Community driven development | OpenWRT.org |
| pfSense | Gratuita | Rubicon Communications, LLC (Netgate) | pfsense.org |
| Untangle | Gratuita | Untangle, Inc. | Untangle.com |
| Tomato | Gratuita | Keith Moyer | tomatovpn.keithmoyer.com |

## Edizioni

OpenVPN è disponibile in due versioni:
* L’edizione OpenVPN community che è una versione gratuita open-source.
* Il server di accesso di OpenVPN (OpenVPN-AS) è basata sulla Community Edition, ma prevede un costo aggiuntivo e caratteristiche come l’integrazione LDAP, il server SMB, Web UI management e fornisce un set di installazione e strumenti di configurazione che sono riportati per semplificare il rapido impiego di una soluzione di accesso VPN remota. L’edizione Access Server dipende fortemente da iptables per il bilanciamento del carico, ad esempio. Per questo motivo non è mai stata disponibile per Windows. Questa versione è anche in grado di creare rapidamente client (“OpenVPN Connect”) installers, che includono un profilo client per connettersi ad un particolare Server di accesso. Tuttavia, l’utente non ha bisogno di possedere un Access Server client per connettersi al Server di accesso.