
Configura il tuo server OpenVPN su Debian, Ubuntu, Fedora, CentOS, Arch Linux e altro ancora.
Installatore OpenVPN per Debian, Ubuntu, Fedora, openSUSE, CentOS, Amazon Linux, Arch Linux, Oracle Linux, Rocky Linux e AlmaLinux.
Questo script ti permetterà di configurare e gestire il tuo server VPN sicuro in pochi secondi.
Questo script è pensato per essere eseguito sul tuo server, che sia un VPS, un server dedicato o anche un computer a casa.
Una volta configurato, potrai generare file di configurazione client per ogni dispositivo che desideri connettere.
Ogni client potrà instradare il proprio traffico internet attraverso il server, completamente crittografato.```mermaid graph LR A[Phone] -->|Encrypted| VPN B[Laptop] -->|Encrypted| VPN C[Computer] -->|Encrypted| VPN
VPN[OpenVPN Server]
VPN --> I[Internet]
## Perché OpenVPN?
OpenVPN era lo standard de facto per le VPN open-source quando questo script è stato creato. WireGuard è arrivato dopo ed è più semplice e veloce per la maggior parte dei casi d'uso. Dai un'occhiata a [wireguard-install](https://github.com/angristan/wireguard-install).
Detto questo, OpenVPN ha ancora senso quando hai bisogno di:
- **Supporto TCP**: funziona in ambienti restrittivi dove UDP è bloccato (reti aziendali, aeroporti, hotel, ecc.)
- **Chiavi private protette da password**: le configurazioni WireGuard memorizzano la chiave privata in testo semplice
- **Compatibilità legacy**: esistono client per praticamente ogni piattaforma, inclusi sistemi più vecchi
## Caratteristiche
- Installa e configura un server OpenVPN pronto all'uso
- Interfaccia CLI per automazione e scripting (modalità non interattiva con output JSON)
- Rinnovo dei certificati sia per il client che per il server
- Elenca e monitora i client connessi
- Disconnessione immediata del client alla revoca del certificato (tramite interfaccia di gestione)
- Utilizza i [repository ufficiali OpenVPN](https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos) quando possibile per le ultime versioni stabili
- Regole del firewall e forwarding gestiti senza problemi (supporto nativo per firewalld e nftables, fallback iptables)
- Sottoreti VPN configurabili (IPv4: default `10.8.0.0/24`, IPv6: default `fd42:42:42:42::/112`)
- MTU del tunnel configurabile (default: `1500`)
- Se necessario, lo script può rimuovere pulitamente OpenVPN, inclusa la configurazione e le regole del firewall
- Impostazioni di crittografia personalizzabili, impostazioni predefinite migliorate (vedi [Sicurezza e Crittografia](#security-and-encryption) sotto)
- Utilizza le ultime funzionalità di OpenVPN quando disponibili (vedi [Sicurezza e Crittografia](#security-and-encryption) sotto)
- Varietà di resolver DNS da inviare ai client
- Scelta di utilizzare un resolver self-hosted con Unbound (supporta installazioni Unbound già esistenti)
- Scelta tra TCP e UDP
- Supporto flessibile IPv4/IPv6:
- Endpoint server IPv4 o IPv6 (come i client si connettono)
- Client solo IPv4, solo IPv6 o dual-stack (indirizzamento VPN e accesso a Internet)
- Tutte le combinazioni supportate: 4→4, 4→4/6, 4→6, 6→4, 6→6, 6→4/6
- Prevenzione automatica delle perdite: blocca il protocollo indesiderato in modalità single-stack
- Modalità non privilegiata: esegue come `nobody`/`nogroup`
- Blocca le perdite DNS su Windows 10
- Nome del certificato del server randomizzato
- Scelta di proteggere i client con una password (crittografia della chiave privata)
- Opzione per permettere a più dispositivi di utilizzare lo stesso profilo client simultaneamente (disabilita indirizzi IP persistenti)
- **Autenticazione tramite impronta digitale del peer** (OpenVPN 2.6+): Autenticazione semplificata simile a WireGuard senza una CA
- Molte altre piccole cose!
## Compatibilità
Lo script supporta queste distribuzioni Linux:
| | Supporto |
| ------------------- | ------- |
| AlmaLinux >= 8 | ✅ 🤖 |
| Amazon Linux 2023 | ✅ 🤖 |
| Arch Linux | ✅ 🤖 |
| CentOS Stream >= 8 | ✅ 🤖 |
| Debian >= 11 | ✅ 🤖 |
| Fedora >= 40 | ✅ 🤖 |
| openSUSE Leap >= 16 | ✅ 🤖 |
| openSUSE Tumbleweed | ✅ 🤖 |
| Oracle Linux >= 8 | ✅ 🤖 |
| Rocky Linux >= 8 | ✅ 🤖 |
| Ubuntu >= 18.04 | ✅ 🤖 |
Da notare:
- Lo script è regolarmente testato solo sulle distribuzioni contrassegnate con 🤖.
- È testato solo su architettura `amd64`.
- Lo script richiede `systemd`.
### Fornitori consigliati
- [Vultr](https://umami.stanislas.cloud/q/1HH9Thp8i): Località in tutto il mondo, supporto IPv6, a partire da \$2.5/mese
- [Hetzner](https://umami.stanislas.cloud/q/HdzaOJWq7): Località in tutto il mondo, IPv6, 20 TB di traffico, a partire da €3.59/mese
- [Digital Ocean](https://umami.stanislas.cloud/q/sEVh1l79B): Località in tutto il mondo, supporto IPv6, a partire da \$4/mese
## Utilizzo
Per prima cosa, scarica lo script sul tuo server e rendilo eseguibile:```bash
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
Devi eseguire lo script come root e avere il modulo TUN abilitato.
Il modo più semplice per iniziare è il menu interattivo:```bash ./openvpn-install.sh interactive
Questo ti guiderà attraverso l'installazione e la gestione dei client.
Nella tua home directory, avrai file `.ovpn`. Questi sono i file di configurazione del client. Scaricali dal tuo server (usando `scp` per esempio) e connettiti utilizzando il tuo client OpenVPN preferito.
Se hai domande, consulta prima le [FAQ](#faq). E se hai bisogno di aiuto, puoi aprire una [discussione](https://github.com/angristan/openvpn-install/discussions). Per favore, cerca prima tra gli issue e le discussioni esistenti.
### Modalità CLI
> [!WARNING]
> La compatibilità delle API non è garantita. Potrebbero verificarsi modifiche sostanziali tra le versioni. Se si utilizza questo script in modo programmatico (ad esempio, in automazione o CI/CD), bloccare un commit specifico anziché utilizzare il branch master.
Per automazione e scripting, usa l'interfaccia CLI:```bash
# Install with defaults
./openvpn-install.sh install
# Add a client
./openvpn-install.sh client add alice
# List clients
./openvpn-install.sh client list
# Revoke a client (immediately disconnects if connected)
./openvpn-install.sh client revoke alice
openvpn-install [options]
Commands: install Install and configure OpenVPN server uninstall Remove OpenVPN server client Manage client certificates server Server management interactive Launch interactive menu
Global Options: --verbose Show detailed output --log Log file path (default: openvpn-install.log) --no-log Disable file logging --no-color Disable colored output -h, --help Show help
Esegui `./openvpn-install.sh <command> --help` per le opzioni specifiche del comando.
#### Gestione client```bash
# Add a new client
./openvpn-install.sh client add alice
# Add a password-protected client
./openvpn-install.sh client add bob --password
# Revoke a client
./openvpn-install.sh client revoke alice
# Renew a client certificate
./openvpn-install.sh client renew bob --cert-days 365
Elenca tutti i clienti:```text $ ./openvpn-install.sh client list ══ Client Certificates ══ [INFO] Found 3 client certificate(s)
Name Status Expiry Remaining
alice Valid 2035-01-15 3650 days bob Valid 2035-01-15 3650 days charlie Revoked 2035-01-15 unknown
Output JSON per scripting:
```json```text
$ ./openvpn-install.sh client list --format json | jq
{
"clients": [
{
"name": "alice",
"status": "valid",
"expiry": "2035-01-15",
"days_remaining": 3650
},
{
"name": "bob",
"status": "valid",
"expiry": "2035-01-15",
"days_remaining": 3650
},
{
"name": "charlie",
"status": "revoked",
"expiry": "2035-01-15",
"days_remaining": null
}
]
}
./openvpn-install.sh server renew
./openvpn-install.sh uninstall
Mostra i client connessi (i dati si aggiornano ogni 60 secondi):```text
$ ./openvpn-install.sh server status
══ Connected Clients ══
[INFO] Found 2 connected client(s)
Name Real Address VPN IP Connected Since Transfer
---- ------------ ------ --------------- --------
alice 203.0.113.45:52341 10.8.0.2 2025-01-15 14:32 ↓1.2M ↑500K
bob 198.51.100.22:41892 10.8.0.3 2025-01-15 09:15 ↓800K ↑200K
[INFO] Note: Data refreshes every 60 seconds.
Il comando install supporta molte opzioni per la personalizzazione:```bash
./openvpn-install.sh install --port 443 --protocol tcp
./openvpn-install.sh install --dns quad9
./openvpn-install.sh install --cipher AES-256-GCM --cert-type rsa --rsa-bits 4096
./openvpn-install.sh install --subnet-ipv4 10.9.0.0
./openvpn-install.sh install --client-ipv4 --client-ipv6
./openvpn-install.sh install --no-client-ipv4 --client-ipv6
./openvpn-install.sh install --endpoint-type 6 --endpoint 2001:db8::1
./openvpn-install.sh install --client-ipv6 --subnet-ipv6 fd00🔢5678::
./openvpn-install.sh install --no-client
./openvpn-install.sh install
--port 443
--protocol tcp
--dns cloudflare
--cipher AES-256-GCM
--client mydevice
--client-cert-days 365
**Network Options:**
- `--endpoint <host>` - IP pubblico o hostname per i client (default: rilevamento automatico)
- `--endpoint-type <4|6>` - Versione IP dell'endpoint (default: `4`)
- `--ip <addr>` - IP di ascolto del server (default: rilevamento automatico)
- `--client-ipv4` - Abilita IPv4 per i client VPN (default: abilitato)
- `--no-client-ipv4` - Disabilita IPv4 per i client VPN
- `--client-ipv6` - Abilita IPv6 per i client VPN (default: disabilitato)
- `--no-client-ipv6` - Disabilita IPv6 per i client VPN
- `--subnet-ipv4 <x.x.x.0>` - Sottorete VPN IPv4 (default: `10.8.0.0`)
- `--subnet-ipv6 <prefix>` - Sottorete VPN IPv6 (default: `fd42:42:42:42::`)
- `--port <num>` - Porta OpenVPN (default: `1194`)
- `--port-random` - Usa una porta casuale (49152-65535)
- `--protocol <udp|tcp>` - Protocollo (default: `udp`)
- `--mtu <size>` - MTU del tunnel (default: `1500`)
**DNS Options:**
- `--dns <provider>` - Provider DNS (default: `cloudflare`). Opzioni: `system`, `unbound`, `cloudflare`, `quad9`, `quad9-uncensored`, `fdn`, `dnswatch`, `opendns`, `google`, `yandex`, `adguard`, `nextdns`, `custom`
- `--dns-primary <ip>` - DNS primario personalizzato (richiede `--dns custom`)
- `--dns-secondary <ip>` - DNS secondario personalizzato (richiede `--dns custom`)
**Security Options:**
- `--cipher <cipher>` - Cifrario dei dati (default: `AES-128-GCM`). Opzioni: `AES-128-GCM`, `AES-192-GCM`, `AES-256-GCM`, `AES-128-CBC`, `AES-192-CBC`, `AES-256-CBC`, `CHACHA20-POLY1305`
- `--cert-type <ecdsa|rsa>` - Tipo di certificato (default: `ecdsa`)
- `--cert-curve <curve>` - Curva ECDSA (default: `prime256v1`). Opzioni: `prime256v1`, `secp384r1`, `secp521r1`
- `--rsa-bits <2048|3072|4096>` - Dimensione chiave RSA (default: `2048`)
- `--hmac <alg>` - Algoritmo HMAC (default: `SHA256`). Opzioni: `SHA256`, `SHA384`, `SHA512`
- `--tls-sig <mode>` - Modalità TLS (default: `crypt-v2`). Opzioni: `crypt-v2`, `crypt`, `auth`
- `--auth-mode <mode>` - Modalità di autenticazione (default: `pki`). Opzioni: `pki` (basato su CA), `fingerprint` (impronta del peer, richiede OpenVPN 2.6+)
- `--tls-version-min <1.2|1.3>` - Versione minima TLS (default: `1.2`)
- `--tls-ciphersuites <list>` - Suite di cifratura TLS 1.3, separate da due punti (default: `TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256`)
- `--tls-groups <list>` - Gruppi di scambio chiave, separati da due punti (default: `X25519:prime256v1:secp384r1:secp521r1`)
- `--server-cert-days <n>` - Validità del certificato server in giorni (default: `3650`)
**Client Options:**
- `--client <name>` - Nome iniziale del client (default: `client`)
- `--client-password [pass]` - Proteggi la chiave del client con password (default: nessuna password)
- `--client-cert-days <n>` - Validità del certificato client in giorni (default: `3650`)
- `--no-client` - Salta la creazione iniziale del client
**Other Options:**
- `--multi-client` - Permetti lo stesso certificato su più dispositivi (default: disabilitato)
#### Esempi di automazione
**Creazione batch di client:**```bash
#!/bin/bash
for user in alice bob charlie; do
./openvpn-install.sh client add "$user"
done
Crea client da un file:```bash #!/bin/bash while read -r user; do ./openvpn-install.sh client add "$user" done < users.txt
**Output JSON per lo scripting:**```bash
# Get client list as JSON
./openvpn-install.sh client list --format json | jq '.clients[] | select(.status == "valid")'
# Get connected clients as JSON
./openvpn-install.sh server status --format json
Questo script è basato sull'ottimo lavoro di Nyr e dei suoi contributori.
Dal 2016, i due script hanno preso direzioni diverse e non sono più simili, specialmente internamente. L'obiettivo principale dello script era una sicurezza potenziata. Ma da allora, lo script è stato completamente riscritto e sono state aggiunte molte funzionalità. Lo script è comunque compatibile solo con distribuzioni recenti, quindi se hai bisogno di utilizzare un server o client molto vecchio, ti consiglio di usare lo script di Nyr.
Altre domande e risposte in FAQ.md.
D: Quale provider consigli?
R: Consiglio questi:
D: Quale client OpenVPN consigli?
R: Se possibile, un client OpenVPN 2.4 ufficiale.
openvpn dalla tua distribuzione. Esiste un repository APT ufficiale per distribuzioni basate su Debian/Ubuntu.D: Sono al sicuro dalla NSA usando il tuo script?
R: Per favore, esamina i tuoi modelli di minaccia. Anche se questo script tiene conto della sicurezza e utilizza crittografia all'avanguardia, non dovresti usare una VPN se vuoi nasconderti dalla NSA.
D: Esiste una documentazione di OpenVPN?
R: Sì, consulta il Manuale OpenVPN, che elenca tutte le opzioni.
Altre domande e risposte in FAQ.md.
Per favore apri una issue prima di inviare una PR se vuoi discutere una modifica, specialmente se è grande.
[!NOTE] Questo script è stato creato nel 2016 quando le impostazioni predefinite di OpenVPN erano piuttosto deboli. Allora, personalizzare le impostazioni di crittografia era essenziale per una configurazione sicura. Da allora, OpenVPN ha migliorato significativamente le sue impostazioni predefinite, ma lo script offre ancora opzioni di personalizzazione.
OpenVPN 2.3 e precedenti erano forniti con impostazioni predefinite obsolete come Blowfish (BF-CBC), TLS 1.0 e SHA1. Ogni versione principale successiva ha portato miglioramenti significativi:
--peer-fingerprint per configurazioni senza PKI e accelerazione kernel DCOSe vuoi maggiori informazioni su un'opzione menzionata di seguito, consulta il manuale OpenVPN. È molto completo.
La gestione dei certificati e della PKI è gestita da Easy-RSA. I parametri predefiniti sono nel file vars.example.
Questo script supportava in precedenza gli algoritmi di compressione LZ4 e LZO, ma ne sconsigliava l'uso a causa della vulnerabilità VORACLE attack.
OpenVPN 2.6+ imposta --allow-compression su no per impostazione predefinita, bloccando anche la compressione inviata dal server. Ora che OpenVPN sta rimuovendo completamente il supporto alla compressione, questo script non la supporta più.
[!NOTE] OpenVPN 2.6+ utilizza TLS 1.2 minimo per impostazione predefinita. Le versioni precedenti accettavano TLS 1.0 per impostazione predefinita.
OpenVPN 2.5 e versioni precedenti accettavano TLS 1.0 per impostazione predefinita, che ha quasi 20 anni.
Questo script imposta tls-version-min 1.2 come predefinito per la compatibilità con tutti i client OpenVPN 2.4+. Puoi opzionalmente impostare tls-version-min 1.3 per ambienti in cui tutti i client supportano TLS 1.3.
Il supporto TLS 1.3 è stato aggiunto in OpenVPN 2.5 e richiede OpenSSL 1.1.1+. TLS 1.3 offre maggiore sicurezza e prestazioni con un handshake semplificato.
Lo script configura le suite di cifratura TLS 1.3 tramite --tls-ciphersuites (separato dall'opzione TLS 1.2 --tls-cipher). Le suite di cifratura TLS 1.3 predefinite sono:
TLS_AES_256_GCM_SHA384TLS_AES_128_GCM_SHA256TLS_CHACHA20_POLY1305_SHA256TLS 1.2 è supportato da OpenVPN 2.3.3. TLS 1.3 è supportato da OpenVPN 2.5.
OpenVPN utilizza un certificato RSA con una chiave a 2048 bit per impostazione predefinita.
OpenVPN 2.4 ha aggiunto il supporto per ECDSA. La crittografia a curve ellittiche è più veloce, più leggera e più sicura.
Questo script fornisce:
prime256v1/secp384r1/secp521r12048/3072/4096 bitDi default sceglie ECDSA con prime256v1.
OpenVPN utilizza SHA-256 come hash di firma per impostazione predefinita, e così fa lo script. Al momento non offre altre scelte.
Lo script supporta due modalità di autenticazione:
Autenticazione tradizionale basata su Autorità di Certificazione (CA). Il server e tutti i client hanno certificati firmati dalla stessa CA. La revoca dei client è gestita tramite Liste di Revoca dei Certificati (CRL).
Questa è la modalità consigliata per distribuzioni più grandi dove hai bisogno di:
Un modello di autenticazione semplificato simile a WireGuard che utilizza impronte digitali SHA256 dei certificati invece di una catena di CA. Ogni peer (server e client) ha un certificato auto-firmato e i peer si autenticano reciprocamente verificando le impronte digitali.```bash
./openvpn-install.sh install --auth-mode fingerprint
Vantaggi:
- Configurazione più semplice: nessuna infrastruttura CA necessaria
- Più facile da capire: simile al modello `known_hosts` di SSH
- Ideale per configurazioni piccole: reti domestiche, laboratori, team ridotti
Come funziona:
1. Il server genera un certificato auto-firmato e memorizza la sua impronta digitale
2. Ogni client genera un certificato auto-firmato
3. Le impronte digitali dei client vengono aggiunte al blocco `<peer-fingerprint>` del server
4. I client verificano il server usando l'impronta digitale del server
5. La revoca rimuove l'impronta digitale dalla configurazione del server (nessun CRL necessario)
Compromesso: revocare un client richiede il ricaricamento di OpenVPN (le impronte digitali sono in server.conf). In modalità PKI, il file CRL viene riletto automaticamente sulle nuove connessioni.
### Canale dati
> [!NOTE]
> Il cifrario predefinito del canale dati è cambiato in OpenVPN 2.5. Le versioni precedenti utilizzavano come default `BF-CBC`, mentre OpenVPN 2.5+ utilizza come default `AES-256-GCM:AES-128-GCM`. OpenVPN 2.6+ include anche `CHACHA20-POLY1305` nell'elenco dei cifrari predefiniti quando disponibile.
Per impostazione predefinita, OpenVPN 2.4 e versioni precedenti utilizzavano `BF-CBC` come cifrario del canale dati. Blowfish è un algoritmo vecchio (1993) e debole. Persino la documentazione ufficiale di OpenVPN lo ammette.
> Il default è BF-CBC, un'abbreviazione per Blowfish in modalità Cipher Block Chaining.
>
> L'uso di BF-CBC non è più raccomandato a causa della sua dimensione del blocco di 64 bit. Questa piccola dimensione del blocco consente attacchi basati su collisioni, come dimostrato da SWEET32. Vedi <https://community.openvpn.net/openvpn/wiki/SWEET32> per i dettagli.
> Ricercatori di sicurezza presso INRIA hanno pubblicato un attacco sui cifrari a blocchi a 64 bit, come 3DES e Blowfish. Mostrano di essere in grado di recuperare il testo in chiaro quando gli stessi dati vengono inviati abbastanza spesso, e mostrano come possono utilizzare vulnerabilità di cross-site scripting per inviare dati di interesse abbastanza spesso. Questo funziona su HTTPS, ma funziona anche per HTTP-over-OpenVPN. Vedi <https://sweet32.info/> per una spiegazione molto migliore e più dettagliata.
>
> Il cifrario predefinito di OpenVPN, BF-CBC, è affetto da questo attacco.
In effetti, AES è lo standard odierno. È il cifrario più veloce e sicuro disponibile oggi. [SEED](https://en.wikipedia.org/wiki/SEED) e [Camellia](https://github.com/angristan/openvpn-install/blob/HEAD/%3Chttps:/en.wikipedia.org/wiki/Camellia_(cipher)>) non sono ancora vulnerabili ma sono più lenti di AES e relativamente meno affidabili.
> Dei cifrari attualmente supportati, OpenVPN raccomanda attualmente l'uso di AES-256-CBC o AES-128-CBC. OpenVPN 2.4 e successivi supporteranno anche GCM. Per 2.4+, raccomandiamo l'uso di AES-256-GCM o AES-128-GCM.
AES-256 è il 40% più lento di AES-128, e non c'è una reale ragione per usare una chiave a 256 bit rispetto a una chiave a 128 bit con AES. (Fonte: [1](http://security.stackexchange.com/questions/14068/why-most-people-use-256-bit-encryption-instead-of-128-bit),[2](http://security.stackexchange.com/questions/6141/amount-of-simple-operations-that-is-safely-out-of-reach-for-all-humanity/6149#6149)). Inoltre, AES-256 è più vulnerabile a [Timing attacks](https://en.wikipedia.org/wiki/Timing_attack).
AES-GCM è un [cifrario AEAD](https://en.wikipedia.org/wiki/Authenticated_encryption) il che significa che fornisce simultaneamente garanzie di riservatezza, integrità e autenticità sui dati.
ChaCha20-Poly1305 è un altro cifrario AEAD che fornisce una sicurezza simile a AES-GCM. È particolarmente utile su dispositivi senza accelerazione hardware AES (AES-NI), come CPU più vecchie e molti dispositivi basati su ARM, dove può essere significativamente più veloce di AES.
Lo script supporta i seguenti cifrari:
- `AES-128-GCM`
- `AES-192-GCM`
- `AES-256-GCM`
- `AES-128-CBC`
- `AES-192-CBC`
- `AES-256-CBC`
- `CHACHA20-POLY1305` (richiede OpenVPN 2.5+)
E di default utilizza `AES-128-GCM`.
OpenVPN 2.4 ha aggiunto una funzionalità chiamata "NCP": _Negotiable Crypto Parameters_. Significa che puoi fornire una suite di cifrari come con HTTPS. È impostato su `AES-256-GCM:AES-128-GCM` di default e sovrascrive il parametro `--cipher` quando utilizzato con un client OpenVPN 2.4. Per semplicità, lo script imposta `--cipher` (fallback per client non NCP), `--data-ciphers` (nomenclatura moderna OpenVPN 2.5+), e `--ncp-ciphers` (alias legacy per compatibilità OpenVPN 2.4) al cifrario scelto sopra.
### Canale di controllo
OpenVPN 2.4 negozierà il miglior cifrario disponibile di default (ad es. ECDHE+AES-256-GCM)
#### Cifrari TLS 1.2 (`--tls-cipher`)
Lo script propone le seguenti opzioni, a seconda del certificato:
- ECDSA:
- `TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256`
- `TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384`
- `TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256` (richiede OpenVPN 2.5+)
- RSA:
- `TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256`
- `TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384`
- `TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256` (richiede OpenVPN 2.5+)
Di default utilizza `TLS-ECDHE-*-WITH-AES-128-GCM-SHA256`.
#### Cifrari TLS 1.3 (`--tls-ciphersuites`)
Quando viene negoziato TLS 1.3, viene utilizzato un insieme separato di suite di cifratura. Queste sono configurate tramite `--tls-ciphersuites` e usano le convenzioni di nomenclatura OpenSSL:
- `TLS_AES_256_GCM_SHA384`
- `TLS_AES_128_GCM_SHA256`
- `TLS_CHACHA20_POLY1305_SHA256`
Per impostazione predefinita, tutte e tre le suite di cifratura sono abilitate. Le suite di cifratura TLS 1.3 sono più semplici perché non includono l'algoritmo di scambio chiave (che viene negoziato separatamente tramite key shares).
### Scambio di chiavi
OpenVPN storicamente utilizzava come default parametri DH a 2048 bit per lo scambio di chiavi. Questo script offriva sia DH (con dimensioni di chiave configurabili) che ECDH come alternative.
OpenVPN 2.4 ha aggiunto il supporto ECDH, e OpenVPN 2.7 ha reso `dh none` (ECDH) il default, dato che il DH su campi finiti è stato deprecato. Poiché ECDH è ora universalmente supportato e preferito, questo script non offre più DH tradizionale.
Lo script configura `tls-groups` con il seguente elenco di preferenze:```
X25519:prime256v1:secp384r1:secp521r1
Puoi personalizzare questo con --tls-groups.
Dal wiki di OpenVPN, su --auth:
Autentica i pacchetti del canale dati e (se abilitati) i pacchetti del canale di controllo tls-auth con HMAC utilizzando l'algoritmo di digest del messaggio alg. (Il valore predefinito è SHA1). HMAC è un algoritmo di autenticazione dei messaggi (MAC) comunemente utilizzato che impiega una stringa di dati, un algoritmo di hash sicuro e una chiave per produrre una firma digitale.
Se viene scelta una modalità di cifratura AEAD (ad es. GCM), l'algoritmo --auth specificato viene ignorato per il canale dati e al suo posto viene utilizzato il metodo di autenticazione della cifratura AEAD. Nota che alg specifica ancora il digest utilizzato per tls-auth.
Lo script offre le seguenti scelte:
SHA256SHA384SHA512Il valore predefinito è SHA256.
tls-auth, tls-crypt e tls-crypt-v2Dal wiki di OpenVPN, su tls-auth:
Aggiunge un ulteriore livello di autenticazione HMAC sopra il canale di controllo TLS per mitigare attacchi DoS e attacchi allo stack TLS.
In poche parole, --tls-auth abilita una sorta di "firewall HMAC" sulla porta TCP/UDP di OpenVPN, dove i pacchetti del canale di controllo TLS con una firma HMAC errata possono essere immediatamente scartati senza risposta.
Su tls-crypt:
Cifra e autentica tutti i pacchetti del canale di controllo con la chiave dal file keyfile. (Vedi --tls-auth per maggiori informazioni.)
Cifrare (e autenticare) i pacchetti del canale di controllo:
- offre maggiore privacy nascondendo il certificato utilizzato per la connessione TLS,
- rende più difficile identificare il traffico OpenVPN come tale,
- fornisce una sicurezza "post-quantistica da poveri", contro attaccanti che non conosceranno mai la chiave pre-condivisa (cioè nessuna segretezza perfetta).
Quindi entrambi forniscono un ulteriore livello di sicurezza e mitigano gli attacchi DoS. Non sono utilizzati per impostazione predefinita da OpenVPN.
tls-crypt è una funzionalità di OpenVPN 2.4 che fornisce crittografia oltre all'autenticazione (a differenza di tls-auth). È più rispettosa della privacy.
tls-crypt-v2 è una funzionalità di OpenVPN 2.5 che si basa su tls-crypt utilizzando chiavi per cliente invece di una chiave condivisa. Ogni client riceve una chiave univoca derivata da una chiave del server. Questo fornisce:
Lo script supporta tutte e tre le opzioni:
tls-crypt-v2 (predefinito): Chiavi per cliente per una maggiore sicurezzatls-crypt: Chiave condivisa per tutti i client, compatibile con OpenVPN 2.4+tls-auth: Solo autenticazione HMAC (nessuna crittografia), compatibile con client più vecchiremote-cert-tls)Il server è configurato con remote-cert-tls client, che richiede che i peer in connessione abbiano un certificato con l'uso esteso della chiave "TLS Web Client Authentication". Ciò impedisce che un certificato server venga utilizzato per impersonare un client.
Allo stesso modo, i client sono configurati con remote-cert-tls server per assicurarsi di connettersi solo a server che presentano certificati server validi. Questo protegge da un attaccante con un certificato client valido che configura un server rogue.
Data Channel Offload (DCO) è una funzionalità di accelerazione del kernel che migliora significativamente le prestazioni di OpenVPN mantenendo la crittografia/decrittografia del canale dati nello spazio kernel, eliminando i costosi cambi di contesto tra spazio utente e kernel per ogni pacchetto.
DCO è stato integrato nel kernel Linux 6.16 (aprile 2025).
Requisiti:
ovpn-dcoAES-128-GCM, AES-256-GCM o CHACHA20-POLY1305)Le impostazioni predefinite dello script (AES-128-GCM, UDP) sono compatibili con DCO. Quando DCO è disponibile e la configurazione è compatibile, OpenVPN lo utilizzerà automaticamente per migliorare le prestazioni.
Nota: DCO deve essere supportato sia sul server che sul client per una piena accelerazione. Il supporto client è disponibile in OpenVPN 2.6+ (Linux, Windows, FreeBSD) e OpenVPN Connect 3.4+ (Windows). macOS attualmente non supporta DCO, ma i client possono comunque connettersi a server con DCO abilitato, con benefici parziali delle prestazioni lato server.
Lo script mostrerà lo stato di disponibilità di DCO durante l'installazione.
Puoi dire grazie se vuoi!
Un grande ringraziamento ai contributori e al lavoro originale di Nyr.
Questo progetto è sotto la Licenza MIT