GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Configura OpenConnect VPN Server (ocserv) su Ubuntu 20.04 con Let's Encrypt

Questo tutorial ti mostrerà come eseguire il tuo server VPN installando il server VPN OpenConnect su Ubuntu 20.04. Server VPN OpenConnect, noto anche come ocserv , è un'implementazione open source del protocollo Cisco AnyConnnect VPN, ampiamente utilizzato nelle aziende e nelle università. AnyConnect è un protocollo VPN basato su SSL che consente ai singoli utenti di connettersi a una rete remota.

Nota :questo tutorial funziona anche su Ubuntu 20.10 e Ubuntu 21.04.

Perché configurare il tuo server VPN?

  • Forse sei un provider di servizi VPN o un amministratore di sistema, che ti conviene configurare il nostro server VPN.
  • Non ti fidi della politica di non registrazione dei fornitori di servizi VPN, quindi segui la strada dell'host autonomo.
  • Puoi utilizzare la VPN per implementare la politica di sicurezza della rete. Ad esempio, se gestisci il tuo server di posta elettronica, puoi richiedere agli utenti di accedere solo dall'indirizzo IP del server VPN creando una whitelist di indirizzi IP nel firewall. Pertanto, il tuo server di posta elettronica è protetto per prevenire attività di hacking.
  • Forse sei solo curioso di sapere come funziona il server VPN.

Caratteristiche del server VPN OpenConnect

  • Leggero e veloce. Nel mio test, posso guardare i video 4K di YouTube con OpenConnect VPN. YouTube è bloccato nel mio paese (Cina).
  • Funziona su Linux e sulla maggior parte dei server BSD.
  • Compatibile con il client Cisco AnyConnect
  • Esistono software client OpenConnect per Linux, MacOS, Windows e OpenWRT. Per Android e iOS, puoi utilizzare Cisco AnyConnect Client.
  • Supporta l'autenticazione della password e l'autenticazione del certificato
  • Supporta la contabilità RADIUS.
  • Supporta l'hosting virtuale (domini multipli).
  • Facile da configurare

Mi piace particolarmente il fatto che, rispetto ad altre tecnologie VPN, sia molto facile e conveniente per l'utente finale utilizzare OpenConnect VPN. Ogni volta che installo una distribuzione Linux sul mio computer e voglio sbloccare rapidamente siti Web o nascondere il mio indirizzo IP, installo il client OpenConnect e mi collego al server con solo due righe di comandi:

sudo apt install openconnect

sudo openconnect -b vpn.mydomain.com

C'è anche un client VPN OpenConnect per Fedora, RHEL, CentOS, Arch Linux e OpenSUSE. Puoi installarlo facilmente con il tuo gestore di pacchetti.

sudo dnf install openconnect
sudo yum install openconnect
sudo pacman -S openconnect

Requisiti

Per seguire questo tutorial, avrai bisogno di un VPS (Virtual Private Server) che possa accedere liberamente ai siti web bloccati (fuori dal tuo paese o sistema di filtraggio Internet). Raccomando Kamatera VPS, che include:

  • 30 giorni di prova gratuita.
  • A partire da $ 4 al mese (1 GB di RAM)
  • VPS basato su KVM ad alte prestazioni
  • 9 data center in tutto il mondo, inclusi Stati Uniti, Canada, Regno Unito, Germania, Paesi Bassi, Hong Kong e Israele.

Segui il tutorial collegato di seguito per creare il tuo server VPS Linux su Kamatera.

  • Come creare un server VPS Linux su Kamatera

Una volta che hai un VPS che esegue Ubuntu 20.04, segui le istruzioni seguenti.

È inoltre necessario un nome di dominio per abilitare HTTPS per OpenConnect VPN. Ho registrato il mio nome di dominio da NameCheap perché il prezzo è basso e offrono protezione della privacy a Whois gratuita per tutta la vita.

Passaggio 1:installa OpenConnect VPN Server su Ubuntu 20.04

Accedi al tuo server Ubuntu 20.04. Quindi usa apt per installare ocserv pacchetto dal repository Ubuntu predefinito.

sudo apt update
sudo apt install ocserv

Una volta installato, il server OpenConnect VPN viene avviato automaticamente. Puoi verificarne lo stato con:

systemctl status ocserv

Esempio di output:

● ocserv.service - OpenConnect SSL VPN server
     Loaded: loaded (/lib/systemd/system/ocserv.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2020-04-12 19:57:08 HKT; 12s ago
       Docs: man:ocserv(8)
   Main PID: 216409 (ocserv-main)
      Tasks: 2 (limit: 9451)
     Memory: 1.6M
     CGroup: /system.slice/ocserv.service
             ├─216409 ocserv-main
             └─216429 ocserv-sm

Suggerimento:se il comando precedente non si chiude immediatamente, puoi premere il tasto Q per riprendere il controllo del terminale.

Se non è in esecuzione, puoi avviarlo con:

sudo systemctl start ocserv

Per impostazione predefinita, il server VPN OpenConnect è in ascolto sulla porta TCP e UDP 443. Se viene utilizzato dal server Web, è probabile che il server VPN non si avvii. Vedremo come modificare la porta nel file di configurazione di OpenConnect VPN in seguito.

Se è presente un firewall in esecuzione sul tuo server, dovrai aprire le porte 80 e 443. Ad esempio, se usi UFW, esegui il comando seguente.

sudo ufw allow 80,443/tcp

Passaggio 2:installa Let's Encrypt Client (Certbot) su Ubuntu 20.04 Server

Il gnutls-bin pacchetto installato insieme a ocserv fornisce strumenti per creare la tua CA e il tuo certificato server, ma otterremo e installeremo il certificato Let's Encrypt. Il vantaggio dell'utilizzo del certificato Let's Encrypt è che è gratuito, più facile da configurare e considerato affidabile dal software client VPN.

Esegui i seguenti comandi per installare il client Let's Encrypt (certbot) dal repository Ubuntu predefinito.

sudo apt install certbot

Per controllare il numero di versione, esegui

certbot --version

Esempio di output:

certbot 0.40.0

Fase 3:ottieni un certificato TLS affidabile da Let's Encrypt

Consiglio di utilizzare il standalone o webroot plug-in per ottenere il certificato TLS per ocserv.

Plugin autonomo

Se non è presente alcun server Web in esecuzione sul server Ubuntu 20.04 e si desidera che il server OpenConnect VPN utilizzi la porta 443, è possibile utilizzare il plug-in autonomo per ottenere il certificato TLS da Let's Encrypt. Esegui il comando seguente. Non dimenticare di impostare un record per il tuo nome di dominio.

sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d vpn.example.com

Dove:

  • certonly :Ottieni un certificato ma non installarlo.
  • --standalone :usa il plugin standalone per ottenere un certificato
  • --preferred-challenges http :esegui la verifica http-01 per convalidare il nostro dominio, che utilizzerà la porta 80.
  • --agree-tos :Accetta i termini di servizio di Let's Encrypt.
  • --email :l'indirizzo e-mail viene utilizzato per la registrazione e il recupero dell'account.
  • -d :Specifica il tuo nome di dominio.

Come puoi vedere dallo screenshot seguente, ho ottenuto con successo il certificato.

Utilizzo del plug-in webroot

Se il tuo server Ubuntu 20.04 ha un server web in ascolto sulle porte 80 e 443, allora è una buona idea usare il plugin webroot per ottenere un certificato perché il plugin webroot funziona praticamente con tutti i server web e non è necessario installare il certificato nel server web.

Innanzitutto, devi creare un host virtuale per vpn.example.com.

Apache

Se stai usando Apache, allora

sudo nano /etc/apache2/sites-available/vpn.example.com.conf

E incolla le seguenti righe nel file.

<VirtualHost *:80>        
        ServerName vpn.example.com

        DocumentRoot /var/www/ocserv
</VirtualHost>

Salva e chiudi il file. Quindi crea la directory principale web.

sudo mkdir /var/www/ocserv

Imposta www-data (utente Apache) come proprietario della radice web.

sudo chown www-data:www-data /var/www/ocserv -R

Abilita questo host virtuale.

sudo a2ensite vpn.example.com

Ricarica Apache per rendere effettive le modifiche.

sudo systemctl reload apache2

Una volta creato e abilitato l'host virtuale, esegui il comando seguente per ottenere il certificato Let's Encrypt utilizzando il plug-in webroot.

sudo certbot certonly --webroot --agree-tos --email [email protected] -d vpn.example.com -w /var/www/ocserv

Nginx

Se stai usando Nginx, allora

sudo nano /etc/nginx/conf.d/vpn.example.com.conf

Incolla le seguenti righe nel file.

server {
      listen 80;
      server_name vpn.example.com;

      root /var/www/ocserv/;

      location ~ /.well-known/acme-challenge {
         allow all;
      }
}

Salva e chiudi il file. Quindi crea la directory principale web.

sudo mkdir -p /var/www/ocserv

Imposta www-data (utente Nginx) come proprietario della radice web.

sudo chown www-data:www-data /var/www/ocserv -R

Ricarica Nginx per rendere effettive le modifiche.

sudo systemctl reload nginx

Una volta creato e abilitato l'host virtuale, esegui il comando seguente per ottenere il certificato Let's Encrypt utilizzando il plug-in webroot.

sudo certbot certonly --webroot --agree-tos --email [email protected] -d vpn.example.com -w /var/www/ocserv

Fase 4:modifica il file di configurazione del server VPN OpenConnect

Modifica il file di configurazione principale di ocserv.

sudo nano /etc/ocserv/ocserv.conf

Innanzitutto, dobbiamo configurare l'autenticazione della password. Per impostazione predefinita, è abilitata l'autenticazione della password tramite PAM (Pluggable Authentication Modules), che consente di utilizzare gli account di sistema Ubuntu per accedere dai client VPN. Questo comportamento può essere disabilitato commentando la riga seguente.

auth = "pam[gid-min=1000]"

Se desideriamo che gli utenti utilizzino account VPN separati anziché account di sistema per l'accesso, è necessario aggiungere la riga seguente per abilitare l'autenticazione della password con un file di password.

auth = "plain[passwd=/etc/ocserv/ocpasswd]"

Dopo aver finito di modificare questo file di configurazione, vedremo come usare ocpasswd strumento per generare il /etc/ocserv/ocpasswd file, che contiene un elenco di nomi utente e password codificate.

Nota :Ocserv supporta l'autenticazione del certificato client, ma Let's Encrypt non emette il certificato client. Devi configurare la tua CA per emettere il certificato client.

Quindi, se non desideri che ocserv utilizzi la porta TCP e UDP 443, trova le due righe seguenti e modifica il numero di porta. Altrimenti lasciali soli.

tcp-port = 443
udp-port = 443

Quindi trova le due righe seguenti. Dobbiamo cambiarli.

server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem
server-key = /etc/ssl/private/ssl-cert-snakeoil.key

Sostituisci l'impostazione predefinita con il percorso del certificato del server Let's Encrypt e il file della chiave del server.

server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pem
server-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem

Quindi, imposta il numero massimo di client. Il valore predefinito è 128. Impostato su zero per illimitato.

max-clients = 128

Imposta il numero di dispositivi da cui un utente può accedere contemporaneamente. Il valore predefinito è 2. Impostato su zero per illimitato.

max-same-clients = 2

Per impostazione predefinita, i pacchetti keep-alive vengono inviati ogni 300 secondi (5 minuti). Preferisco utilizzare un tempo breve (30 secondi) per ridurre la possibilità di interruzione della connessione VPN.

keepalive = 30

Quindi, trova la riga seguente. Cambia false su true per abilitare il rilevamento MTU, che può ottimizzare le prestazioni VPN.

try-mtu-discovery = false

È possibile impostare il tempo in cui un client può rimanere inattivo prima di essere disconnesso tramite i due parametri seguenti. Se preferisci che il client rimanga connesso indefinitamente, commenta questi due parametri.

idle-timeout=1200
mobile-idle-timeout=1800

Successivamente, imposta il dominio predefinito su vpn.example.com.

default-domain = vpn.example.com

La configurazione della rete IPv4 è la seguente per impostazione predefinita. Ciò causerà problemi perché molti router domestici impostano anche l'intervallo di rete IPv4 su 192.168.1.0/24 .

ipv4-network = 192.168.1.0
ipv4-netmask = 255.255.255.0

Possiamo usare un altro intervallo di indirizzi IP privati ​​(10.10.10.0/24) per evitare la collisione di indirizzi IP, quindi cambia il valore di ipv4-network a

ipv4-network = 10.10.10.0

Ora decommenta la riga seguente per eseguire il tunneling di tutte le query DNS tramite la VPN.

tunnel-all-dns = true

Gli indirizzi del resolver DNS predefiniti sono i seguenti, il che va bene.

dns = 8.8.8.8
dns = 1.1.1.1

Nota :Se sei un provider di servizi VPN, è buona norma eseguire il tuo resolver DNS sullo stesso server. Se è presente un resolver DNS in esecuzione sullo stesso server, specifica il DNS come

dns = 10.10.10.1

10.10.10.1 è l'indirizzo IP del server OpenConnect VPN nella VPN LAN. Ciò accelererà un po' le ricerche DNS per i client perché viene eliminata la latenza di rete tra il server VPN e il risolutore DNS.

Quindi commenta tutti i parametri del percorso (aggiungi il simbolo # all'inizio delle righe seguenti), che imposterà il server come gateway predefinito per i client.

#route = 10.0.0.0/8
#route = 172.16.0.0/12
#route = 192.168.0.0/16
#route = fd00::/8
#route = default

#no-route = 192.168.5.0/255.255.255.0

Salva e chiudi il file Quindi riavvia il server VPN per rendere effettive le modifiche.

sudo systemctl restart ocserv

Passaggio 5:crea account VPN

Ora usa lo strumento ocpasswd per generare account VPN.

sudo ocpasswd -c /etc/ocserv/ocpasswd username

Ti verrà chiesto di impostare una password per l'utente e le informazioni verranno salvate in /etc/ocserv/ocpasswd file. Per reimpostare la password, esegui nuovamente il comando precedente.

Passaggio 6:abilita l'inoltro IP

Affinché il server VPN instrada i pacchetti tra i client VPN e Internet, è necessario abilitare l'inoltro IP. Modifica sysctl.conf file.

sudo nano /etc/sysctl.conf

Aggiungi la seguente riga alla fine di questo file.

net.ipv4.ip_forward = 1

Salva e chiudi il file. Quindi applica le modifiche con il comando seguente. Il -p l'opzione caricherà le impostazioni di sysctl da /etc/sysctl.conf file. Questo comando conserverà le nostre modifiche durante i riavvii del sistema.

sudo sysctl -p

Passaggio 7:Configura IP Masquerading in Firewall

Abbiamo bisogno di impostare il mascheramento IP nel firewall del server, in modo che il server diventi un router virtuale per i client VPN. Userò UFW, che è un front-end per il firewall iptables. Installa UFW su Ubuntu con:

sudo apt install ufw

Innanzitutto, devi consentire il traffico SSH.

sudo ufw allow 22/tcp

Quindi trova il nome dell'interfaccia di rete principale del tuo server.

ip addr

Come puoi vedere, si chiama ens3 sul mio server Ubuntu.

Per configurare il mascheramento IP, dobbiamo aggiungere il comando iptables in un file di configurazione UFW.

sudo nano /etc/ufw/before.rules

Per impostazione predefinita, ci sono alcune regole per il filter tavolo. Aggiungi le seguenti righe alla fine di questo file. Sostituisci ens3 con il tuo nome di interfaccia di rete.

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.10.10.0/24 -o ens3 -j MASQUERADE

# End each table with the 'COMMIT' line or these rules won't be processed
COMMIT

Nell'editor di testo Nano, puoi andare alla fine del file premendo Ctrl+W , quindi premendo Ctrl+V .

Le righe precedenti verranno aggiunte (-A ) una regola fino alla fine di POSTROUTING catena di nat tavolo. Collegherà la tua rete privata virtuale con Internet. E nascondi anche la tua rete dal mondo esterno. Quindi Internet può vedere solo l'IP del tuo server VPN, ma non può vedere l'IP del tuo client VPN, proprio come il tuo router domestico nasconde la tua rete domestica privata.

Per impostazione predefinita, UFW vieta l'inoltro dei pacchetti. Possiamo consentire l'inoltro per la nostra rete privata. Trova il ufw-before-forward catena in questo file e aggiungi le seguenti 3 righe, che accetteranno l'inoltro di pacchetti se l'IP di origine o di destinazione è nel 10.10.10.0/24 intervallo.

# allow forwarding for trusted network
-A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT

Salva e chiudi il file. Quindi abilita UFW.

sudo ufw enable

Se hai abilitato UFW in precedenza, puoi utilizzare systemctl per riavviare UFW.

sudo systemctl restart ufw

Ora se elenchi le regole nella catena POSTROUTING della tabella NAT usando il seguente comando:

sudo iptables -t nat -L POSTROUTING

Puoi vedere la regola della Masquerade.

Potrebbe volerci del tempo prima che UFW elabori le regole del firewall. Se la regola della mascherata non viene visualizzata, riavvia nuovamente UFW (sudo systemctl restart ufw ).

Fase 8:apri la porta 443 nel firewall

Esegui il comando seguente per aprire la porta TCP e UDP 443. Se hai configurato una porta diversa per ocserv, cambia 443 nella porta configurata.

sudo ufw allow 443/tcp
sudo ufw allow 443/udp

Ora il server OpenConnect VPN è pronto per accettare le connessioni client.

Se esegui un risolutore DNS locale

Per quelli di voi che utilizzano un resolver DNS locale, se avete specificato 10.10.10.1 come server DNS per i client VPN, dovete consentire ai client VPN di connettersi alla porta 53 con la seguente regola UFW.

sudo ufw insert 1 allow in from 10.10.10.0/24

È inoltre necessario modificare il file di configurazione del server DNS BIND (/etc/bind/named.conf.options ) per consentire ai client VPN di inviare query DNS ricorsive come di seguito.

allow-recursion { 127.0.0.1; 10.10.10.0/24; };

Quindi riavvia BIND.

sudo systemctl restart named

Come installare e utilizzare il client VPN OpenConnect su Ubuntu 20.04 Desktop

Esegui il comando seguente per installare il client della riga di comando OpenConnect VPN sul desktop di Ubuntu.

sudo apt install openconnect

Puoi connetterti a VPN dalla riga di comando come di seguito. -b flag lo farà funzionare in background dopo che la connessione è stata stabilita.

sudo openconnect -b vpn.example.com:port-number

Ti verrà chiesto di inserire nome utente e password VPN. Se la connessione viene stabilita correttamente, vedrai il seguente messaggio.

Got CONNECT response: HTTP/1.1 200 CONNECTED
CSTP connected. DPD 90, Keepalive 32400
Connected tun0 as 192.168.1.139, using SSL
Established DTLS connection (using GnuTLS). Ciphersuite (DTLS1.2)-(RSA)-(AES-256-GCM).

Per interrompere la connessione, esegui:

sudo pkill openconnect

Per eseguire il client in modo non interattivo, utilizza la seguente sintassi.

echo -n password | sudo openconnect -b vpn.example.com -u username --passwd-on-stdin

Se desideri utilizzare Network Manager per gestire la connessione VPN, devi installare anche questi pacchetti.

sudo apt install network-manager-openconnect network-manager-openconnect-gnome

Se sei connesso correttamente al server VPN, ma il tuo indirizzo IP pubblico non cambia, è perché l'inoltro IP o il mascheramento IP non funzionano. Una volta ho avuto un errore di battitura nel mio comando iptables (usando un intervallo di indirizzi IP errato), che ha impedito al mio computer di navigare in Internet.

Se si verifica il seguente errore, è necessario disabilitare la porta UDP in ocserv, come spiegato più avanti in ottimizzazione della velocità sezione.

DTLS handshake failed: Resource temporarily unavailable, try again

Se riscontri il seguente errore, è probabile che la password del tuo account VPN sia errata.

fgets (stdin): Inappropriate ioctl for device

Connessione automatica all'avvio del sistema

Per consentire al client OpenConnect VPN di connettersi automaticamente al server all'avvio, possiamo creare un'unità di servizio systemd.

sudo nano /etc/systemd/system/openconnect.service

Inserisci le seguenti righe nel file. Sostituisci il testo rosso.

[Unit]
  Description=OpenConnect VPN Client
  After=network-online.target systemd-resolved.service
  Wants=network-online.target

[Service]
  Type=simple
  ExecStart=/bin/bash -c '/bin/echo -n password | /usr/sbin/openconnect vpn.example.com -u username --passwd-on-stdin'
  KillSignal=SIGINT
  Restart=always
  RestartSec=2

[Install]
  WantedBy=multi-user.target

Salva e chiudi il file. Quindi abilita questo servizio in modo che si avvii all'avvio.

sudo systemctl enable openconnect.service

Spiegazione del contenuto del file:

  • After=network-online.target systemd-resolved.service e Wants=network-online.target eseguire questo servizio dopo che la rete è attiva. Vogliamo il openconnect.service inizia dopo il systemd-resolved.service perché ciò assicurerà che l'indirizzo del server DNS impostato da OpenConnect non venga sovrascritto da systemd-resolved.service .
  • In realtà, questo servizio può ancora essere eseguito prima che la rete sia attiva. Aggiungiamo Restart=always e RestartSec=2 per riavviare questo servizio dopo 2 secondi se questo servizio non riesce.
  • Systemd non riconosce il reindirizzamento della pipe, quindi in ExecStart direttiva, avvolgiamo il comando tra virgolette singole ed eseguiamolo con la shell Bash.
  • Poiché il client OpenConnect VPN verrà eseguito come un servizio systemd, che viene eseguito in background, non è necessario aggiungere -b contrassegnare su openconnect comando.
  • Il KillSignal la direttiva dice a Systemd di inviare il SIGINT segnale quando systemctl stop openconnect viene impartito il comando. Ciò eseguirà un arresto pulito disconnettendo la sessione e ripristinando le impostazioni del server DNS e la tabella di routing del kernel Linux.

Per avviare immediatamente questo servizio Systemd, esegui

sudo systemctl start openconnect

Per interrompere questo servizio Systemd, esegui

sudo systemctl stop openconnect

Come riavviare automaticamente il client OpenConnect quando si riprende dalla sospensione

Se il tuo desktop Ubuntu entra in stato di sospensione, il client OpenConnect perderebbe la connessione al server VPN. Per farlo ripartire automaticamente quando si riprende dalla sospensione, è necessario creare un'altra unità di servizio systemd.

sudo nano /etc/systemd/system/openconnect-restart.service

Aggiungi le seguenti righe nel file.

[Unit]
Description=Restart OpenConnect client when resuming from suspend
After=suspend.target

[Service]
Type=simple
ExecStart=/bin/systemctl --no-block restart openconnect.service

[Install]
WantedBy=suspend.target

Salva e chiudi il file. Quindi abilita questo servizio.

sudo systemctl enable openconnect-restart.service

Riavvio automatico quando la connessione VPN si interrompe

A volte la connessione VPN si interrompeva per altri motivi. È possibile eseguire il comando seguente per verificare se il client VPN può eseguire il ping dell'indirizzo IP privato del server VPN (10.10.10.1). Se il ping non riesce, il comando a destra verrà eseguito per riavviare il client VPN. || è l'operatore OR in Bash. Esegue il comando a destra solo se il comando a sinistra ha restituito un errore.

ping -c9 10.10.10.1 || systemctl restart openconnect

Il ping verrà eseguito 9 volte, ovvero 9 secondi. Puoi utilizzare un ciclo infinito nella shell Bash per far funzionare l'intero comando per sempre. Premi Ctrl+C per fermarlo.

for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done

Ora possiamo creare un servizio systemd per questa attività.

sudo nano /etc/systemd/system/openconnect-check.service

Aggiungi le seguenti righe a questo file. Specifichiamo che questo servizio deve essere eseguito dopo il openconnect.service .

[Unit]
Description=OpenConnect VPN Connectivity Checker
After=openconnect.service

[Service]
Type=simple
ExecStart=/bin/bash -c 'for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done'

[Install]
WantedBy=multi-user.target

Salva e chiudi il file. Quindi avvia questo servizio.

sudo systemctl start openconnect-check

Abilita l'avvio automatico all'avvio.

sudo systemctl enable openconnect-check

Una volta avviato questo servizio, il comando ping verrà eseguito per sempre. Se la connessione VPN si interrompe, si riavvierà automaticamente openconnect.service .

Client GUI OpenConnect per Windows e macOS

Possono essere scaricati dalla pagina Github della GUI di OpenConnect.

Velocità

OpenConnect VPN è piuttosto veloce. Posso usarlo per guardare video 4k su YouTube. Come puoi vedere, la mia velocità di connessione è 63356 Kbps , che si traduce in 61 Mbit/s .

Ed ecco i risultati del test su speedtest.net.

Ottimizzazione della velocità

OpenConnect per impostazione predefinita utilizza il protocollo TLS su UDP (DTLS) per ottenere una velocità maggiore, ma UDP non può fornire una trasmissione affidabile. TCP è più lento di UDP ma può fornire una trasmissione affidabile. Un consiglio per l'ottimizzazione che posso darti è disabilitare DTLS, utilizzare TLS standard (su TCP), quindi abilitare TCP BBR per aumentare la velocità TCP.

Per disabilitare DTLS, commenta (aggiungi # simbolo all'inizio) la riga seguente nel file di configurazione ocserv.

udp-port = 443

Salva e chiudi il file. Quindi riavvia il servizio ocserv.

sudo systemctl restart ocserv.service

Per abilitare TCP BBR, dai un'occhiata al seguente tutorial. Nota che devi disabilitare DTLS in ocserv, altrimenti TCP BBR non funzionerà.

  • Come aumentare facilmente le prestazioni della rete di Ubuntu abilitando TCP BBR

Nel mio test, TLS standard con TCP BBR abilitato è due volte più veloce di DTLS.

Un altro fattore molto importante che influisce sulla velocità è quanto è buona la connessione tra il tuo computer locale e il server VPN. Se vivi in ​​Medio Oriente e il server VPN si trova negli Stati Uniti, la velocità sarebbe lenta. Scegli un data center vicino a dove vivi.

Inoltre, controlla la media del carico della CPU. (htop può essere installato da sudo apt install htop ).

htop

Assicurati che il carico medio della CPU sia inferiore a 1 . Una volta avevo una media di carico della CPU di 3 , che ha causato un'elevata latenza tra il client VPN e il server VPN.

Rinnovo automatico del certificato Let's Encrypt

Modifica il file crontab dell'utente root.

sudo crontab -e

Aggiungi la riga seguente alla fine del file. È necessario ricaricare il servizio ocserv affinché il server VPN raccolga il nuovo certificato e il file chiave.

@daily certbot renew --quiet && systemctl reload ocserv

Suggerimenti per la risoluzione dei problemi

OpenVZ

Tieni presente che se stai utilizzando OpenVZ VPS, assicurati di abilitare il dispositivo di rete virtuale TUN nel pannello di controllo del VPS. (Se usi Vultr VPS, hai un VPS basato su KVM, quindi non devi preoccuparti di questo.)

File di registro

In caso di problemi, controlla il registro del server VPN OpenConnect.

sudo journalctl -eu ocserv.service

Ho scoperto che se cambio la porta 443 con una porta diversa, il grande firewall cinese bloccherà questa connessione VPN.

Modalità debug

Se ocserv ti dice che non può caricare il /etc/ocserv/ocserv.conf file, puoi interrompere ocserv.

sudo systemctl stop ocserv

Quindi eseguilo in primo piano con il debug abilitato.

sudo /usr/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf --debug=10

Quindi l'output potrebbe darti alcuni indizi sul perché ocserv non funziona.

Impossibile navigare in Internet

Se sei connesso correttamente al server VPN, ma non riesci a navigare in Internet, è perché l'inoltro IP o il mascheramento IP non funzionano. Ricordo che il mio provider VPS una volta ha eseguito un aggiornamento della piattaforma, che ha cambiato il nome dell'interfaccia di rete principale da ens3 a enp3s0 , quindi ho dovuto aggiornare il nome nel file UFW (/etc/ufw/before.rules ).

Errore di sintassi

Se vedi il seguente errore quando tenti di stabilire una connessione VPN, è probabilmente perché c'è un errore di sintassi nel tuo file di configurazione ocserv. Controlla il diario (sudo journalctl -eu ocserv ) per scoprirlo.

Got inappropriate HTTP CONNECT response: HTTP/1.1 401 Cookie is not acceptable

Riavvia il computer

Se visualizzi il seguente errore quando tenti di stabilire una connessione VPN, è probabile che si tratti di un problema con il computer locale. Prova a riavviare il computer.

Server 'vpn.your-domain.com' requested Basic authentication which is disabled by default

La connessione TLS è stata interrotta in modo non corretto

Se vedi il seguente errore sul client quando tenti di stabilire una connessione VPN,

SSL connection failure: The TLS connection was non-properly terminated.

probabilmente dovresti riavviare ocserv servizio sul server VPN.

sudo systemctl restart ocserv

Puoi creare un cron job per riavviare automaticamente ocserv una volta al giorno alle 4 del mattino.

sudo crontab -e

Aggiungi la riga seguente.

0 4 * * * systemctl restart ocserv

Salva e chiudi il file.

Fai in modo che il server VPN OpenConnect e il server Web utilizzino la porta 443 contemporaneamente

Si prega di leggere il seguente articolo:

  • Esegui OpenConnect VPN Server e Apache/Nginx sulla stessa casella con HAProxy

Come disabilitare TLS 1.0 e TLS 1.1 in ocserv

Il consiglio PCI ha deprecato TLS 1.0 il 30 giugno 2018 e i browser Web mainstream disabiliteranno TLS 1.0 e TLS 1.1 nel 2020. Dovremmo fare lo stesso con il server VPN. Modifica il file di configurazione principale.

sudo nano /etc/ocserv/ocserv.conf

Trova la riga seguente:

tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128"

Per disabilitare TLS 1.0 e TLS 1.1 nel server OpenConnect VPN, aggiungi semplicemente -VERS-TLS1.0 e -VERS-TLS1.1 nella riga.

tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1"

Salva e chiudi il file. Quindi riavvia ocserv.

sudo systemctl restart ocserv

Ora ocserv accetterà solo TLS 1.3 e TLS 1.2. Per ulteriori informazioni sulla configurazione del parametro TLS in ocserv, vedere le stringhe di priorità di GnuTLS.

Per verificare se TLS 1.0 è supportato nel tuo server OpenConnect VPN, esegui il comando seguente.

openssl s_client -connect vpn.your-domain.com:443 -tls1

E controlla TLS 1.1

openssl s_client -connect vpn.your-domain.com:443 -tls1_1

Se nell'output viene visualizzato il seguente messaggio, significa che la versione TLS non è supportata.

New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported

Configurazione per utente o per gruppo

Ocserv consente configurazioni per utente e per gruppo. Per abilitare questa funzione, decommenta le seguenti due righe in /etc/ocserv/ocserv.conf file.

config-per-user = /etc/ocserv/config-per-user/
config-per-group = /etc/ocserv/config-per-group/

Salva e chiudi il file. Quindi crea la directory di configurazione per utente e per gruppo.

sudo mkdir /etc/ocserv/config-per-user/
sudo mkdir /etc/ocserv/config-per-group/

Successivamente, puoi creare un file in queste due directory. Ad esempio, crea il user1 per consentire la configurazione personalizzata per user1 .

sudo nano /etc/ocserv/config-per-user/user1

Puoi anche creare il group1 per consentire la configurazione personalizzata per il gruppo denominato group1 .

sudo nano /etc/ocserv/config-per-group/group1

Puoi aggiungere qualcosa come di seguito nel file per abilitare lo split tunneling.

route = 10.10.10.0/255.255.255.0
tunnel-all-dns = false
dns = 8.8.8.8
dns = 1.1.1.1

Dove:

  • La prima riga significa che dopo user1 o utenti in group1 connettiti a questo server VPN, invia solo il traffico al 10.10.10.0/24 la rete verrà instradata tramite server VPN. Il traffico verso altri indirizzi IP viene instradato tramite il gateway originale.
  • La seconda riga disabilita il tunneling delle query DNS.
  • La terza e la quarta riga impostano i server DNS per i client VPN.

Uso questo trucco per consentire al mio altro VPS (server privato virtuale) di connettersi a questo server VPN senza interrompere il normale traffico, quindi il dispositivo TUN (vpns0) del mio server VPN è sempre acceso, il che significa che il mio server VPN avrà sempre il indirizzo IP privato 10.10.10.1.

Salva e chiudi il file. Riavvia ocserv affinché le modifiche abbiano effetto.

sudo systemctl restart ocserv

Tieni presente che se abiliti IPv6 in ocserv, devi anche aggiungere l'intervallo di rete IPv6 per utilizzare il tunneling diviso.

route = 10.10.10.0/255.255.255.0
route = fda9:4efe:7e3b:03ea::/48
tunnel-all-dns = false
dns = 8.8.8.8
dns = 1.1.1.1

Se desideri escludere un indirizzo IP dal percorso predefinito, utilizza no-route .

no-route = 12.34.56.78/32

Ciò significa che tutto il resto del traffico passerà attraverso il tunnel VPN ad eccezione del traffico verso IP 12.34.56.78. i parametri route e no-route accettano sia la notazione netmask (10.10.10.0/255.255.255.0) che la notazione CIDR (12.34.56.78/32)

Se visualizzi il seguente errore dopo aver abilitato lo split tunneling, è probabilmente perché non hai utilizzato la maschera di rete o la notazione CIDR.

could not parse proxy protocol header; discarding connection

Dividi tunneling per Paese

Diciamo che vuoi solo che il traffico verso le contee estere venga incanalato dalla VPN. Il traffico verso il tuo paese dovrebbe utilizzare il percorso normale. Puoi usare il no-route direttiva nel file di configurazione ocserv per ottenere ciò.

Innanzitutto, devi scaricare l'intervallo IP per il tuo paese andando su questa pagina Web:https://www.ip2location.com/free/visitor-blocker, che ti consente di scaricare l'intervallo di indirizzi IP in formato CIDR.

Salva l'intervallo IP in un file di testo ip2location.txt ed esegui il seguente comando nel tuo terminale Linux per aggiungere no-route = all'inizio di ogni riga.

sed 's/^/no-route = /' -i ip2localtion.txt

Ora apri il file in un editor di testo e copia tutte le righe in esso contenute. Dobbiamo aggiungere queste righe nel file di configurazione di ocserv. Se ci sono troppe righe, puoi aggiungere queste righe al file di configurazione per utente.

sudo nano /etc/ocserv/config-per-user/user1

Puoi anche aggiungerli al file di configurazione per gruppo, quindi aggiungere utenti al gruppo.

Riavvia ocserv per rendere effettive le modifiche.

sudo systemctl restart ocserv

Come abilitare IPv6 in OpenConnect VPN

Se il tuo server VPN ha un indirizzo IPv6 pubblico, puoi abilitare IPv6 in OpenConnect VPN. Modifica il file di configurazione ocserv.

sudo nano /etc/ocserv/ocserv.conf

Trova le due righe seguenti e decommentale.

ipv6-network = fda9:4efe:7e3b:03ea::/48
ipv6-subnet-prefix = 64

Salva e chiudi il file. Riavvia ocserv per rendere effettive le modifiche.

sudo systemctl restart ocserv

Quindi dobbiamo abilitare l'inoltro IP per IPv6. Modifica sysctl.conf file.

sudo nano /etc/sysctl.conf

Aggiungi la seguente riga alla fine di questo file.

net.ipv6.conf.all.forwarding=1

Salva e chiudi il file. Quindi applica le modifiche con il comando seguente.

sudo sysctl -p

Successivamente, dobbiamo configurare il masquerading IPv6 nel firewall del server, in modo che il server diventi un router virtuale per i client VPN.

sudo nano /etc/ufw/before6.rules

Per impostazione predefinita, ci sono alcune regole per il filter tavolo. Aggiungi le seguenti righe alla fine di questo file. Sostituisci ens3 con il tuo nome di interfaccia di rete.

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens3 -j MASQUERADE

# End each table with the 'COMMIT' line or these rules won't be processed
COMMIT

Nell'editor di testo Nano, puoi andare alla fine del file premendo Ctrl+W , quindi premendo Ctrl+V .

Per impostazione predefinita, UFW vieta l'inoltro dei pacchetti. Possiamo consentire l'inoltro per la nostra rete IPv6 privata. Trova il ufw6-before-forward catena in questo file e aggiungi le 3 righe seguenti, che accetteranno l'inoltro di pacchetti se l'IP di origine o di destinazione è nel fda9:4efe:7e3b:03ea::/48 intervallo.

Salva e chiudi il file. Riavvia UFW per rendere effettive le modifiche.

sudo systemctl restart ufw

Ora se elenchi le regole nella catena POSTROUTING della tabella NAT usando il seguente comando:

sudo ip6tables -t nat -L POSTROUTING

Puoi vedere la regola della Masquerade.

Disconnetti la connessione VPN corrente, aggiungi un record AAAA per vpn.example.com e ristabilire la connessione VPN. Quindi vai su https://test-ipv6.com/ per controllare la tua connettività IPv6.

Se esegui il tuo risolutore DNS BIND sul server VPN, puoi aggiungere la seguente riga in /etc/ocserv/ocserv.conf per impostare il server VPN come risolutore DNS per i client VPN.

dns = fda9:4efe:7e3b::1

Salva e chiudi il file. Per eseguire query sui nomi DNS in IPv6, è necessario configurare BIND per consentire i client VPN IPv6.

sudo nano /etc/bind/named.conf.options

Trova il parametro di ricorsione consentita e modificalo in:

allow-recursion { 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; };

Salva e chiudi il file. Riavvia BIND9.

sudo systemctl restart named

Dobbiamo anche consentire il client VPN IPv6 nel firewall.

sudo ufw allow in from fda9:4efe:7e3b:03ea::/48

Hosting virtuale

Nota :se desideri solo avere la possibilità di utilizzare più nomi host per il server VPN, puoi utilizzare certbot per ottenere un certificato multidominio. Quindi riavvia ocserv e il gioco è fatto.

Per aggiungere un nuovo host virtuale in ocserv, devi prima utilizzare il metodo nel passaggio 3 per ottenere un certificato TLS per il nuovo host virtuale. Quindi modifica il file di configurazione di ocserv.

sudo nano /etc/ocserv/ocserv.conf

Vai in fondo a questo file. Nell'editor di testo Nano, puoi premere Ctrl+W , quindi Ctrl+V per passare alla fine di un file. Aggiungi le seguenti righe. Sostituisci vpn2.example.com con il nome host del secondo host virtuale.

[vhost:vpn2.example.com]
#Allow password authentication and certificate authentication
enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]"
auth = "certificate"

tcp-port = 443

#uncomment the two lines if ocserv runs behind HAProxy.
#listen-host = 127.0.0.1
#listen-proxy-proto = true

# SSL/TLS configuration
ca-cert = /etc/ocserv/ssl/ca-cert.pem
server-cert = /etc/letsencrypt/live/vpn2.example.com/fullchain.pem
server-key = /etc/letsencrypt/live/vpn2.example.com/privkey.pem
cert-user-oid = 0.9.2342.19200300.100.1.1

#Networking configuration. Use a different network range for this virtual host. 
device = vpns
ipv4-network = 10.10.20.0
ipv4-netmask = 255.255.255.0
route = default
dns = 8.8.8.8
tunnel-all-dns = true

compression = true
max-clients = 0
max-same-clients = 0
try-mtu-discovery = true
idle-timeout=1200
mobile-idle-timeout=2400

config-per-user = /etc/ocserv/config-per-user/
config-per-group = /etc/ocserv/config-per-group/

Salva e chiudi il file. Quindi riavvia ocserv.

sudo systemctl restart ocserv

Modifica il file di configurazione UFW.

sudo nano /etc/ufw/before.rules

Trova il ufw-before-forward catena in questo file e aggiungi le 2 righe seguenti, che accetteranno l'inoltro di pacchetti se l'IP di origine o l'IP di destinazione è nel 10.10.20.0/24 intervallo.

-A ufw-before-forward -s 10.10.20.0/24 -j ACCEPT
-A ufw-before-forward -d 10.10.20.0/24 -j ACCEPT

Salva e chiudi il file. Quindi riavvia UFW.

sudo systemctl restart ufw

Nota che il demone ocserv potrebbe dirti che alcuni parametri verranno ignorati per l'host virtuale. Tuttavia, ho scoperto che alcuni dei parametri ignorati sono effettivamente necessari. Ad esempio, se elimini device = vpns riga dall'host virtuale, potresti riscontrare il seguente errore durante la creazione di una connessione VPN all'host virtuale.

VPN service unavailable; reason: Server configuration error

E il server VPN produrrebbe il seguente messaggio di errore nel registro.

no networks are configured; rejecting client

Nota anche che il client VPN AnyConnect su iOS non supporta TLS SNI, quindi gli utenti iOS si collegheranno all'host virtuale predefinito.

Come eseguire più istanze di ocserv

Un processo ocserv può collegarsi a una sola porta TCP o UDP sul tuo server. Se si desidera consentire a ocserv di collegarsi a più porte TCP o UDP, è necessario eseguire più processi ocserv. È molto semplice. Copia il /lib/systemd/system/ocserv.service in un nuovo file.

sudo cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv2.service

Quindi modifica il nuovo file.

sudo nano /etc/systemd/system/ocserv2.service

Cambia

/etc/ocserv/ocserv.conf

a

/etc/ocserv/ocserv2.conf

Salva e chiudi il file. Successivamente, puoi modificare il /etc/ocserv/ocserv2.conf file e aggiungi le tue configurazioni personalizzate. Al termine, avvia il secondo servizio ocserv.

sudo systemctl start ocserv2

Ubuntu
  1. Come configurare WireGuard VPN su Ubuntu (una guida passo passo)

  2. Come configurare un server VPN IKEv2 con StrongSwan su Ubuntu 22.04

  3. Configura OpenConnect VPN Server (ocserv) su Debian 11 Bullseye

  4. Configura OpenConnect VPN Server (ocserv) su Debian 10 Buster

  5. Come installare Let's Encrypt SSL su Ubuntu 18.04 con Nginx

Come configurare un VPN Pptp sul proprio server Ubuntu?

Come configurare un server Seafile con Nginx su Ubuntu 18.04

Come configurare un server FTP con ProFTPD in Ubuntu 18.04

Come configurare un server di posta con Modoboa su Ubuntu 20.04

Come proteggere Nginx con Let's Encrypt su Ubuntu 20.04

Come proteggere il tuo sito Web con Let's Encrypt su Ubuntu 20.04