Recherche de site Web

Configurer le serveur VPN OpenConnect (ocserv) sur Rocky Linux 9/AlmaLinux 9


Ce didacticiel va vous montrer comment exécuter votre propre serveur VPN en installant le serveur VPN OpenConnect sur Rocky Linux 9/AlmaLinux 9. Le serveur VPN OpenConnect, alias ocserv, est une implémentation open source de Cisco. Protocole VPN AnyConnect, largement utilisé dans les entreprises et les universités. AnyConnect est un protocole VPN basé sur HTTPS qui permet aux utilisateurs individuels de se connecter à un réseau distant.

Pourquoi configurer votre propre serveur VPN ?

  • Peut-être êtes-vous un fournisseur de services VPN ou un administrateur système, ce qui vous incombe de configurer votre propre serveur VPN.
  • Vous ne faites pas confiance à la politique de non-journalisation des fournisseurs de services VPN, vous optez donc pour l’auto-hébergement.
  • Vous pouvez utiliser VPN pour mettre en œuvre une politique de sécurité réseau. Par exemple, si vous exécutez votre propre serveur de messagerie, vous pouvez demander aux utilisateurs de se connecter uniquement à partir de l'adresse IP du serveur VPN en créant une liste blanche d'adresses IP dans le pare-feu. Ainsi, votre serveur de messagerie est renforcé pour empêcher les activités de piratage.
  • Peut-être êtes-vous simplement curieux de savoir comment fonctionne le serveur VPN.

Caractéristiques du serveur VPN OpenConnect

  • Léger et rapide. Lors de mon test, je peux regarder des vidéos YouTube 4K avec OpenConnect VPN. YouTube est bloqué dans mon pays (Chine).
  • Fonctionne sous Linux et la plupart des serveurs BSD.
  • Compatible avec le client Cisco AnyConnect
  • Il existe un logiciel client OpenConnect pour Linux, macOS, Windows et OpenWRT. Pour Android et iOS, vous pouvez utiliser le client Cisco AnyConnect.
  • Prend en charge l'authentification par mot de passe et l'authentification par certificat
  • Prend en charge la comptabilité RADIUS.
  • Prend en charge l'hébergement virtuel (plusieurs domaines)
  • Facile à mettre en place

J'aime particulièrement le fait que, comparé à d'autres technologies VPN, il est très simple et pratique pour l'utilisateur final d'utiliser OpenConnect VPN. Chaque fois que j'installe une distribution Linux sur mon ordinateur et que je souhaite débloquer rapidement des sites Web ou masquer mon adresse IP, j'exécute simplement la commande suivante pour me connecter à mon serveur VPN OpenConnect.

sudo openconnect -b vpn.mydomain.com

Le logiciel client openconnect est disponible pour Debian, Ubuntu, Fedora, RHEL, Rocky Linux/AlmaLinux, Arch Linux et OpenSUSE. Vous pouvez facilement l'installer avec votre gestionnaire de packages.

sudo apt install openconnect
sudo dnf install openconnect
sudo pacman -S openconnect

Exigences

Pour suivre ce tutoriel, vous aurez besoin d'un VPS (Virtual Private Server) pouvant accéder librement aux sites Web bloqués (en dehors de votre pays ou système de filtrage Internet). Je recommande Kamatera VPS, qui propose :

  • Essai gratuit de 30 jours.
  • À partir de 4 $/mois (1 Go de RAM)
  • VPS basé sur KVM hautes performances
  • 9 centres de données dans le monde, dont les États-Unis, le Canada, le Royaume-Uni, l'Allemagne, les Pays-Bas, Hong Kong et Israël.

Suivez le tutoriel lié ci-dessous pour créer votre serveur Linux VPS chez Kamatera.

  • Comment créer un serveur VPS Linux sur Kamatera

Une fois que vous disposez d'un VPS exécutant Rocky Linux 9/AlmaLinux 9, suivez les instructions ci-dessous.

Vous avez également besoin d'un nom de domaine pour activer HTTPS pour OpenConnect VPN. J'ai enregistré mon nom de domaine auprès de NameCheap parce que le prix est bas et qu'ils offrent une protection de la vie privée gratuite à vie.

Étape 1 : Installer le serveur VPN OpenConnect (ocserv) sur Rocky Linux 9/AlmaLinux 9

Connectez-vous à votre serveur Rocky Linux 9/AlmaLinux 9 via SSH. Exécutez ensuite les commandes suivantes pour installer le package ocserv à partir du référentiel EPEL.

sudo dnf install epel-release
sudo dnf install ocserv

Étape 2 : ouvrir les ports dans le pare-feu

Il est d'usage de configurer ocserv pour écouter sur le port 443, alors exécutez les commandes suivantes pour ouvrir le port TCP et UDP 443.

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

Nous devons également ouvrir le port TCP 80 pour obtenir un certificat TLS gratuit de Let's Encrypt.

sudo firewall-cmd --permanent --add-port=80/tcp

Rechargez le pare-feu pour que les modifications prennent effet.

sudo systemctl reload firewalld

Étape 3 : Installez Let's Encrypt Client (Certbot) sur le serveur Rocky Linux 9/AlmaLinux 9

Le package gnutls-utils installé avec ocserv fournit des outils pour créer votre propre certificat d'autorité de certification et de serveur, mais nous obtiendrons et installerons le certificat Let's Encrypt. L’avantage d’utiliser le certificat Let’s Encrypt est qu’il est gratuit, plus facile à configurer et approuvé par le logiciel client VPN.

Exécutez la commande suivante pour installer le client Let's Encrypt (certbot) sur Rocky Linux 9/AlmaLinux 9.

sudo dnf install certbot

Pour vérifier le numéro de version, exécutez

certbot --version

Exemple de sortie :

certbot 1.29.0

Étape 4 : Obtenez un certificat TLS de confiance auprès de Let's Encrypt

Je recommande d'utiliser le plugin standalone ou webroot pour obtenir le certificat TLS.

Plugin autonome

Si aucun serveur Web n'est exécuté sur votre serveur Rocky Linux 9/AlmaLinux 9 et que vous souhaitez que le serveur VPN OpenConnect utilise le port 443, vous pouvez utiliser le plugin autonome pour obtenir le certificat TLS de Let's Encrypt. Définissez l'enregistrement DNS A pour vpn.example.com sur le site Web de votre registraire de domaine, puis exécutez la commande suivante pour obtenir le certificat.

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

Explication:

  • certonly : obtenez un certificat mais ne l'installez pas.
  • --standalone : Utilisez le plugin autonome pour obtenir un certificat
  • --preferred-challenges http : effectuez le défi http-01 pour valider notre domaine, qui utilisera le port 80.
  • --agree-tos : acceptez les conditions d'utilisation de Let's Encrypt.
  • --email : l'adresse e-mail est utilisée pour l'enregistrement et la récupération du compte.
  • -d : Spécifiez votre nom de domaine.

Utilisation du plugin Webroot

Si votre serveur Rocky Linux 9/AlmaLinux 9 dispose d'un serveur Web écoutant sur les ports 80 et 443, alors c'est une bonne idée d'utiliser le plugin webroot pour obtenir un certificat car le plugin webroot fonctionne avec à peu près tous les serveurs Web et nous ne le faisons pas. vous devez installer le certificat sur le serveur Web.

Tout d'abord, vous devez créer un hôte virtuel pour vpn.example.com.

Apache

Si vous utilisez le serveur Web Apache, créez un hôte virtuel dans le répertoire /etc/httpd/conf.d/.

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

Et collez les lignes suivantes dans le fichier.

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

        DocumentRoot /var/www/html/
</VirtualHost>

Enregistrez et fermez le fichier. Rechargez Apache pour que les modifications prennent effet.

sudo systemctl reload httpd

Une fois l'hôte virtuel créé et activé, exécutez la commande suivante pour obtenir le certificat Let's Encrypt à l'aide du plugin webroot.

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

Nginx

Si vous utilisez le serveur Web Nginx, créez un hôte virtuel sous /etc/nginx/conf.d/.

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

Collez les lignes suivantes dans le fichier.

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

      root /usr/share/nginx/html/;

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

Enregistrez et fermez le fichier. Rechargez Nginx pour que les modifications prennent effet.

sudo systemctl reload nginx

Une fois l'hôte virtuel créé et activé, exécutez la commande suivante pour obtenir le certificat Let's Encrypt à l'aide du plugin webroot.

sudo certbot certonly --webroot --agree-tos --email [email  -d vpn.example.com -w /usr/share/nginx/html/

Étape 5 : Modifier le fichier de configuration du serveur VPN OpenConnect

Modifiez le fichier de configuration ocserv.

sudo nano /etc/ocserv/ocserv.conf

Tout d’abord, configurez l’authentification par mot de passe. Par défaut, l'authentification par mot de passe via PAM (Pluggable Authentication Modules) est activée, ce qui vous permet d'utiliser les comptes système Rocky Linux/AlmaLinux pour vous connecter à partir de clients VPN. Ce comportement peut être désactivé en commentant la ligne suivante.

auth = "pam"

Si nous souhaitons que les utilisateurs utilisent des comptes VPN distincts au lieu de comptes système pour se connecter, nous devons ajouter la ligne suivante pour activer l'authentification par mot de passe avec un fichier de mots de passe.

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

Après avoir terminé l'édition de ce fichier de configuration, nous verrons comment utiliser l'outil ocpasswd pour générer le fichier /etc/ocserv/ocpasswd, qui contient une liste de noms d'utilisateur et de mots de passe encodés.

Remarque : Ocserv prend en charge l'authentification par certificat client, mais Let's Encrypt ne délivre pas de certificat client. Si vous souhaitez activer l'authentification par certificat, vous devez configurer votre propre autorité de certification pour émettre un certificat client.

Ensuite, recherchez les deux lignes suivantes.

tcp-port = 443
udp-port = 443

Commentez le port UDP. (Nous utiliserons l'algorithme TCP BBR pour augmenter la vitesse TCP.)

tcp-port = 443 
#udp-port = 443

Si vous ne souhaitez pas qu'ocserv utilise le port TCP 443 (il existe un serveur Web utilisant le port 443 ?), modifiez le numéro de port TCP. Sinon, laissez-le tranquille.

Trouvez ensuite les deux lignes suivantes. Nous devons les changer.

server-cert = /etc/pki/ocserv/public/server.crt
server-key = /etc/pki/ocserv/private/server.key

Remplacez le paramètre par défaut par le chemin du certificat du serveur Let's Encrypt et du fichier de clé du serveur.

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

Ensuite, définissez le nombre maximal de clients. La valeur par défaut est 16. Réglez sur zéro pour un nombre illimité.

max-clients = 0

Définissez le nombre d'appareils sur lesquels un utilisateur peut se connecter en même temps. La valeur par défaut est 2. Réglez sur zéro pour un nombre illimité.

max-same-clients = 0

Par défaut, les paquets keepalive sont envoyés toutes les 32 400 secondes (9 heures). Je préfère utiliser un temps court (30 secondes) pour réduire le risque d'interruption de la connexion VPN.

keepalive = 30

Ensuite, recherchez la ligne suivante. Remplacez false par true pour activer la découverte MTU.

try-mtu-discovery = true

Il est recommandé d'activer la compression LZ4, alors décommentez la ligne suivante.

compression = true

Vous pouvez définir la durée pendant laquelle un client est autorisé à rester inactif avant d'être déconnecté via les deux paramètres suivants. Si vous préférez que le client reste connecté indéfiniment, commentez ces deux paramètres.

idle-timeout=1200
mobile-idle-timeout=2400

Après cela, définissez le domaine par défaut sur vpn.example.com.

default-domain = vpn.example.com

La configuration réseau IPv4 est la suivante par défaut. Cela posera des problèmes car la plupart des routeurs domestiques définissent également la plage du réseau IPv4 sur 192.168.1.0/24.

#ipv4-network = 192.168.1.0
#ipv4-netmask = 255.255.255.0

Nous pouvons utiliser une autre plage d'adresses IP privées (telle que 10.10.10.0/24) pour éviter les collisions d'adresses IP, alors décommentez les deux lignes ci-dessus et changez la valeur de ipv4-network en 10.10. 10.0.

ipv4-network = 10.10.10.0
ipv4-netmask = 255.255.255.0

Recherchez les deux lignes suivantes et décommentez-les afin que les clients VPN reçoivent des adresses IPv6 privées.

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

Si vous voyez la ligne suivante

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

Veuillez le remplacer par :

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

Décommentez maintenant la ligne suivante pour tunneliser toutes les requêtes DNS via le VPN.

tunnel-all-dns = true

Modifiez l'adresse du résolveur DNS. Vous pouvez utiliser le serveur DNS public de Google.

dns = 8.8.8.8
dns = 8.8.4.4

ou le serveur DNS public de Cloudflare.

dns = 1.1.1.1
dns = 1.0.0.1

Remarque : Si vous êtes un fournisseur de services VPN, il est conseillé d'exécuter votre propre résolveur DNS. Si un résolveur DNS s'exécute sur le même serveur, spécifiez le DNS comme

dns = 10.10.10.1

10.10.10.1 est l'adresse IP du serveur VPN OpenConnect dans le réseau local VPN. Cela accélérera un peu les recherches DNS pour les clients, car la latence du réseau entre le serveur VPN et le résolveur DNS est éliminée.

Commentez ensuite tous les paramètres de route (ajoutez le caractère # au début des lignes suivantes), ce qui définira le serveur comme passerelle par défaut pour les clients.

#route = 10.10.10.0/255.255.255.0
#route = 192.168.0.0/255.255.0.0
#route = fef4:db8:1000:1001::/64

#no-route = 192.168.5.0/255.255.255.0

Enfin, faites défiler jusqu'à la fin du fichier (dans l'éditeur de texte Nano, vous pouvez aller à la fin du fichier en appuyant sur Ctrl+W, puis en appuyant sur Ctrl+V ), et commentez le paramètre user-profile, car le fichier XML du profil utilisateur n'est pas nécessaire aux clients OpenConnect ou au client Cisco AnyConnect sur iOS et Android.

#user-profile = profile.xml

Remarque : Si le profil utilisateur est activé, le client Cisco AnyConnect sur iOS produira l'erreur suivante lors de la connexion au serveur VPN OpenConnect.

Failed to download the AnyConnect profile. Please try again.

Enregistrez et fermez le fichier.

Étape 6 : Création de comptes VPN

Utilisez maintenant l'outil ocpasswd pour générer des comptes VPN.

sudo ocpasswd -c /etc/ocserv/ocpasswd username

Il vous sera demandé de définir un mot de passe pour l'utilisateur et les informations seront enregistrées dans le fichier /etc/ocserv/ocpasswd. Pour réinitialiser le mot de passe, exécutez simplement à nouveau la commande ci-dessus.

Nous pouvons maintenant démarrer le service ocserv.

sudo systemctl start ocserv

Et activez le démarrage automatique au moment du démarrage.

sudo systemctl enable ocserv

Vous pouvez vérifier son statut avec :

systemctl status ocserv

Exemple de sortie :

● ocserv.service - OpenConnect SSL VPN server
   Loaded: loaded (/usr/lib/systemd/system/ocserv.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-01-03 19:04:53 CST; 15s ago
     Docs: man:ocserv(8)
 Main PID: 19851 (ocserv-main)
    Tasks: 2 (limit: 5061)
   Memory: 3.2M
   CGroup: /system.slice/ocserv.service
           ├─19851 ocserv-main
           └─19853 ocserv-sm

Astuce : si la commande ci-dessus ne se termine pas immédiatement, vous pouvez appuyer sur la touche Q pour reprendre le contrôle du terminal.

Par défaut, le serveur VPN OpenConnect écoute sur le port TCP et UDP 443. S'il est utilisé par un serveur Web, le serveur VPN ne peut pas être démarré. Nous verrons plus tard comment faire en sorte que le serveur VPN OpenConnect et le serveur Web utilisent le même port.

Étape 7 : Activer le transfert IP dans le noyau Linux

Pour que le serveur VPN puisse acheminer les paquets entre les clients VPN et Internet, nous devons activer le transfert IP en exécutant la commande suivante.

echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/60-custom.conf

Exécutez également les deux commandes suivantes pour activer l’algorithme TCP BBR afin d’augmenter la vitesse TCP.

echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.d/60-custom.conf

echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.d/60-custom.conf

Appliquez ensuite les modifications avec la commande ci-dessous. L'option -p chargera les paramètres sysctl à partir du fichier /etc/sysctl.d/60-custom.conf. Cette commande conservera nos modifications lors des redémarrages du système.

sudo sysctl -p /etc/sysctl.d/60-custom.conf

Étape 8 : Configurer le masquage IP dans le pare-feu

Exécutez la commande suivante pour activer le masquage IP pour le sous-réseau 10.10.10.0/24 dans le pare-feu du serveur.

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.10.0/24" masquerade'

sudo systemctl reload firewalld

Cela masquera votre réseau VPN du monde extérieur. Ainsi, Internet ne peut voir que l’adresse IP de votre serveur VPN, mais ne peut pas voir l’adresse IP de votre client VPN, tout comme votre routeur domestique cache votre réseau domestique privé.

Le serveur VPN OpenConnect est désormais prêt à accepter les connexions client.

Installer et utiliser le client VPN OpenConnect sur Rocky Linux 9/AlmaLinux 9/Fedora Desktop

Exécutez la commande suivante pour installer le client de ligne de commande OpenConnect VPN sur le bureau Fedora.

sudo dnf install openconnect

Sur Rocky Linux 9/AlmaLinux 9, vous devez activer le référentiel EPEL afin d'installer le client.

sudo dnf install epel-release
sudo dnf install openconnect

Ensuite, vous pouvez vous connecter au serveur VPN à partir de la ligne de commande comme ci-dessous. L'indicateur -b le fera s'exécuter en arrière-plan une fois la connexion établie.

sudo openconnect -b vpn.example.com

Par défaut, le client openconnect envoie la requête au port 443 du serveur. Si vous avez configuré un port différent pour le serveur, vous pouvez ajouter le numéro de port.

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

Il vous sera demandé de saisir votre nom d'utilisateur et votre mot de passe VPN. Si la connexion est établie avec succès, vous verrez le message suivant.

Got CONNECT response: HTTP/1.1 200 CONNECTED
CSTP connected. DPD 90, Keepalive 32400
Connected as 10.10.10.139, using SSL + lz4
Continuing in background; pid 2137
Established DTLS connection (using GnuTLS). Ciphersuite (DTLS1.2)-(PSK)-(AES-256-GCM).

Si la connexion échoue, vous pouvez consulter le journal ocserv pour savoir pourquoi. (Peut-être n'avez-vous pas saisi le mot de passe correctement.)

sudo journaltcl -eu ocserv

Pour arrêter la connexion, exécutez :

sudo pkill openconnect

Pour exécuter le client de manière non interactive, utilisez la syntaxe suivante.

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

Si vous êtes connecté avec succès au serveur VPN, mais que votre adresse IP publique ne change pas, c'est parce que le transfert IP ou le masquage IP ne fonctionne pas.

Connexion automatique au démarrage du système

Pour que le client VPN OpenConnect se connecte automatiquement au serveur au moment du démarrage, nous pouvons créer une unité de service systemd.

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

Mettez les lignes suivantes dans le fichier. Remplacez le texte rouge.

[Unit]
  Description=OpenConnect VPN Client
  After=network-online.target
  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

Enregistrez et fermez le fichier. Activez ensuite ce service pour qu'il démarre au moment du démarrage.

sudo systemctl enable openconnect.service

Explication du contenu du fichier :

  • After=network-online.target et Wants=network-online.target font fonctionner ce service une fois le réseau opérationnel.
  • En réalité, ce service peut toujours fonctionner avant que le réseau ne soit opérationnel. Nous ajoutons Restart=always et RestartSec=2 pour redémarrer ce service après 2 secondes si ce service échoue.
  • Systemd ne reconnaît pas la redirection de canal. Ainsi, dans la directive ExecStart, nous enveloppons la commande entre guillemets simples et l'exécutons avec le shell Bash.
  • Étant donné que le client VPN OpenConnect s'exécutera en tant que service systemd, qui s'exécute en arrière-plan, il n'est pas nécessaire d'ajouter l'indicateur -b à la commande openconnect.
  • La directive KillSignal indique à Systemd d'envoyer le signal SIGINT lorsque la commande systemctl stop openconnect est émise. Cela effectuera un arrêt propre en fermant la session et en restaurant les paramètres du serveur DNS et la table de routage du noyau Linux.

Pour démarrer ce service Systemd immédiatement, exécutez

sudo systemctl start openconnect

Pour arrêter ce service Systemd, exécutez

sudo systemctl stop openconnect

Client GUI OpenConnect pour Windows et MacOS

Ils peuvent être téléchargés à partir de la page Github de l'interface graphique OpenConnect.

Vitesse

OpenConnect VPN est assez rapide. Je peux l'utiliser pour regarder des vidéos 4k sur YouTube. Comme vous pouvez le constater, la vitesse de connexion est de 63 356 Kbps, ce qui correspond à 61 Mbit/s.

Et voici les résultats des tests sur speedtest.net.

Optimisation de la vitesse

OpenConnect utilise par défaut le protocole TLS sur UDP (DTLS) pour atteindre une vitesse plus rapide, mais UDP ne peut pas fournir une transmission fiable. TCP est plus lent qu'UDP mais peut fournir une transmission fiable. Un conseil d'optimisation que je peux vous donner est de désactiver DTLS, d'utiliser TLS standard (sur TCP), puis d'activer TCP BBR pour augmenter la vitesse TCP.

Vous souhaiterez peut-être également désactiver DTLS pour contourner les restrictions du pare-feu, car DTLS utilise le port UDP 443. Le TLS standard utilise le port TCP 443.

Pour désactiver DTLS, commentez (ajoutez le symbole # au début) la ligne suivante dans le fichier de configuration ocserv.

udp-port = 443

Enregistrez et fermez le fichier. Redémarrez ensuite le service ocserv.

sudo systemctl restart ocserv.service

Pour activer TCP BBR, veuillez consulter le didacticiel suivant. Il est écrit pour Ubuntu, mais fonctionne également pour Rocky Linux/AlmaLinux. Notez que vous devez désactiver DTLS dans ocserv, sinon TCP BBR ne fonctionnera pas.

  • Comment améliorer facilement les performances du réseau du serveur en activant TCP BBR

Dans mon test, le TLS standard avec TCP BBR activé est deux fois plus rapide que le DTLS.

Un autre facteur très important affectant la vitesse est la qualité de la connexion entre votre ordinateur local et le serveur VPN. Si vous habitez au Moyen-Orient et que le serveur VPN est situé aux États-Unis, la vitesse sera lente. Choisissez un centre de données proche de chez vous.

Renouveler automatiquement le certificat Let's Encrypt

Modifiez le fichier crontab de l'utilisateur root.

sudo crontab -e

Ajoutez la ligne suivante à la fin du fichier pour exécuter le travail Cron quotidiennement. Si le certificat expire dans 30 jours, certbot tentera de renouveler le certificat. Il est nécessaire de redémarrer le service ocserv pour que le serveur VPN récupère le nouveau certificat et le nouveau fichier de clé.

@daily certbot renew --quiet; systemctl restart ocserv

Des conseils de dépannage

Notez que si vous utilisez OpenVZ VPS, assurez-vous d'activer le périphérique réseau virtuel TUN dans le panneau de configuration VPS. (Si vous utilisez Kamatera VPS, alors vous disposez d'un VPS basé sur KVM, vous n'avez donc pas à vous en soucier.)

Si vous rencontrez un problème, consultez le journal du serveur OpenConnect VPN.

sudo journalctl -eu ocserv.service

J'ai découvert que si je change le port 443 en un autre port, le grand pare-feu de Chine bloquera cette connexion VPN.

Si ocserv vous indique qu'il ne peut pas charger le fichier /etc/ocserv/ocserv.conf, vous pouvez arrêter ocserv.

sudo systemctl stop ocserv

Ensuite, exécutez-le au premier plan avec le débogage activé.

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

Ensuite, la sortie pourrait vous donner des indices sur les raisons pour lesquelles ocserv ne fonctionne pas.

Si vous êtes connecté avec succès au serveur VPN, mais que vous ne pouvez pas naviguer sur Internet, c'est parce que le transfert IP ou le masquage IP ne fonctionne pas.

Aucun adaptateur Tap-Windows installé sur ce système

Si vous utilisez le client Windows de l'interface graphique OpenConnect et que vous avez trouvé l'erreur « Aucun adaptateur Tap-Windows installé sur ce système » dans les journaux (Affichage - Fenêtre de journal), cela est probablement dû au fait que vous avez installé d'autres clients VPN. ensuite comme OpenVPN.

Pour corriger cette erreur, vous devez désinstaller le client OpenConnect GUI et le réinstaller. Dans l'assistant d'installation, vous aurez la possibilité d'installer le pilote TAP.

Faire en sorte que le serveur VPN OpenConnect et le serveur Web utilisent le port 443 en même temps

Veuillez lire l'article suivant :

  • Exécutez le serveur VPN OpenConnect et Apache/Nginx sur la même boîte avec HAProxy

Comment désactiver TLS 1.0 et TLS 1.1 dans ocserv

Le conseil PCI a déconseillé TLS 1.0 le 30 juin 2018 et les navigateurs Web grand public vont désactiver TLS 1.0 et TLS 1.1 en 2020. Nous devrions faire de même avec le serveur VPN. Modifiez le fichier de configuration principal.

sudo nano /etc/ocserv/ocserv.conf

Recherchez la ligne suivante :

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

Pour désactiver TLS 1.0 et TLS 1.1 sur le serveur VPN OpenConnect, remplacez-le par :

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

Enregistrez et fermez le fichier. Puis redémarrez ocserv.

sudo systemctl restart ocserv

Désormais, ocserv n'acceptera que TLS 1.3 et TLS 1.2. Pour plus d'informations sur la configuration du paramètre TLS dans ocserv, veuillez consulter Chaînes de priorité GnuTLS.

Pour vérifier si TLS 1.0 est pris en charge sur votre serveur OpenConnect VPN, exécutez la commande suivante.

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

Et vérifiez TLS 1.1

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

Si vous voyez le message suivant dans le résultat, cela signifie que la version TLS n'est pas prise en charge.

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

Configuration par utilisateur ou par groupe

Ocserv permet des configurations par utilisateur et par groupe. Pour activer cette fonctionnalité, décommentez les deux lignes suivantes dans le fichier /etc/ocserv/ocserv.conf.

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

Enregistrez et fermez le fichier. Créez ensuite le répertoire de configuration par utilisateur et par groupe.

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

Ensuite, vous pouvez créer un fichier sous ces deux répertoires. Par exemple, créez le fichier user1 pour permettre une configuration personnalisée pour user1.

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

Vous pouvez également créer le fichier group1 pour permettre une configuration personnalisée pour le groupe nommé group1.

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

Vous pouvez ajouter quelque chose comme ci-dessous dans le fichier.

route = 10.10.10.0/255.255.255.0

Cela signifie qu'après la connexion de user1 à ce serveur VPN, seul le trafic vers le réseau 10.10.10.0/24 sera acheminé via le serveur VPN. Le trafic vers d'autres adresses IP est acheminé via la passerelle d'origine. C'est ce qu'on appelle le split tunneling, qui est utile dans les cas suivants :

  • Vous voulez simplement que les clients VPN puissent parcourir les ressources internes et vous ne voulez pas que tout le trafic passe par le serveur VPN.
  • Vous devez créer un réseau privé pour les serveurs cloud.
  • Le client doit se connecter à plusieurs VPN. Un VPN peut utiliser le tunneling fractionné et l’autre un tunnel complet.

Enregistrez et fermez le fichier. Redémarrez ocserv pour que les modifications prennent effet.

Comment configurer le relais VPN

Supposons qu'il y ait deux serveurs : le serveur A et le serveur B.

  • Vous disposez d’une bonne connexion au serveur A. La latence est très faible et aucun paquet n’est abandonné.
  • Vous avez une mauvaise connexion au serveur B. La latence est élevée et un paquet est abandonné.
  • La connexion entre le serveur A et le serveur B est bonne.

Naturellement, vous souhaitez installer un VPN sur le serveur A. Mais que se passe-t-il si vous souhaitez qu’Internet voie votre trafic provenant de l’adresse IP du serveur B ? Eh bien, vous pouvez installer ocserv VPN sur le serveur B, puis configurer HAProxy sur le serveur A pour proxy le trafic entre votre ordinateur et le serveur B.

Sur le serveur A, installez HAProxy.

sudo dnf install haproxy

Modifiez le fichier de configuration principal.

sudo nano /etc/haproxy/haproxy.cfg

Créez un front-end et un back-end comme avant. Remplacez 12.34.56.78 par l'adresse IP publique du serveur A. Remplacez 12.34.56.79 par l'adresse IP publique du serveur B.

frontend https
   bind 12.34.56.78:443
   mode tcp
   tcp-request inspect-delay 5s
   tcp-request content accept if { req_ssl_hello_type 1 }

   use_backend ocserv if { req_ssl_sni -i vpn.example.com }

   default_backend ocserv

backend ocserv
   mode tcp
   option ssl-hello-chk
   server ocserv 12.34.56.79:443 send-proxy-v2

Enregistrez et fermez le fichier. Sur le serveur B, vous devez configurer ocserv pour écouter l'adresse IP publique et activer le protocole proxy comme avant. Après cela, modifiez l'enregistrement A de vpn.example.com. Il convient de pointer vers l'adresse IP du serveur A.

Redémarrez HAProxy et Ocserv et cela devrait fonctionner.

Remarque : Si le serveur B utilise également HAProxy, vous devez alors supprimer le paramètre send-proxy-v2 dans la configuration HAProxy ci-dessus.

Hébergement virtuel

Pour ajouter un nouvel hôte virtuel dans ocserv, vous devez d'abord utiliser la méthode de l'étape 4 pour obtenir un certificat TLS pour le nouvel hôte virtuel. Modifiez ensuite le fichier de configuration ocserv.

sudo nano /etc/ocserv/ocserv.conf

Allez au bas de ce fichier. Dans l'éditeur de texte Nano, vous pouvez appuyer sur Ctrl+W, puis sur Ctrl+V pour accéder au bas d'un fichier. Ajoutez les lignes suivantes. Remplacez vpn2.example.com par le nom d'hôte du deuxième hôte virtuel.

[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/

Enregistrez et fermez le fichier. Puis redémarrez ocserv.

sudo systemctl restart ocserv

Notez que le démon ocserv peut vous indiquer que certains paramètres seront ignorés pour l'hôte virtuel. Cependant, j’ai constaté que certains des paramètres ignorés sont réellement nécessaires. Par exemple, si vous supprimez la ligne device=vpns de l'hôte virtuel, vous pourriez rencontrer l'erreur suivante lors de l'établissement d'une connexion VPN à l'hôte virtuel.

VPN service unavailable; reason: Server configuration error

Et le serveur VPN produirait le message d'erreur suivant dans le journal.

no networks are configured; rejecting client

Notez que le client VPN AnyConnect sur iOS ne prend pas en charge TLS SNI, les utilisateurs iOS se connecteront donc à l'hôte virtuel par défaut.

Comment exécuter plusieurs instances d'ocserv

Un processus ocserv ne peut se lier qu'à un seul port TCP ou UDP sur votre serveur. Si vous souhaitez autoriser ocserv à se lier à plusieurs ports TCP ou UDP, vous devez exécuter plusieurs processus ocserv. C'est très simple. Copiez le /usr/lib/systemd/system/ocserv.service dans un nouveau fichier.

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

Modifiez ensuite le nouveau fichier.

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

Changement

/etc/ocserv/ocserv.conf

à

/etc/ocserv/ocserv2.conf

Enregistrez et fermez le fichier. Ensuite, vous pouvez modifier le fichier /etc/ocserv/ocserv2.conf et ajouter vos configurations personnalisées. Une fois que vous avez terminé, démarrez le deuxième service ocserv.

sudo systemctl start ocserv2

Emballer

C'est ça! J'espère que ce tutoriel vous a aidé à installer et configurer OpenConnect VPN sur le serveur Rocky Linux 9/AlmaLinux 9. Comme toujours, si vous avez trouvé cet article utile, abonnez-vous à notre newsletter gratuite pour obtenir plus de trucs et astuces. Prenez soin de vous 🙂

Articles connexes