Ricerca nel sito web

Come installare e configurare il server OpenVPN su Rocky Linux 9


Una rete privata virtuale (VPN) ti consente di accedere a Internet mascherando la tua posizione, dandoti la libertà di accedere a Internet in modo sicuro su reti non affidabili e di eludere le restrizioni geografiche e la censura. OpenVPN è una soluzione VPN Transport Layer Security (TLS) open source per raggiungere questo obiettivo.

Nel nostro tutorial, installeremo OpenVPN su un server Rocky Linux 9 e lo configureremo per essere accessibile da un computer client e creeremo una connessione VPN tra loro per reindirizzare tutto il traffico dal client attraverso il server OpenVPN.

Prerequisiti

    Un server che esegue Rocky Linux 9 che supporta sia le connessioni IPv4 che IPv6. Lo chiameremo server OpenVPN. Il firewall Firewalld è abilitato e in esecuzione su di esso.

    Un server che esegue Rocky Linux 9 che supporta sia le connessioni IPv4 che IPv6. Lo configureremo come un'autorità di certificazione (CA) privata, a cui faremo riferimento come server CA.

    Un utente non root con privilegi sudo sia su OpenVPN che sul server CA.

    Una macchina client per connettersi al server OpenVPN. Puoi utilizzare il tuo dispositivo locale come computer client. OpenVPN ha client per Windows, Linux, macOS, Android e iOS. Puoi usarne uno per connetterti. Utilizzeremo un PC client Rocky Linux 9 per il tutorial.

    Tutto è aggiornato su OpenVPN e sul server CA.

    $ sudo dnf update
    

Passaggio 1: configurazione del server CA

Un'autorità di certificazione (CA) è un'entità responsabile dell'emissione di certificati digitali per verificare le identità su Internet. In questo tutorial, utilizzeremo un server autonomo come server CA privato che convaliderà il server OpenVPN e i certificati client. Il server CA non deve eseguire altri servizi oltre all'importazione, alla firma e alla convalida dei certificati.

Passaggio 1.1: installare Easy-RSA

Il primo passo è installare il set di script easy-rsa. easy-rsa è uno strumento di gestione dell'autorità di certificazione utilizzato per generare una chiave privata e un certificato radice pubblico.

Ma prima dobbiamo abilitare il repository EPEL che contiene il pacchetto easy-rsa.

$ sudo dnf install epel-release

Installa Easy-RSA.

$ sudo dnf install easy-rsa

Passaggio 1.2: creazione di una directory dell'infrastruttura a chiave pubblica

Il passaggio successivo consiste nel creare una struttura di infrastruttura a chiave pubblica (PKI) sul server CA.

$ mkdir ~/easy-rsa

Crea collegamenti simbolici che puntano ai file del pacchetto easy-rsa installati.

$ ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/

Limitare l'accesso alla directory PKI.

$ chmod 700 /home/<username>/easy-rsa

Inizializzare la PKI.

$ cd ~/easy-rsa
$ ./easyrsa init-pki

Otterrai il seguente output.

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/<username>/easy-rsa/pki

Passaggio 1.3: creare un'autorità di certificazione

Prima di poter creare la chiave privata e il certificato della CA, è necessario configurarne le informazioni sull'organizzazione. Crea il file vars per memorizzare le informazioni all'interno della directory easy-rsa e aprilo per la modifica.

$ cd ~/easy-rsa
$ nano vars

Incolla al suo interno il seguente codice.

set_var EASYRSA_REQ_COUNTRY    "US"
set_var EASYRSA_REQ_PROVINCE   "NewYork"
set_var EASYRSA_REQ_CITY       "New York City"
set_var EASYRSA_REQ_ORG        "Howtoforge"
set_var EASYRSA_REQ_EMAIL      "[email "
set_var EASYRSA_REQ_OU         "Community"
set_var EASYRSA_ALGO           "ec"
set_var EASYRSA_DIGEST         "sha512"

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Esegui il comando seguente per creare la coppia di chiavi pubblica e privata root per la tua autorità di certificazione.

$ ./easyrsa build-ca

Ti verrà richiesto di inserire una passphrase per la tua coppia di chiavi. Ti verrà anche richiesta una passphrase PEM. Scegli una passphrase efficace per entrambi e annotala per dopo. Ti verrà inoltre richiesto il nome comune (CN) della tua CA. Puoi inserire qualsiasi stringa, ma per semplicità premi INVIO per accettare il nome predefinito.

Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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/<username>/easy-rsa/pki/ca.crt

Se non vuoi che ti venga richiesta una password ogni volta che interagisci con la tua CA, puoi invece utilizzare il comando seguente.

$ ./easyrsa build-ca nopass

Questo creerà due file:

  • ~/easy-rsa/pki/ca.crt è il file di certificato pubblico della CA. Ogni utente e il server OpenVPN avranno bisogno di una copia di questo file.
  • ~/easy-rsa/pki/ca.key è la chiave privata utilizzata dalla CA per firmare i certificati per il server e il client OpenVPN. Se un utente malintenzionato riesce ad accedere alla tua CA e, di conseguenza, al tuo file ca.key, dovrai distruggere la tua CA. Questo è il motivo per cui il tuo file ca.key dovrebbe trovarsi solo sul tuo computer CA e che, idealmente, il tuo computer CA dovrebbe essere tenuto offline quando non firmi richieste di certificato come ulteriore sicurezza misurare.

Passaggio 2: installazione di OpenVPN e Easy-RSA sul server OpenVPN

Accedi al tuo server OpenVPN e installa i pacchetti OpenVPN e Easy-RSA. Inoltre, installa prima di loro il repository EPEL.

$ sudo dnf install epel-release
$ sudo dnf install openvpn easy-rsa

Crea la directory ~/easy-rsa.

$ mkdir ~/easy-rsa

Crea un collegamento simbolico dallo script easy-rsa che abbiamo installato proprio come sul server CA.

$ ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/

Limitare l'accesso alla directory.

$ chmod 700 ~/easy-rsa

Passaggio 3: creazione di una PKI per il server OpenVPN

Crea un file vars all'interno della directory ~/easy-rsa per memorizzare le informazioni richieste per creare la PKI e aprirla per la modifica.

$ cd ~/easy-rsa
$ nano vars

Incolla al suo interno le seguenti righe.

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Poiché non utilizziamo questo server come CA, questi sono gli unici valori di cui abbiamo bisogno. Ciò configura i tuoi server OpenVPN e CA per utilizzare ECC, il che significa che quando un client e un server tentano di stabilire una chiave simmetrica condivisa, utilizzano algoritmi di curva ellittica per eseguire lo scambio. È significativamente più veloce rispetto all'utilizzo del semplice Diffie-Hellman con il classico algoritmo RSA poiché i numeri sono molto più piccoli e i calcoli sono più veloci.

Il passo successivo è creare la directory PKI utilizzando l'opzione init-pki. Sebbene tu abbia già eseguito questo comando sul server CA come parte dei prerequisiti, è necessario eseguirlo qui perché il tuo server OpenVPN e il server CA hanno directory PKI separate.

$ ./easyrsa init-pki

La PKI sul server OpenVPN viene utilizzata come luogo centralizzato per archiviare richieste di certificato e certificati pubblici.

Passaggio 4: creare la richiesta di certificato del server OpenVPN e la chiave privata

Passa alla directory ~/easy-rsa sul server OpenVPN.

$ cd ~/easy-rsa

Il passaggio successivo è generare una chiave privata e una richiesta di firma del certificato (CSR) sul tuo server OpenVPN. Esegui il comando easy-rsa con l'opzione gen-req seguita da un nome comune (CN) per il server. Per il nostro tutorial, utilizzeremo server come CN per il server OpenVPN. Utilizzeremo anche l'opzione nopass per evitare eventuali problemi di autorizzazione.

$ ./easyrsa gen-req server nopass

Otterrai il seguente output.

Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
.....+.................+.+.....+....+........+...+.+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+.+...+..+......+...+....+.....+...+.........+......+.......+...+.....+.......+.....+.....................+.+...+...+...............+........+..........+......+.....+...+.......+........+.+...........+...+.+.....+......+.+...+.........+...+........+.+...........+...+....+..+...+............+.............+.....+...+.......+...+...+...........+.+..+.......+.....+...................+..+...+......+....+..+.......+......+......+......+..+......+....+............+...............+.....+..........+...+..+....+..+.........+....+...............+..............+.......+...+..+...+......+.+....................................+........+....+...+...+.........+.....+.+..+...+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
................+...+....+............+...+...+.....+...+....+...............+......+.....+....+.....+.+.........+...+.................+......+.........+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+...+..+.......+..+...+.+.....+.........+.+..+....+...+.....+......+.......+.........+........+......+.+.....+.+............+..+..........+........+.+..+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.........+...+..+.+........+....+..+......+....+.........+..+............+...+...+.........+.............+..+...+...+.+......+.....+....+.....+.+...+..............................+......+........+..........+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
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/<username>/easy-rsa/pki/reqs/server.req
key: /home/<username>/easy-rsa/pki/private/server.key

Questo crea una chiave privata per il server e un file di richiesta di certificato chiamato server.req. Copia la chiave del server nella directory /etc/openvpn/server.

$ sudo cp /home/<username>/easy-rsa/pki/private/server.key /etc/openvpn/server/

La richiesta di firma del certificato (CSR) è ora pronta per la firma da parte della CA.

Passaggio 5: firma della CSR del server OpenVPN

Il passaggio successivo consiste nel copiare il file CSR sul server CA per la firma. Se sui tuoi server è abilitata l'autenticazione tramite password, puoi semplicemente utilizzare il seguente comando per copiare il file.

$ scp /home/<username>/easy-rsa/pki/reqs/server.req username@your_ca_server_ip:/tmp

Se non desideri utilizzare l'autenticazione tramite password, dovrai generare una coppia di chiavi SSH per ciascun server, quindi aggiungere la chiave SSH pubblica del server OpenVPN al file authorized_keys della macchina CA e viceversa.

Se non vuoi fare tutto questo, puoi semplicemente copiare i file. Apri il file sul server OpenVPN, copiane il contenuto, quindi crea il file sul server CA e incolla il contenuto.

Accedi nuovamente al server CA, passa alla directory ~/easy-rsa e importa il file CSR.

$ cd ~/easy-rsa
$ ./easyrsa import-req /tmp/server.req server

Otterrai il seguente output.

Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)

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.

Firma la richiesta utilizzando il comando seguente. Poiché stiamo firmando il CSR del server OpenVPN, utilizzeremo il suo nome comune (CN).

$ ./easyrsa sign-req server server

Ti verrà richiesto di verificare se la richiesta proviene da una fonte attendibile. Digita yes quindi premi il tasto ENTER per confermare.

Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)


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 825 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes

Successivamente, ti verrà richiesta la passphrase della chiave privata CA configurata in precedenza.

Using configuration from /home/<username>/easy-rsa/pki/easy-rsa-5673.9KntVf/tmp.P5JqSD
Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key:
802BB2829D7F0000:error:0700006C:configuration file routines:NCONF_get_string:no value:crypto/conf/conf_lib.c:315:group=<NULL> name=unique_subject
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 May 12 01:34:35 2025 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/<username>/easy-rsa/pki/issued/server.crt

Il certificato risultante contiene la chiave di crittografia pubblica del server OpenVPN nonché la firma del server CA. Copia nuovamente i certificati sul server OpenVPN.

$ scp pki/issued/server.crt username@your_vpn_server_ip:/tmp
$ scp pki/ca.crt username@your_vpn_server_ip:/tmp

Sul tuo server OpenVPN, copia i file nella directory /etc/openvpn/server.

$ sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server

Passaggio 6: configurare il materiale crittografico OpenVPN

Aggiungeremo una chiave segreta condivisa aggiuntiva che il server e tutti i client utilizzeranno con la direttiva tls-crypt di OpenVPN. Ciò garantisce che il server OpenVPN sia in grado di far fronte al traffico non autenticato, alle scansioni delle porte e agli attacchi Denial of Service. Inoltre rende più difficile identificare il traffico di rete OpenVPN.

Passa alla directory ~/easy-rsa.

$ cd ~/easy-rsa

Genera la chiave precondivisa tls-crypt. Questo creerà un file chiamato ta.key

$ openvpn --genkey secret ta.key

Copia ta.key nella directory /etc/openvpn/server.

$ sudo cp ta.key /etc/openvpn/server

Passaggio 7: generare un certificato client e una coppia di chiavi

Creare una directory in cui archiviare il certificato client e i file di chiave.

$ mkdir -p ~/client-configs/keys

Limitare le autorizzazioni sulla directory per proteggerla.

$ chmod -R 700 ~/client-configs

Successivamente, passa alla directory ~/easy-rsa.

$ cd ~/easy-rsa

Genera una chiave client con client1 come nome comune per il client. È possibile utilizzare qualsiasi CN per il client.

$ ./easyrsa gen-req client1 nopass

Premi ENTER per confermare il nome comune. Otterrai il seguente output.

Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
........+.+.........+.........+...+...+..+.........+......+...+.......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+..+...+....+........+.......+........+............+...+......+.......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+...............+..........+......+......+.....+....+...........+.+..+......+.+.....................+.........+.........+..+.........+..+...+.+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+.....+.+..................+...........+...+.+............+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+.....+.+.........+...+..+.........+....+..+..................+.+......+...+...+.....+...+......+..........+........+...+...+......+...+...+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+.....+.......+........+.......+........+.+.........+...........+.......+...............+.....+....+.........+.....+.+...+........+...+.+...+..+.+........+............+.........+.+.........+.....+.++.......+.....+.......+.....+....+......+.....+.............+...........+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
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) [client1]:

Keypair and certificate request completed. Your files are:
req: /home/<username>/easy-rsa/pki/reqs/client1.req
key: /home/<username>/easy-rsa/pki/private/client1.key

Successivamente, copia il file client1.key nella directory ~/client-configs/keys.

$ cp pki/private/client1.key ~/client-configs/keys/

Trasferisci il file client1.req al server CA.

$ scp pki/reqs/client1.req username@your_ca_server_ip:/tmp

Accedere nuovamente al server CA e importare la richiesta del server.

$ cd ~/easy-rsa
$ ./easyrsa import-req /tmp/client1.req client1

Otterrai il seguente output.

Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)

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

Firma la richiesta utilizzando il comando seguente. Stiamo utilizzando client come tipo di richiesta.

$ ./easyrsa sign-req client client1

Quando richiesto, inserisci yes per confermare di firmare la richiesta e che provenga da una fonte attendibile.

Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)


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 client certificate for 825 days:

subject=
    commonName                = client1


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes

Ti verrà richiesta la passphrase CA.

Using configuration from /home/<username>/easy-rsa/pki/easy-rsa-5908.XM2MNt/tmp.SGLqAt
Enter pass phrase for /home/<username>/easy-rsa/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:'client1'
Certificate is to be certified until May 12 01:41:45 2025 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/<username>/easy-rsa/pki/issued/client1.crt

Trasferisci nuovamente il certificato creato sul server OpenVPN.

$ scp pki/issued/client1.crt username@your_server_ip:/tmp

Sul server OpenVPN, copia il certificato client nella directory ~/client-configs/keys.

$ cp /tmp/client1.crt ~/client-configs/keys/

Copia i file ca.crt e ta.key nella directory ~/client-configs/keys e imposta le autorizzazioni appropriate per i tuoi utenti attualmente registrati -nel server.

$ cp ~/easy-rsa/ta.key ~/client-configs/keys/
$ sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
$ sudo chown username.username ~/client-configs/keys/*

Passaggio 8: configurare OpenVPN

Copia il file server.conf di esempio come punto di partenza per configurare OpenVPN.

$ sudo cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/

Apri il file per la modifica.

$ sudo nano /etc/openvpn/server/server.conf

Trova la sezione HMAC del file cercando la direttiva tls-auth. Commenta la riga aggiungendo un punto e virgola (;) all'inizio della riga. Aggiungi una nuova riga sotto di essa come mostrato.

;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key

Successivamente, modifica il valore di cifratura crittografica cercando le righe cipher. Il valore predefinito è impostato su AES-256-CBC. Commenta il valore predefinito e aggiungi un'altra riga con la crittografia AES-256-GCM che offre un livello migliore di crittografia e prestazioni come mostrato.

;cipher AES-256-CBC
cipher AES-256-GCM

Subito sotto, aggiungi la direttiva auth per selezionare l'algoritmo digest del messaggio HMAC.

auth SHA256

Poiché stiamo utilizzando la crittografia a curva ellittica, dobbiamo disattivare la crittografia Diffie-Hellman. Commenta la riga dh dh2048.pem e aggiungi dh none sotto di essa.

;dh dh2048.pem
dh none

OpenVPN dovrebbe essere eseguito senza privilegi una volta avviato. Per abilitare ciò, trova e rimuovi il commento dalle righe utente nessuno e gruppo nessuno e modificale come mostrato.

user nobody
group nobody

Reindirizza tutto il traffico attraverso la VPN

Le impostazioni sopra creano la connessione VPN tra il client e il server, ma non imporranno ad alcuna connessione l'utilizzo del tunnel. Per fare ciò, inizia trovando la riga push "redirect-gateway def1 bypass-dhcp". Questa riga indica al client di reindirizzare tutto il suo traffico attraverso il server OpenVPN. Decommentare la riga per abilitare la funzionalità.

push "redirect-gateway def1 bypass-dhcp"

Trova la sezione dhcp-option sotto questa riga. Rimuovi il punto e virgola dall'inizio di entrambe le righe. Questo dice al client di utilizzare i risolutori OpenDNS.

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

Cambia porta e protocollo

OpenVPN utilizza la porta 1194 e il protocollo UDP per impostazione predefinita per accettare le connessioni client. Puoi cambiare la porta a seconda delle tue esigenze. Se non ospiti contenuti web sul tuo server OpenVPN, puoi utilizzare la porta 443.

Trova la riga ;port 1194, decommentala rimuovendo il punto e virgola e modifica il suo valore.

port 443

Trova la riga proto udp e commentala aggiungendo un punto e virgola davanti ad essa. Inoltre, rimuovi il commento dalla riga proto tcp rimuovendo il punto e virgola come mostrato.

proto tcp
;proto udp

Poiché stiamo utilizzando il protocollo TCP, dobbiamo modificare il valore della direttiva explicit-exit-notify da 1 a 0, in quanto questo la direttiva è utilizzata solo da UDP.

explicit-exit-notify 0

Puntare a credenziali non predefinite

Se hai selezionato un nome diverso durante il comando ./easy-rsa gen-req server in precedenza, devi modificare il cert e la key righe in modo che puntino ai file .crt e .key appropriati. Poiché stiamo utilizzando il nome server predefinito, il valore predefinito è corretto.

cert server.crt
key server.key  # This file should be kept secret

Cambia la posizione del file di registro per SELinux

Trova la riga status openvpn-status.log e modificala come segue.

status /var/log/openvpn-status.log

Per impostazione predefinita, il server OpenVPN genera e archivia il registro nella directory /run/openvpn/openvpn-status.log che, se SELinux è abilitato, causa problemi. La soluzione semplice è modificare la posizione nella directory del registro di sistema.

Una volta terminato, salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Passaggio 9: modificare la configurazione della rete del server OpenVPN

Il passaggio successivo è configurare la configurazione di rete del server per consentire a OpenVPN di instradare correttamente il traffico. La prima cosa che dobbiamo configurare è il port forwarding.

Apri il file /etc/sysctl.conf per modificarlo.

$ sudo nano /etc/sysctl.conf

Aggiungi la seguente riga in fondo al file.

net.ipv4.ip_forward = 1

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Per leggere il file e caricare i nuovi valori per la sessione corrente, utilizzare il comando seguente.

$ sudo sysctl -p
net.ipv4.ip_forward = 1

Questa configurazione instraderà tutto il traffico web dal tuo client tramite l'indirizzo IP del tuo server e l'indirizzo IP pubblico del tuo client sarà effettivamente nascosto.

Passaggio 10: configurare il firewall

Abbiamo installato e configurato OpenVPN, ma non l'abbiamo impostato per gestire il traffico client in entrata. Dobbiamo configurare il firewall per questo.

Innanzitutto, controlla le zone attive nel tuo firewall firewalld.

$ sudo firewall-cmd --get-active-zones

Riceverai un output simile.

public
  interfaces: eth0 eth1

Se non vedi l'interfaccia tun0 come zona trusted, esegui i seguenti comandi per aggiungere il server a quella zona.

$ sudo firewall-cmd --zone=trusted --add-interface=tun0
$ sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0

Successivamente, aggiungi il servizio OpenVPN all'elenco dei servizi consentiti all'interno della zona attiva. E poi rendi permanenti le impostazioni.

$ sudo firewall-cmd --permanent --add-service openvpn
$ sudo firewall-cmd --permanent --zone=trusted --add-service openvpn

Ricaricare il firewall per applicare le modifiche.

$ sudo firewall-cmd --reload

Conferma che il servizio OpenVPN è stato aggiunto.

$ sudo firewall-cmd --list-services --zone=trusted
openvpn

Successivamente, dobbiamo aggiungere una regola di mascheramento al firewall. Ciò consente al server OpenVPN di tradurre gli indirizzi dei client nell'indirizzo pubblico del server e quindi di fare il contrario con il traffico inviato ai client. Questo processo è anche chiamato Network Address Translation (NAT).

Aggiungi regole di mascheramento con i seguenti comandi.

$ sudo firewall-cmd --add-masquerade
$ sudo firewall-cmd --add-masquerade --permanent

Conferma che la mascherata è stata aggiunta correttamente.

$ sudo firewall-cmd --query-masquerade
yes

Infine, crea la regola di mascheramento specifica per la sottorete OpenVPN. Questo viene fatto creando una variabile di shell (DEVICE nel nostro tutorial) che rappresenta l'interfaccia di rete primaria utilizzata dal server, e quindi utilizzando quella variabile per aggiungere in modo permanente la regola di routing.

$ DEVICE=$(ip route | awk '/^default via/ {print $5}')
$ sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEVICE -j MASQUERADE

Infine, apri la porta impostata sopra per OpenVPN.

$ sudo firewall-cmd --permanent --add-port=443/tcp

Ricaricare il firewall per applicare la modifica.

$ sudo firewall-cmd --reload

Passaggio 11: avviare OpenVPN

Abilita l'avvio del servizio OpenVPN all'avvio.

$ sudo systemctl -f enable [email 

Avvia il servizio OpenVPN.

$ sudo systemctl start [email 

Controlla lo stato del servizio.

$ sudo systemctl status [email 

Riceverai un output simile.

? [email  - OpenVPN service for server
     Loaded: loaded (/usr/lib/systemd/system/[email ; enabled; vendor preset: disabled)
     Active: active (running) since Tue 2023-02-07 02:09:36 UTC; 13s ago
       Docs: man:openvpn(8)
             https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
             https://community.openvpn.net/openvpn/wiki/HOWTO
   Main PID: 4789 (openvpn)
     Status: "Initialization Sequence Completed"
      Tasks: 1 (limit: 4443)
     Memory: 1.7M
        CPU: 21ms
     CGroup: /system.slice/system-openvpn\x2dserver.slice/[email 
             ??4789 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --cipher AES-256-GCM --data-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC:BF-CBC --config server.conf

Feb 07 02:09:36 openvpn-server openvpn[4789]: Listening for incoming TCP connection on [AF_INET][undef]:443
Feb 07 02:09:36 openvpn-server openvpn[4789]: TCPv4_SERVER link local (bound): [AF_INET][undef]:443
Feb 07 02:09:36 openvpn-server openvpn[4789]: TCPv4_SERVER link remote: [AF_UNSPEC]
Feb 07 02:09:36 openvpn-server openvpn[4789]: GID set to nobody
Feb 07 02:09:36 openvpn-server openvpn[4789]: UID set to nobody
Feb 07 02:09:36 openvpn-server openvpn[4789]: MULTI: multi_init called, r=256 v=256
Feb 07 02:09:36 openvpn-server openvpn[4789]: IFCONFIG POOL IPv4: base=10.8.0.4 size=62
Feb 07 02:09:36 openvpn-server openvpn[4789]: IFCONFIG POOL LIST
Feb 07 02:09:36 openvpn-server openvpn[4789]: MULTI: TCP INIT maxclients=1024 maxevents=1028
Feb 07 02:09:36 openvpn-server openvpn[4789]: Initialization Sequence Completed

Passaggio 12: creare la configurazione del client

Prima di testare un client, dobbiamo creare file di configurazione per il client che utilizzeremo. Creare una directory per archiviare i file di configurazione del client.

$ mkdir -p ~/client-configs/files

Copiare il file di configurazione del client di esempio nella directory.

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

Apri il file di configurazione per la modifica.

$ nano ~/client-configs/base.conf

Trova la direttiva remote e impostala in modo che punti all'indirizzo IP pubblico del tuo server OpenVPN. Inoltre, cambia la porta in modo che corrisponda alla porta scelta in precedenza.

. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 443
. . .

Imposta il protocollo che hai scelto in precedenza.

proto tcp

Rimuovere il commento dalle direttive user e group rimuovendo il punto e virgola davanti ad esse.

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nobody

Trova le direttive ca, cert e key e commentale inserendo un punto e virgola davanti ad esse. Questo perché aggiungeremo i certificati e le chiavi all'interno del file di configurazione del client.

# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
;ca ca.crt
;cert client.crt
;key client.key

Commenta la direttiva tls-auth poiché aggiungeremo ta.key direttamente nel file di configurazione del client.

# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1

Abbina le impostazioni cipher e auth che hai impostato nel file `/etc/openvpn/server/server.conf.

cipher AES-256-GCM
auth SHA256

Aggiungi la direttiva key-direction e impostala su 1 affinché la VPN funzioni correttamente.

key-direction 1

Crea uno script per compilare la configurazione di base con il certificato, la chiave e i file di crittografia pertinenti, quindi copia il file di configurazione generato nella directory ~/client-configs/files.

Crea e apri il file make_config.sh nella directory ~/client-configs.

$ nano ~/client-configs/make_config.sh

Incolla al suo interno il seguente codice.

#!/bin/bash
 
# First argument: Client identifier
 
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
 
cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-crypt>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-crypt>') \
    > ${OUTPUT_DIR}/${1}.ovpn

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Rendere il file eseguibile e limitarne le autorizzazioni.

$ chmod 700 ~/client-configs/make_config.sh

Questo script crea una copia del file base.conf, raccoglie tutti i file del certificato e della chiave, ne estrae il contenuto, li aggiunge al file di configurazione di base ed esporta tutto ciò per creare un nuovo file di configurazione del client . Ogni volta che aggiungi un nuovo client, devi generare nuove chiavi e certificati e quindi eseguire questo script per creare un file di configurazione del client.

Abbiamo già creato il certificato client e i file chiave nel passaggio 7. Creiamo il file di configurazione per lo stesso.

Passa alla directory ~/client-configs.

$ cd ~/client-configs

Eseguire lo script per creare il file di configurazione del client.

$ ./make_config.sh client1

Questo creerà un file chiamato client1.ovpn. Modificare il parametro se si desidera un nome file diverso. Controlla il contenuto della directory.

$ ls ~/client-configs/files
client1.ovpn

Questo è il file di configurazione che devi trasferire sul client che verrà poi utilizzato per connettersi al server OpenVPN. È possibile utilizzare qualsiasi protocollo/programma SFTP per trasferire il file al client.

Passaggio 13: installare e testare la connessione client

Per il nostro tutorial, utilizziamo una macchina client Rocky Linux 9. Installa OpenVPN tramite il seguente comando.

$ sudo dnf install openvpn

Esegui il comando seguente per connettere il client al server VPN.

$ sudo openvpn --config client1.ovpn

Dovresti ottenere un output simile.

2023-02-07 11:42:05 OpenVPN 2.5.8 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Nov  1 2022
2023-02-07 11:42:05 library versions: OpenSSL 3.0.1 14 Dec 2021, LZO 2.10
2023-02-07 11:42:05 Outgoing Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
2023-02-07 11:42:05 Outgoing Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
2023-02-07 11:42:05 Incoming Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
2023-02-07 11:42:05 Incoming Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
2023-02-07 11:42:05 TCP/UDP: Preserving recently used remote address: [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 Socket Buffers: R=[131072->131072] S=[16384->16384]
2023-02-07 11:42:05 Attempting to establish TCP connection with [AF_INET]142.93.225.189:443 [nonblock]
2023-02-07 11:42:05 TCP connection established with [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 TCP_CLIENT link local: (not bound)
2023-02-07 11:42:05 TCP_CLIENT link remote: [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
2023-02-07 11:42:05 TLS: Initial packet from [AF_INET]142.93.225.189:443, sid=7c9feddd a75e1d1f
2023-02-07 11:42:06 VERIFY OK: depth=1, CN=Easy-RSA CA
2023-02-07 11:42:06 VERIFY KU OK
2023-02-07 11:42:06 Validating certificate extended key usage
2023-02-07 11:42:06 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
2023-02-07 11:42:06 VERIFY EKU OK
2023-02-07 11:42:06 VERIFY OK: depth=0, CN=server
2023-02-07 11:42:06 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bit RSA, signature: RSA-SHA256
2023-02-07 11:42:06 [server] Peer Connection Initiated with [AF_INET]142.93.225.189:443
2023-02-07 11:42:06 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 208.67.222.222,dhcp-option DNS 208.67.220.220,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM'
2023-02-07 11:42:06 OPTIONS IMPORT: timers and/or timeouts modified
2023-02-07 11:42:06 OPTIONS IMPORT: --ifconfig/up options modified
2023-02-07 11:42:06 OPTIONS IMPORT: route options modified
2023-02-07 11:42:06 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
2023-02-07 11:42:06 OPTIONS IMPORT: peer-id set
2023-02-07 11:42:06 OPTIONS IMPORT: adjusting link_mtu to 1626
2023-02-07 11:42:06 OPTIONS IMPORT: data channel crypto options modified
2023-02-07 11:42:06 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2023-02-07 11:42:06 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2023-02-07 11:42:06 net_route_v4_best_gw query: dst 0.0.0.0
2023-02-07 11:42:06 net_route_v4_best_gw result: via 10.0.2.2 dev enp0s3
2023-02-07 11:42:06 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:fd:d4:94
2023-02-07 11:42:06 TUN/TAP device tun0 opened
2023-02-07 11:42:06 net_iface_mtu_set: mtu 1500 for tun0
2023-02-07 11:42:06 net_iface_up: set tun0 up
2023-02-07 11:42:06 net_addr_ptp_v4_add: 10.8.0.6 peer 10.8.0.5 dev tun0
2023-02-07 11:42:06 net_route_v4_add: 142.93.225.189/32 via 10.0.2.2 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 0.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 128.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 10.8.0.1/32 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 GID set to nobody
2023-02-07 11:42:06 UID set to nobody
2023-02-07 11:42:06 Initialization Sequence Completed

Puoi verificare la connessione visitando l'URL https://whatismyip.com nel tuo browser e vedrai il tuo indirizzo IP e la posizione del tuo server OpenVPN.

Puoi anche verificare ulteriormente eseguendo un test standard sul sito web https://www.dnsleaktest.com/.

Puoi vedere i nomi host OpenDNS che abbiamo configurato in precedenza e la posizione del server corrisponde alla posizione del server OpenVPN.

Il comando precedente esegue OpenVPN in primo piano, il che significa che il terminale verrà bloccato. Per chiudere la connessione, devi premere Ctrl + C. Tuttavia, puoi eseguire OpenVPN anche in background. Usa il seguente comando per farlo.

sudo openvpn --config client1.ovpn --daemon

Per interrompere la connessione, trovare l'ID del processo.

$ ps aux | grep openvpn

Otterrai un output simile.

nobody      4357  0.3  0.0  13468  8432 ?        Ss   15:35   0:00 openvpn --config client1.ovpn --daemon
username    4406  0.0  0.0  17732  2432 pts/0    S+   15:35   0:00 grep --color=auto openvpn

Come puoi vedere, l'ID del processo corrispondente al processo OpenVPN è 4357. Arresta la connessione VPN utilizzando il comando seguente per terminare il processo.

$ sudo kill -9 4357

OpenVPN offre client GUI per piattaforme Windows, macOS, Android e iOS in cui è possibile importare il file di configurazione del client per connettersi.

Passaggio 14: revoca dei certificati client

Se desideri revocare il certificato di un client per impedirne l'accesso, puoi farlo accedendo al server CA.

Passa alla directory ~/easy-rsa.

$ cd ~/easy-rsa

Esegui lo script con l'opzione revoke seguita dal nome del client.

$ ./easyrsa revoke client1

Ti verrà chiesto se desideri revocare il certificato.

Please confirm you wish to revoke the certificate with the following subject:

subject=
    commonName                = client1


Type the word 'yes' to continue, or any other input to abort.
  Continue with revocation: yes
. . .
Revoking Certificate 8348B3F146A765581946040D5C4D590A
. . .

Ciò revoca il certificato sul server CA. Tuttavia, il server OpenVPN non ha modo di verificare lo stato della revoca. Per questo, dobbiamo generare un elenco di revoche di certificati (CRL) e trasferirlo al server OpenVPN.

Generare la CRL.

$ ./easyrsa gen-crl

Ti verrà richiesta la passphrase CA. Il comando precedente genera un file crl.pem.

Copia questo file sul server OpenVPN.

$ scp ~/easy-rsa/pki/crl.pem username@your_server_ip:/tmp

Accedi nuovamente al server OpenVPN e copia il file CRL nella directory /etc/openvpn/server.

$ sudo cp /tmp/crl.pem /etc/openvpn/server/

Apri il file di configurazione del server OpenVPN per la modifica.

$ sudo nano /etc/openvpn/server/server.conf

Aggiungi la seguente riga in fondo al file. Ciò indica al server OpenVPN di controllare l'elenco di revoche per i client che sono stati limitati.

crl-verify crl.pem

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Riavvia il server OpenVPN per applicare le modifiche.

sudo systemctl restart [email 

Il client non può più connettersi al server OpenVPN.

Conclusione

Con questo si conclude il nostro tutorial sull'installazione e la configurazione del server OpenVPN su un server Rocky Linux 9. Abbiamo anche collegato il client OpenVPN Linux al server. Se avete domande, pubblicatele nei commenti qui sotto.

Articoli correlati: