GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Come configurare un server OpenVPN su Ubuntu 20.04

Ubuntu 20.04 Focal Fossa è l'ultimo supporto a lungo termine di una delle distribuzioni Linux più utilizzate. In questo tutorial vedremo come utilizzare questo sistema operativo per creare un server OpenVPN e come creare un .ovpn file che useremo per connetterci ad esso dal nostro computer client.

In questo tutorial imparerai:

  • Come generare un'autorità di certificazione
  • Come generare il certificato e la chiave del server e del client
  • Come firmare un certificato con l'Autorità di certificazione
  • Come creare parametri Diffie-Hellman
  • Come generare una chiave tls-auth
  • Come configurare il server OpenVPN
  • Come generare un file .ovpn per connettersi alla VPN

Come configurare un server OpenVPN su Ubuntu 20.04

Requisiti e convenzioni software utilizzati

Requisiti software e convenzioni della riga di comando Linux
Categoria Requisiti, convenzioni o versione del software utilizzata
Sistema Ubuntu 20.04 Fossa focale
Software openvpn, ufw, easy-rsa
Altro Autorizzazioni di root per eseguire attività amministrative
Convenzioni # – richiede che i comandi linux dati vengano eseguiti con i privilegi di root direttamente come utente root o usando sudo comando
$ – richiede che i comandi linux dati vengano eseguiti come un normale utente non privilegiato

Impostazione scenario

Prima di procedere con la configurazione vera e propria della VPN, parliamo delle convenzioni e delle impostazioni che adotteremo in questo tutorial.

Utilizzeremo due macchine, entrambe alimentate da Ubuntu 20.04 Focal Fossa . Il primo, camachine sarà utilizzato per ospitare la nostra Autorità di certificazione; il secondo, openvpnmachine sarà quella che imposteremo come VPN effettiva server. È possibile utilizzare la stessa macchina per entrambi gli scopi, ma sarebbe meno sicuro, dal momento che una persona che viola il server, potrebbe "impersonare" l'Autorità di Certificazione e utilizzarla per firmare certificati indesiderati (il problema è particolarmente rilevante solo se si prevedi di avere più di un server o se prevedi di utilizzare la stessa CA per altri scopi). Per spostare i file tra una macchina e l'altra utilizzeremo il scp comando (copia sicura). I 10 passaggi principali che eseguiremo sono i seguenti:

  1. Generazione dell'Autorità di Certificazione;
  2. Generazione della chiave del server e richiesta del certificato;
  3. Firma della richiesta di certificato del server con la CA;
  4. Generazione dei parametri Diffie-Hellman sul server;
  5. Generazione della chiave tls-auth sul server;
  6. Configurazione OpenVPN;
  7. Configurazione di rete e firewall (ufw) sul server;
  8. Generazione di una chiave client e richiesta di certificato;
  9. Firma del certificato client con la CA;
  10. Creazione del file .ovpn del client utilizzato per la connessione alla VPN.

Fase 1 – Generazione dell'Autorità di Certificazione (CA)

Il primo passo del nostro percorso consiste nella creazione della Autorità di certificazione sulla macchina dedicata. Lavoreremo come utente non privilegiato per generare i file necessari. Prima di iniziare, dobbiamo installare easy-rsa pacchetto:

$ sudo apt-get update && sudo apt-get -y install easy-rsa

Con il pacchetto installato, possiamo usare il make-cadir comando per generare una directory contenente gli strumenti necessari e i file di configurazione, in questo caso lo chiameremo certificate_authority . Una volta creato, ci sposteremo al suo interno:

$ make-cadir certificate_authority && cd certificate_authority

All'interno della directory troveremo un file chiamato vars . Nel file possiamo definire alcune variabili che verranno utilizzate per la generazione del certificato. Un insieme commentato di queste variabili può essere trovato alla riga 91 a 96 . Basta rimuovere il commento e assegnare i valori appropriati:

set_var EASYRSA_REQ_COUNTRY    "US"
set_var EASYRSA_REQ_PROVINCE   "California"
set_var EASYRSA_REQ_CITY       "San Francisco"
set_var EASYRSA_REQ_ORG        "Copyleft Certificate Co"
set_var EASYRSA_REQ_EMAIL      "[email protected]"
set_var EASYRSA_REQ_OU         "My Organizational Unit"

Una volta salvate le modifiche, possiamo procedere e generare la PKI (Public Key Infrastructure), con il seguente comando che creerà una directory chiamata pki :

$ ./easyrsa init-pki

Con l'infrastruttura in atto, possiamo generare la nostra chiave CA e il certificato. Dopo aver lanciato il comando seguente, ci verrà chiesto di inserire una passphrase per la chiave ca . Dovremo fornire la stessa password ogni volta che interagiamo con l'autorità. Un Nome comune per il certificato dovrebbe essere fornito anche. Questo può essere un valore arbitrario; se premiamo semplicemente invio al prompt, verrà utilizzato quello predefinito, in questo caso Easy-RSA CA :

$ ./easyrsa build-ca

Ecco l'output del comando:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus (2 primes)
..........+++++
....................................................................+++++
e is 65537 (0x010001)
Can't load /home/egdoc/certificate_authority/pki/.rnd into RNG
140296362980608:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:98:Filename=/home/egdoc/certificate_authority/pki/.rnd
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/egdoc/certificate_authority/pki/ca.crt

Il build-ca il comando ha generato due file; il loro percorso, relativo alla nostra directory di lavoro sono:

  • pki/ca.crt
  • pki/private/ca.key

Il primo è il certificato pubblico, il secondo è la chiave che verrà utilizzata per firmare i certificati del server e dei client, quindi dovrebbe essere mantenuto il più sicuro possibile.

Una piccola nota, prima di andare avanti:nell'output del comando potresti aver notato un messaggio di errore. Sebbene l'errore non sia grave, una soluzione alternativa per evitarlo è commentare la terza riga di openssl-easyrsa.cnf file che si trova all'interno della directory di lavoro generata. Il problema è discusso nel repository github di openssl. Dopo la modifica, il file dovrebbe apparire così:

# For use with Easy-RSA 3.1 and OpenSSL or LibreSSL

RANDFILE                = $ENV::EASYRSA_PKI/.rnd

Detto questo, passiamo alla macchina che useremo come server OpenVPN e generiamo la chiave e il certificato del server.

Fase 2 – Generazione della chiave del server e della richiesta di certificato

In questo passaggio genereremo la chiave del server e la richiesta di certificato che verrà poi firmata dall'autorità di certificazione. Sulla macchina che useremo come server OpenVPN, dobbiamo installare il openvpn , easy-rsa e ufw pacchetti:

$ sudo apt-get update && sudo apt-get -y install openvpn easy-rsa ufw

Per generare la chiave del server e la richiesta di certificato, eseguiamo la stessa procedura che abbiamo utilizzato sulla macchina che ospita l'Autorità di Certificazione:

  1. Generiamo una directory di lavoro con make-cadir comando e spostati al suo interno.
  2. Imposta le variabili contenute in vars file che verrà utilizzato per il certificato.
  3. Genera l'infrastruttura a chiave pubblica con ./easyrsa init-pki comando.

Dopo questi passaggi preliminari, possiamo emettere il comando per generare il certificato del server e il file chiave:

$ ./easyrsa gen-req server nopass

Questa volta, poiché abbiamo usato il nopass opzione, non ci verrà richiesto di inserire una password durante la generazione della chiave del server . Ci verrà comunque chiesto di inserire un Nome comune per il certificato del server . In questo caso il valore predefinito utilizzato è server . Questo è ciò che useremo in questo tutorial:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

Generating a RSA private key
....................+++++
.................+++++
writing new private key to '/home/egdoc/openvpnserver/pki/private/server.key.9rU3WfZMbW'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [server]:

Keypair and certificate request completed. Your files are:
req: /home/egdoc/openvpnserver/pki/reqs/server.req
key: /home/egdoc/openvpnserver/pki/private/server.key

Una richiesta di firma del certificato e una chiave privata verrà generato:

  • /home/egdoc/openvpnserver/pki/reqs/server.req
  • /home/egdoc/openvpnserver/pki/private/server.key .

Il file della chiave deve essere spostato all'interno di /etc/openvpn directory:

$ sudo mv pki/private/server.key /etc/openvpn

La richiesta di certificato, invece, deve essere inviata alla macchina dell'autorità di certificazione, per essere firmata. Possiamo usare scp comando per trasferire il file:

$ scp pki/reqs/server.req egdoc@camachine:/home/egdoc/

Torniamo a camachine e autorizzare il certificato.

Fase 3 – Firma del certificato del server con la CA

Sulla macchina dell'Autorità di Certificazione dovremmo trovare il file che abbiamo copiato nel passaggio precedente nel $HOME directory del nostro utente:

$ ls ~
certificate_authority  server.req

La prima cosa che facciamo è importare la richiesta di certificato. Per portare a termine l'attività, utilizziamo import-req azione di easyrsa sceneggiatura. La sua sintassi è la seguente:

import-req <request_file_path> <short_basename>

Nel nostro caso, questo si traduce in:

$ ./easyrsa import-req ~/server.req server

Il comando genererà il seguente output:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

The request has been successfully imported with a short name of: server
You may now use this name to perform signing operations on this request.

Per firmare la richiesta, utilizziamo il sing-req action, che prende il tipo della richiesta come primo argomento (server, in questo caso) e il short_basename abbiamo usato nel comando precedente (server). Corriamo:

$ ./easyrsa sign-req server server

Ci verrà chiesto di confermare che vogliamo firmare il certificato e di fornire la password che abbiamo utilizzato per la chiave dell'autorità di certificazione. Se tutto va come previsto, verrà creato il certificato:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 1080 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /home/egdoc/certificate_authority/pki/safessl-easyrsa.cnf
Enter pass phrase for /home/egdoc/certificate_authority/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Mar 20 02:12:08 2023 GMT (1080 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/egdoc/certificate_authority/pki/issued/server.crt

Ora possiamo eliminare il file di richiesta che abbiamo precedentemente trasferito da openvpnmachine . E copia il certificato generato nel nostro OpenVPN server, insieme al certificato pubblico della CA:

$ rm ~/server.req
$ scp pki/{ca.crt,issued/server.crt} egdoc@openvpnmachine:/home/egdoc

Torna su openvpnmachine dovremmo trovare i file nella nostra home directory. Ora possiamo spostarli in /etc/openvpn :

$ sudo mv ~/{ca.crt,server.crt} /etc/openvpn

Fase 4 – Generazione dei parametri Diffie-Hellman

Il passo successivo consiste nella generazione di un Diffie-Hellman parametri. Il Diffie Hellman lo scambio di chiavi è il metodo utilizzato per trasferire le chiavi crittografiche su un canale pubblico e non sicuro. Il comando per generare la chiave è il seguente (il completamento potrebbe richiedere del tempo):

$ ./easyrsa gen-dh

La chiave verrà generata all'interno del pki directory come dh.pem . Spostiamolo in /etc/openvpn come dh2048.pem :

$ sudo mv pki/dh.pem /etc/openvpn/dh2048.pem

Fase 5 – Generazione della chiave tls-auth (ta.key)

Per migliorare la sicurezza, OpenVPN implementa tls-auth . Citando la documentazione ufficiale:

La direttiva tls-auth aggiunge una firma HMAC aggiuntiva a tutti i pacchetti di handshake SSL/TLS per la verifica dell'integrità. Qualsiasi pacchetto UDP che non porta la firma HMAC corretta può essere eliminato senza ulteriore elaborazione. La firma HMAC tls-auth fornisce un ulteriore livello di sicurezza oltre a quello fornito da SSL/TLS. Può proteggere da:
– Attacchi DoS o port flooding sulla porta UDP di OpenVPN.
– Scansione delle porte per determinare quali porte UDP del server sono in stato di ascolto.
– Vulnerabilità di overflow del buffer nella Implementazione SSL/TLS.
– Iniziazioni di handshake SSL/TLS da macchine non autorizzate (sebbene tali handshake alla fine non riuscirebbero ad autenticarsi, tls-auth può interromperli molto prima).

Per generare la chiave tls_auth possiamo eseguire il seguente comando:

$ openvpn --genkey --secret ta.key

Una volta generato, spostiamo il ta.key file in /etc/openvpn :

$ sudo mv ta.key /etc/openvpn

La configurazione delle nostre chiavi del server è ora completa. Possiamo procedere con l'effettiva configurazione del server.

Fase 6 – Configurazione OpenVPN

Il file di configurazione di OpenVPN non esiste per impostazione predefinita all'interno di /etc/openvpn . Per generarlo, utilizziamo un modello fornito con openvpn pacchetto. Eseguiamo questo comando:

$ zcat \
  /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz \
  | sudo tee /etc/openvpn/server.conf > /dev/null

Ora possiamo modificare il /etc/openvpn/server.conf file. Le parti rilevanti sono mostrate di seguito. La prima cosa che vogliamo fare è verificare che il nome delle chiavi e dei certificati a cui si fa riferimento corrisponda a quelli che abbiamo generato. Se hai seguito questo tutorial dovrebbe essere sicuramente il caso (linee 78-80 e 85 ):

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem

Vogliamo far funzionare il demone OpenVPN con privilegi bassi, il nobody utente e nogroup gruppo. La parte rilevante del file di configurazione si trova alle righe 274 e 275 . Dobbiamo solo rimuovere il ; iniziale :

user nobody
group nogroup

Un'altra riga da cui vogliamo rimuovere il commento è 192 . Ciò farà sì che tutti i client reindirizzeranno il loro gateway predefinito tramite la VPN:

push "redirect-gateway def1 bypass-dhcp"

Righe 200 e 201 to può essere utilizzato anche per consentire al server di inviare server DNS specifici ai client. Quelli nel file di configurazione sono quelli forniti da opendns.com :

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

A questo punto il /etc/openvpn directory dovrebbe contenere questi file che abbiamo generato:

/etc/openvpn
├── ca.crt
├── dh2048.pem
├── server.conf
├── server.crt
├── server.key
└── ta.key

Assicuriamoci che siano tutti di proprietà di root:

$ sudo chown -R root:root /etc/openvpn

Possiamo procedere al passaggio successivo:la configurazione delle opzioni di rete.

Fase 7:configurazione della rete e dell'ufw

Affinché la nostra VPN funzioni, dobbiamo abilitare l'inoltro IP sul nostro server. Per farlo, decomponiamo semplicemente la riga 28 dal /etc/sysctl.conf file:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Per ricaricare le impostazioni:

$ sudo sysctl -p

Dobbiamo anche consentire l'inoltro dei pacchetti nel firewall ufw modificando il /etc/default/ufw file e modificando il DEFAULT_FORWARD_POLICY da DROP per ACCEPT (riga 19 ):

# Set the default forward policy to ACCEPT, DROP or REJECT.  Please note that
# if you change this you will most likely want to adjust your rules
DEFAULT_FORWARD_POLICY="ACCEPT"

Ora dobbiamo aggiungere le seguenti regole all'inizio di /etc/ufw/before.rules file. Qui assumiamo che l'interfaccia utilizzata per la connessione sia eth0 :

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT

Infine, dobbiamo consentire il traffico in entrata per openvpn servizio nel gestore del firewall ufw:

$ sudo ufw allow openvpn

A questo punto possiamo riavviare ufw per applicare le modifiche. Se il tuo firewall non era abilitato a questo punto, assicurati che ssh il servizio è sempre consentito, altrimenti potresti essere tagliato fuori se lavori da remoto.

$ sudo ufw disable && sudo ufw enable

Ora possiamo avviare e abilitare openvpn.service all'avvio:

$ sudo systemctl restart openvpn && sudo systemctl enable openvpn

Fase 8 – Generazione di una chiave client e di una richiesta di certificato

La configurazione del nostro server è ora terminata. Il passaggio successivo consiste nella generazione della chiave client e della richiesta di certificato. La procedura è la stessa che abbiamo usato per il server:utilizziamo semplicemente “client” come nome invece di “sever”, generiamo la chiave e la richiesta di certificato, quindi passiamo quest'ultima alla macchina della CA per la firma.

$ ./easyrsa gen-req client nopass

Proprio come prima, ci verrà chiesto di inserire un nome comune. Verranno generati i seguenti file:

  • /home/egdoc/openvpnserver/pki/reqs/client.req
  • /home/egdoc/openvpnserver/pki/private/client.key

Copiamo il client.req alla macchina CA:

$ scp pki/reqs/client.req egdoc@camachine:/home/egdoc

Una volta copiato il file, su camachine , importiamo la richiesta:

$ ./easyrsa import-req ~/client.req client

Quindi, firmiamo il certificato:

$ ./easyrsa sign-req client client

Dopo aver inserito la password della CA, il certificato verrà creato come pki/issued/client.crt . Rimuoviamo il file di richiesta e ricopiamo il certificato firmato sul server VPN:

$ rm ~/client.req
$ scp pki/issued/client.crt egdoc@openvpnmachine:/home/egdoc

Per comodità, creiamo una directory per contenere tutte le informazioni relative al client e spostarci la chiave e il certificato del client:

$ mkdir ~/client
$ mv ~/client.crt pki/private/client.key ~/client

Bene, ci siamo quasi. Ora dobbiamo copiare il modello di configurazione del client, /usr/share/doc/openvpn/examples/sample-config-files/client.conf all'interno del ~/client directory e modificarlo in base alle nostre esigenze:

$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client

Ecco le righe che dobbiamo modificare nel file. Alla riga 42 metti l'IP o il nome host del server effettivo al posto di my-server-1 :

remote my-server-1 1194

Sulle righe 61 e 62 rimuovi il ; iniziale carattere per eseguire il downgrade dei privilegi dopo l'inizializzazione:

user nobody
group nogroup

Sulle righe 88 a 90 e 108 possiamo vedere che il certificato CA, il certificato client, la chiave client e la chiave tls-auth sono referenziati. Vogliamo commentare quelle righe, poiché inseriremo il contenuto effettivo dei file tra una coppia di "tag" dedicati:

  • <ca></ca> per il certificato CA
  • <cert></cert> per il certificato cliente
  • <key></key> per la chiave client
  • <tls-auth></tls-auth> per la chiave tls-auth

Una volta commentate le righe, aggiungiamo il seguente contenuto in fondo al file:

<ca>
# Here goes the content of the ca.crt file
</ca>

<cert>
# Here goes the content of the client.crt file
</cert>

<key>
# Here goes the content of the client.key file
</key>

key-direction 1
<tls-auth>
# Here goes the content of the ta.key file
</tls-auth>

Una volta terminata la modifica del file, lo rinominiamo con .ovpn suffisso:

$ mv ~/client/client.conf ~/client/client.ovpn

Tutto ciò che resta da fare è importare il file nella nostra applicazione client per collegarlo alla nostra VPN. Se stiamo utilizzando l'ambiente desktop GNOME, ad esempio, possiamo importare il file da Rete sezione del pannello di controllo. Nella sezione VPN basta cliccare su + pulsante, quindi su “importa da file” per selezionare e importare il file “.ovpn” precedentemente trasferito sulla macchina client.



Interfaccia GNOME per importare file .ovpn

Conclusioni

In questo tutorial abbiamo visto come creare una configurazione OpenVPN funzionante. Abbiamo generato un'autorità di certificazione e l'abbiamo utilizzata per firmare i certificati server e client che abbiamo generato insieme alle chiavi corrispondenti. Abbiamo visto come configurare il server e come configurare la rete, consentendo l'inoltro dei pacchetti ed eseguendo le modifiche necessarie alla configurazione del firewall ufw. Infine, abbiamo visto come generare un client .ovpn file che può essere importato da un'applicazione client per connettersi facilmente alla nostra VPN. Divertiti!


Ubuntu
  1. Configurazione di base della connessione client/server di Ubuntu 20.04 OpenVPN

  2. Come configurare il server Rsyslog su Ubuntu 18.04 LTS

  3. Come configurare il server NTP su Ubuntu e LinuxMint

  4. Imposta il server Rsyslog su Ubuntu 20.04 - Come farlo?

  5. Come installare OpenVPN su Ubuntu 18.04

Come configurare il server multiplayer di Minecraft su Ubuntu 16.04

Come configurare OpenVPN su Ubuntu Server

Come configurare Git Server su Ubuntu 20.04

Come configurare il server Rsyslog su Ubuntu

Come configurare il server DHCP su Ubuntu

Come installare il server OpenVPN su Ubuntu 20.04 LTS