Ce tutoriel va vous montrer comment exécuter votre propre serveur VPN en installant le serveur OpenConnect VPN sur Ubuntu 20.04. Serveur VPN OpenConnect, alias ocserv , est une implémentation open source du protocole VPN Cisco AnyConnnect, largement utilisé dans les entreprises et les universités. AnyConnect est un protocole VPN basé sur SSL qui permet aux utilisateurs individuels de se connecter à un réseau distant.
Remarque :Ce tutoriel fonctionne également sur Ubuntu 20.10 et Ubuntu 21.04.
Pourquoi configurer votre propre serveur VPN ?
- Vous êtes peut-être un fournisseur de services VPN ou un administrateur système, ce qui vous incombe de configurer notre 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 un VPN pour mettre en œuvre une politique de sécurité réseau. Par exemple, si vous utilisez 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. Dans mon test, je peux regarder des vidéos YouTube 4K avec OpenConnect VPN. YouTube est bloqué dans mon pays (Chine).
- Fonctionne sur Linux et la plupart des serveurs BSD.
- Compatible avec le client Cisco AnyConnect
- Il existe des logiciels clients 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 à configurer
J'aime particulièrement le fait que par rapport aux autres technologies VPN, il est très facile 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'installe le client OpenConnect et me connecte au serveur avec seulement deux lignes de commandes :
sudo apt install openconnect sudo openconnect -b vpn.mydomain.com
Il existe également un client VPN OpenConnect pour Fedora, RHEL, CentOS, Arch Linux et OpenSUSE. Vous pouvez facilement l'installer avec votre gestionnaire de paquets.
sudo dnf install openconnect sudo yum 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 bloqués (Hors de votre pays ou système de filtrage Internet). Je recommande Kamatera VPS, qui comprend :
- 30 jours d'essai gratuit.
- À 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 avez un VPS exécutant Ubuntu 20.04, 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 car le prix est bas et ils offrent une protection de la confidentialité whois gratuite à vie.
Étape 1 :Installez le serveur VPN OpenConnect sur Ubuntu 20.04
Connectez-vous à votre serveur Ubuntu 20.04. Ensuite, utilisez apt
pour installer ocserv
package du référentiel Ubuntu par défaut.
sudo apt update sudo apt install ocserv
Une fois installé, le serveur VPN OpenConnect est automatiquement démarré. Vous pouvez vérifier son statut avec :
systemctl status ocserv
Exemple de sortie :
● 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
Astuce :si la commande ci-dessus ne se ferme pas immédiatement, vous pouvez appuyer sur la touche Q pour reprendre le contrôle du terminal.
S'il ne fonctionne pas, vous pouvez le démarrer avec :
sudo systemctl start ocserv
Par défaut, le serveur VPN OpenConnect écoute sur les ports TCP et UDP 443. S'il est utilisé par le serveur Web, le serveur VPN ne démarrera probablement pas. Nous verrons plus tard comment changer le port dans le fichier de configuration OpenConnect VPN.
Si un pare-feu s'exécute sur votre serveur, vous devrez ouvrir les ports 80 et 443. Par exemple, si vous utilisez UFW, exécutez la commande suivante.
sudo ufw allow 80,443/tcp
Étape 2 :Installez le client Let's Encrypt (Certbot) sur le serveur Ubuntu 20.04
Le gnutls-bin
package installé avec ocserv
fournit des outils pour créer votre propre autorité de certification et certificat 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 les commandes suivantes pour installer le client Let's Encrypt (certbot) à partir du référentiel Ubuntu par défaut.
sudo apt install certbot
Pour vérifier le numéro de version, exécutez
certbot --version
Exemple de sortie :
certbot 0.40.0
Étape 3 :Obtenir un certificat TLS de confiance auprès de Let's Encrypt
Je recommande d'utiliser le standalone
ou webroot
plugin pour obtenir le certificat TLS pour ocserv.
Plug-in autonome
S'il n'y a pas de serveur Web en cours d'exécution sur votre serveur Ubuntu 20.04 et que vous souhaitez que le serveur VPN OpenConnect utilise le port 443, vous pouvez utiliser le plug-in autonome pour obtenir le certificat TLS de Let's Encrypt. Exécutez la commande suivante. N'oubliez pas de définir un enregistrement A pour votre nom de domaine.
sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d vpn.example.com
Où :
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.
Comme vous pouvez le voir sur la capture d'écran suivante, j'ai réussi à obtenir le certificat.
Utilisation du plug-in Webroot
Si votre serveur Ubuntu 20.04 a un serveur Web écoutant sur les ports 80 et 443, 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 n'avons pas besoin d'installer le certificat dans le serveur Web.
Tout d'abord, vous devez créer un hôte virtuel pour vpn.example.com.
Apache
Si vous utilisez Apache, alors
sudo nano /etc/apache2/sites-available/vpn.example.com.conf
Et collez les lignes suivantes dans le fichier.
<VirtualHost *:80> ServerName vpn.example.com DocumentRoot /var/www/ocserv </VirtualHost>
Enregistrez et fermez le fichier. Créez ensuite le répertoire racine Web.
sudo mkdir /var/www/ocserv
Définissez www-data (utilisateur Apache) comme propriétaire de la racine Web.
sudo chown www-data:www-data /var/www/ocserv -R
Activez cet hôte virtuel.
sudo a2ensite vpn.example.com
Rechargez Apache pour que les modifications prennent effet.
sudo systemctl reload apache2
Une fois l'hôte virtuel créé et activé, exécutez la commande suivante pour obtenir le certificat Let's Encrypt à l'aide du plug-in Webroot.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d vpn.example.com -w /var/www/ocserv
Nginx
Si vous utilisez Nginx, alors
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 /var/www/ocserv/; location ~ /.well-known/acme-challenge { allow all; } }
Enregistrez et fermez le fichier. Créez ensuite le répertoire racine Web.
sudo mkdir -p /var/www/ocserv
Définissez www-data (utilisateur Nginx) comme propriétaire de la racine Web.
sudo chown www-data:www-data /var/www/ocserv -R
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 plug-in Webroot.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d vpn.example.com -w /var/www/ocserv
Étape 4 :Modifier le fichier de configuration du serveur VPN OpenConnect
Modifier le fichier de configuration principal d'ocserv.
sudo nano /etc/ocserv/ocserv.conf
Tout d'abord, nous devons configurer 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 des comptes système Ubuntu pour vous connecter à partir de clients VPN. Ce comportement peut être désactivé en commentant la ligne suivante.
auth = "pam[gid-min=1000]"
Si nous voulons 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 fini de modifier ce fichier de configuration, nous verrons comment utiliser ocpasswd
outil pour générer le /etc/ocserv/ocpasswd
fichier, qui contient une liste de noms d'utilisateur et de mots de passe codés.
Remarque :Ocserv prend en charge l'authentification par certificat client, mais Let's Encrypt n'émet pas de certificat client. Vous devez configurer votre propre autorité de certification pour émettre un certificat client.
Ensuite, si vous ne voulez pas qu'ocserv utilise les ports TCP et UDP 443, recherchez les deux lignes suivantes et modifiez le numéro de port. Sinon, laissez-les tranquilles.
tcp-port = 443 udp-port = 443
Trouvez ensuite les deux lignes suivantes. Nous devons les changer.
server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem server-key = /etc/ssl/private/ssl-cert-snakeoil.key
Remplacez le paramètre par défaut par le chemin du certificat de serveur Let's Encrypt et du fichier de clé de 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 128. Réglez sur zéro pour un nombre illimité.
max-clients = 128
Définissez le nombre d'appareils à partir desquels 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 = 2
Par défaut, les paquets keepalive sont envoyés toutes les 300 secondes (5 minutes). Je préfère utiliser un court laps de temps (30 secondes) pour réduire le risque d'interruption de la connexion VPN.
keepalive = 30
Ensuite, trouvez la ligne suivante. Changer false
à true
pour activer la découverte MTU, qui peut optimiser les performances VPN.
try-mtu-discovery = false
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=1800
Après cela, définissez le domaine par défaut sur vpn.example.com.
default-domain = vpn.example.com
La configuration du réseau IPv4 est la suivante par défaut. Cela causera des problèmes car de nombreux routeurs domestiques définissent également la plage de 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 (10.10.10.0/24) pour éviter les collisions d'adresses IP, alors changez la valeur de ipv4-network
à
ipv4-network = 10.10.10.0
Décommentez maintenant la ligne suivante pour tunnelliser toutes les requêtes DNS via le VPN.
tunnel-all-dns = true
Les adresses de résolution DNS par défaut sont les suivantes, ce qui est bien.
dns = 8.8.8.8 dns = 1.1.1.1
Remarque :Si vous êtes un fournisseur de services VPN, il est recommandé d'exécuter votre propre résolveur DNS sur le même serveur. Si un résolveur DNS s'exécute sur le même serveur, spécifiez le DNS sous
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.
Mettez ensuite en commentaire tous les paramètres de route (ajoutez le symbole # au début des lignes suivantes), ce qui définira le serveur comme passerelle par défaut pour les clients.
#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
Enregistrez et fermez le fichier Puis redémarrez le serveur VPN pour que les modifications prennent effet.
sudo systemctl restart ocserv
Étape 5 :Créer des 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 /etc/ocserv/ocpasswd
dossier. Pour réinitialiser le mot de passe, exécutez simplement à nouveau la commande ci-dessus.
Étape 6 :Activer le transfert IP
Pour que le serveur VPN achemine les paquets entre les clients VPN et Internet, nous devons activer le transfert IP. Modifier sysctl.conf
fichier.
sudo nano /etc/sysctl.conf
Ajoutez la ligne suivante à la fin de ce fichier.
net.ipv4.ip_forward = 1
Enregistrez et fermez le fichier. Appliquez ensuite les modifications avec la commande ci-dessous. Le -p l'option chargera les paramètres sysctl depuis /etc/sysctl.conf dossier. Cette commande conservera nos modifications lors des redémarrages du système.
sudo sysctl -p
Étape 7 :Configurer le masquage IP dans le pare-feu
Nous devons configurer le masquage IP dans le pare-feu du serveur, afin que le serveur devienne un routeur virtuel pour les clients VPN. J'utiliserai UFW, qui est un frontal du pare-feu iptables. Installez UFW sur Ubuntu avec :
sudo apt install ufw
Tout d'abord, vous devez autoriser le trafic SSH.
sudo ufw allow 22/tcp
Recherchez ensuite le nom de l'interface réseau principale de votre serveur.
ip addr
Comme vous pouvez le voir, il s'appelle ens3
sur mon serveur Ubuntu.
Pour configurer le masquage IP, nous devons ajouter la commande iptables dans un fichier de configuration UFW.
sudo nano /etc/ufw/before.rules
Par défaut, il existe des règles pour le filter
table. Ajoutez les lignes suivantes à la fin de ce fichier. Remplacer ens3
avec votre propre nom d'interface réseau.
# 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
Dans l'éditeur de texte Nano, vous pouvez aller à la fin du fichier en appuyant sur Ctrl+W
, puis en appuyant sur Ctrl+V
.
Les lignes ci-dessus s'ajouteront (-A ) une règle à la fin de POSTROUTING chaîne de nat table. Il reliera votre réseau privé virtuel à Internet. Et cachez également votre réseau du monde extérieur. Ainsi, Internet ne peut voir que l'IP de votre serveur VPN, mais pas l'IP de votre client VPN, tout comme votre routeur domestique masque votre réseau domestique privé.
Par défaut, UFW interdit le transfert de paquets. Nous pouvons autoriser le transfert pour notre réseau privé. Trouvez le ufw-before-forward
chain dans ce fichier et ajoutez les 3 lignes suivantes, qui accepteront le transfert de paquets si l'IP source ou l'IP de destination est dans le 10.10.10.0/24
plage.
# 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
Enregistrez et fermez le fichier. Activez ensuite UFW.
sudo ufw enable
Si vous avez déjà activé UFW, vous pouvez utiliser systemctl pour redémarrer UFW.
sudo systemctl restart ufw
Maintenant, si vous listez les règles dans la chaîne POSTROUTING de la table NAT en utilisant la commande suivante :
sudo iptables -t nat -L POSTROUTING
Vous pouvez voir la règle de mascarade.
Le traitement des règles de pare-feu par UFW peut prendre un certain temps. Si la règle de mascarade ne s'affiche pas, redémarrez à nouveau UFW (sudo systemctl restart ufw
).
Étape 8 :Ouvrez le port 443 dans le pare-feu
Exécutez la commande suivante pour ouvrir les ports TCP et UDP 443. Si vous avez configuré un port différent pour ocserv, remplacez 443 par votre port configuré.
sudo ufw allow 443/tcp sudo ufw allow 443/udp
Le serveur VPN OpenConnect est maintenant prêt à accepter les connexions client.
Si vous exécutez un résolveur DNS local
Pour ceux d'entre vous qui utilisent un résolveur DNS local, si vous avez spécifié 10.10.10.1 comme serveur DNS pour les clients VPN, vous devez autoriser les clients VPN à se connecter au port 53 avec la règle UFW suivante.
sudo ufw insert 1 allow in from 10.10.10.0/24
Vous devez également modifier le fichier de configuration du serveur DNS BIND (/etc/bind/named.conf.options
) pour permettre aux clients VPN d'envoyer des requêtes DNS récursives comme ci-dessous.
allow-recursion { 127.0.0.1; 10.10.10.0/24; };
Redémarrez ensuite BIND.
sudo systemctl restart named
Comment installer et utiliser le client VPN OpenConnect sur le bureau Ubuntu 20.04
Exécutez la commande suivante pour installer le client de ligne de commande OpenConnect VPN sur le bureau Ubuntu.
sudo apt install openconnect
Vous pouvez vous connecter au VPN à partir de la ligne de commande comme ci-dessous. -b
le fera s'exécuter en arrière-plan une fois la connexion établie.
sudo openconnect -b vpn.example.com:port-number
Il vous sera demandé d'entrer le nom d'utilisateur et le 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 tun0 as 192.168.1.139, using SSL Established DTLS connection (using GnuTLS). Ciphersuite (DTLS1.2)-(RSA)-(AES-256-GCM).
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 souhaitez utiliser Network Manager pour gérer la connexion VPN, vous devez également installer ces packages.
sudo apt install network-manager-openconnect network-manager-openconnect-gnome
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. Une fois, j'ai eu une faute de frappe dans ma commande iptables (en utilisant une mauvaise plage d'adresses IP), ce qui a empêché mon ordinateur de naviguer sur Internet.
Si vous rencontrez l'erreur suivante, vous devez désactiver le port UDP dans ocserv, ce qui est expliqué plus loin dans l'optimisation de la vitesse rubrique.
DTLS handshake failed: Resource temporarily unavailable, try again
Si vous rencontrez l'erreur suivante, il est probable que le mot de passe de votre compte VPN soit erroné.
fgets (stdin): Inappropriate ioctl for device
Connexion automatique au démarrage du système
Pour permettre au client VPN OpenConnect de se connecter automatiquement au serveur au 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 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
Enregistrez et fermez le fichier. Activez ensuite ce service pour qu'il démarre au démarrage.
sudo systemctl enable openconnect.service
Explication du contenu du fichier :
After=network-online.target systemd-resolved.service
etWants=network-online.target
faire fonctionner ce service une fois le réseau activé. Nous voulons leopenconnect.service
commencer après lesystemd-resolved.service
car cela garantira que l'adresse du serveur DNS définie par OpenConnect ne sera pas remplacée parsystemd-resolved.service
.- En réalité, ce service peut toujours fonctionner avant que le réseau ne soit opérationnel. Nous ajoutons
Restart=always
etRestartSec=2
pour redémarrer ce service après 2 secondes si ce service échoue. - Systemd ne reconnaît pas la redirection de canal, donc dans le
ExecStart
directive, nous enveloppons la commande de guillemets simples et l'exécutons avec le shell Bash. - Étant donné que le client VPN OpenConnect fonctionnera en tant que service systemd, qui s'exécute en arrière-plan, il n'est pas nécessaire d'ajouter
-b
drapeau àopenconnect
commande. - Le
KillSignal
indique à Systemd d'envoyer leSIGINT
signaler quand lesystemctl stop openconnect
commande 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
Comment redémarrer automatiquement le client OpenConnect lors de la reprise après suspension
Si votre bureau Ubuntu passe en état de suspension, le client OpenConnect perdrait la connexion au serveur VPN. Pour le faire redémarrer automatiquement lors de la reprise après suspension, nous devons créer une autre unité de service systemd.
sudo nano /etc/systemd/system/openconnect-restart.service
Ajoutez les lignes suivantes dans le fichier.
[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
Enregistrez et fermez le fichier. Activez ensuite ce service.
sudo systemctl enable openconnect-restart.service
Redémarrage automatique lorsque la connexion VPN est interrompue
Parfois, la connexion VPN s'interrompait pour d'autres raisons. Vous pouvez exécuter la commande suivante pour vérifier si le client VPN peut envoyer un ping à l'adresse IP privée du serveur VPN (10.10.10.1). Si le ping échoue, la commande de droite sera exécutée pour redémarrer le client VPN. ||
est l'opérateur OR de Bash. Il exécute la commande de droite uniquement si la commande de gauche a renvoyé une erreur.
ping -c9 10.10.10.1 || systemctl restart openconnect
Le ping sera effectué 9 fois, soit 9 secondes. Vous pouvez utiliser uneboucle infinie dans le shell Bash pour que toute la commande s'exécute indéfiniment. Appuyez sur Ctrl+C
pour l'arrêter.
for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done
Nous pouvons maintenant créer un service systemd pour cette tâche.
sudo nano /etc/systemd/system/openconnect-check.service
Ajoutez les lignes suivantes à ce fichier. Nous spécifions que ce service doit s'exécuter après le 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
Enregistrez et fermez le fichier. Ensuite, démarrez ce service.
sudo systemctl start openconnect-check
Activer le démarrage automatique au démarrage.
sudo systemctl enable openconnect-check
Une fois ce service démarré, la commande ping s'exécutera indéfiniment. Si la connexion VPN tombe, elle redémarrera automatiquement openconnect.service
.
Client graphique 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 voir, ma vitesse de connexion est de 63356 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 que 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.
Pour désactiver DTLS, commentez (ajoutez #
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. Notez que vous devez désactiver DTLS dans ocserv, sinon TCP BBR ne fonctionnera pas.
- Comment améliorer facilement les performances du réseau Ubuntu en activant TCP BBR
Dans mon test, TLS standard avec TCP BBR activé est deux fois plus rapide que 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 vivez 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.
Vérifiez également la charge moyenne de votre CPU. (htop
peut être installé par sudo apt install htop
).
htop
Assurez-vous que la charge moyenne du processeur est inférieure à 1
. Une fois, j'ai eu une moyenne de charge CPU de 3
, ce qui entraînait une latence élevée entre le client VPN et le serveur VPN.
Renouvellement automatique du certificat Let's Encrypt
Modifiez le fichier crontab de l'utilisateur root.
sudo crontab -e
Ajoutez la ligne suivante à la fin du fichier. Il est nécessaire de recharger le service ocserv pour que le serveur VPN récupère le nouveau certificat et le fichier de clé.
@daily certbot renew --quiet && systemctl reload ocserv
Conseils de dépannage
OuvrirVZ
Notez que si vous utilisez OpenVZ VPS, assurez-vous d'activer le périphérique de réseau virtuel TUN dans le panneau de configuration VPS. (Si vous utilisez Vultr VPS, vous disposez d'un VPS basé sur KVM, vous n'avez donc pas à vous en soucier.)
Fichier journal
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 changeais le port 443 pour un port différent, le grand pare-feu de Chine bloquerait cette connexion VPN.
Mode de débogage
Si ocserv vous dit qu'il ne peut pas charger le /etc/ocserv/ocserv.conf
fichier, 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 peut vous donner des indices sur la raison pour laquelle ocserv ne fonctionne pas.
Impossible de naviguer sur Internet
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. Je me souviens que mon fournisseur VPS a fait une fois une mise à niveau de la plate-forme, qui a changé le nom de l'interface réseau principale de ens3
à enp3s0
, j'ai donc dû mettre à jour le nom dans le fichier UFW (/etc/ufw/before.rules
).
Erreur de syntaxe
Si vous voyez l'erreur suivante lorsque vous essayez d'établir une connexion VPN, c'est probablement parce qu'il y a une erreur de syntaxe dans votre fichier de configuration ocserv. Vérifiez le journal (sudo journalctl -eu ocserv
) pour le savoir.
Got inappropriate HTTP CONNECT response: HTTP/1.1 401 Cookie is not acceptable
Redémarrez votre ordinateur
Si vous voyez l'erreur suivante lorsque vous essayez d'établir une connexion VPN, il s'agit probablement d'un problème d'ordinateur local. Essayez de redémarrer votre ordinateur.
Server 'vpn.your-domain.com' requested Basic authentication which is disabled by default
La connexion TLS n'a pas été correctement interrompue
Si vous voyez l'erreur suivante sur le client lorsque vous essayez d'établir une connexion VPN,
SSL connection failure: The TLS connection was non-properly terminated.
vous devriez probablement redémarrer ocserv
service sur le serveur VPN.
sudo systemctl restart ocserv
Vous pouvez créer une tâche cron pour redémarrer automatiquement ocserv
une fois par jour à 4h du matin.
sudo crontab -e
Ajoutez la ligne suivante.
0 4 * * * systemctl restart ocserv
Enregistrez et fermez le fichier.
Faites 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 OpenConnect VPN Server et Apache/Nginx sur le même boîtier avec HAProxy
Comment désactiver TLS 1.0 et TLS 1.1 dans ocserv
Le conseil PCI a rendu obsolète TLS 1.0 le 30 juin 2018 et les principaux navigateurs Web 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:-RSA:-VERS-SSL3.0:-ARCFOUR-128"
Pour désactiver TLS 1.0 et TLS 1.1 dans le serveur VPN OpenConnect, ajoutez simplement -VERS-TLS1.0
et -VERS-TLS1.1
dans la ligne.
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1"
Enregistrez et fermez le fichier. Redémarrez ensuite 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 VPN OpenConnect, 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 la sortie, 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 /etc/ocserv/ocserv.conf
fichier.
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 user1
fichier pour permettre une configuration personnalisée pour user1
.
sudo nano /etc/ocserv/config-per-user/user1
Vous pouvez également créer le group1
fichier 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 pour activer le 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
Où :
- La première ligne signifie qu'après
user1
ou utilisateurs dansgroup1
connectez-vous à ce serveur VPN, uniquement le trafic vers le10.10.10.0/24
réseau sera acheminé via un serveur VPN. Le trafic vers d'autres adresses IP est acheminé via la passerelle d'origine. - La deuxième ligne désactive le tunneling des requêtes DNS.
- Les troisième et quatrième lignes définissent les serveurs DNS pour les clients VPN.
J'utilise cette astuce pour permettre à mon autre VPS (serveur privé virtuel) de se connecter à ce serveur VPN sans perturber le trafic normal, donc le périphérique TUN (vpns0) de mon serveur VPN est toujours allumé, ce qui signifie que mon serveur VPN aura toujours le adresse IP privée 10.10.10.1.
Enregistrez et fermez le fichier. Redémarrez ocserv
pour que les modifications prennent effet.
sudo systemctl restart ocserv
Notez que si vous activez IPv6 dans ocserv, vous devez également ajouter la plage réseau IPv6 afin d'utiliser le split tunneling.
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
Si vous souhaitez exclure une adresse IP de la route par défaut, utilisez no-route
.
no-route = 12.34.56.78/32
Cela signifie que tout le reste du trafic passera par le tunnel VPN, à l'exception du trafic vers l'IP 12.34.56.78. Les paramètres route et no-route acceptent à la fois la notation de masque de réseau (10.10.10.0/255.255.255.0) et la notation CIDR (12.34.56.78/32)
Si vous voyez l'erreur suivante après avoir activé le split tunneling, c'est probablement parce que vous n'avez pas utilisé le masque de réseau ou la notation CIDR.
could not parse proxy protocol header; discarding connection
Répartir les tunnels par pays
Supposons que vous souhaitiez que le trafic vers les pays étrangers soit tunnelisé par le VPN. Le trafic vers votre propre pays doit emprunter la route normale. Vous pouvez utiliser le no-route
directive dans le fichier de configuration ocserv pour y parvenir.
Tout d'abord, vous devez télécharger la plage d'adresses IP de votre pays en vous rendant sur cette page Web :https://www.ip2location.com/free/visitor-blocker, qui vous permet de télécharger la plage d'adresses IP au format CIDR.
Enregistrez la plage IP dans un fichier texte ip2location.txt
, et exécutez la commande suivante dans votre terminal Linux pour ajouter le no-route =
directive au début de chaque ligne.
sed 's/^/no-route = /' -i ip2localtion.txt
Ouvrez maintenant le fichier dans un éditeur de texte et copiez toutes les lignes qu'il contient. Nous devons ajouter ces lignes dans le fichier de configuration ocserv. S'il y a trop de lignes, vous pouvez ajouter ces lignes au fichier de configuration par utilisateur.
sudo nano /etc/ocserv/config-per-user/user1
Vous pouvez également les ajouter au fichier de configuration par groupe, puis ajouter des utilisateurs au groupe.
Redémarrez ocserv pour que les modifications prennent effet.
sudo systemctl restart ocserv
Comment activer IPv6 dans OpenConnect VPN
Si votre serveur VPN possède une adresse IPv6 publique, vous pouvez activer IPv6 dans OpenConnect VPN. Modifier le fichier de configuration ocserv.
sudo nano /etc/ocserv/ocserv.conf
Recherchez les deux lignes suivantes et décommentez-les.
ipv6-network = fda9:4efe:7e3b:03ea::/48 ipv6-subnet-prefix = 64
Enregistrez et fermez le fichier. Redémarrez ocserv pour que la modification prenne effet.
sudo systemctl restart ocserv
Ensuite, nous devons activer le transfert IP pour IPv6. Modifier sysctl.conf
fichier.
sudo nano /etc/sysctl.conf
Ajoutez la ligne suivante à la fin de ce fichier.
net.ipv6.conf.all.forwarding=1
Enregistrez et fermez le fichier. Appliquez ensuite les modifications avec la commande ci-dessous.
sudo sysctl -p
Ensuite, nous devons configurer le masquage IPv6 dans le pare-feu du serveur, afin que le serveur devienne un routeur virtuel pour les clients VPN.
sudo nano /etc/ufw/before6.rules
Par défaut, il existe des règles pour le filter
table. Ajoutez les lignes suivantes à la fin de ce fichier. Remplacer ens3
avec votre propre nom d'interface réseau.
# 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
Dans l'éditeur de texte Nano, vous pouvez aller à la fin du fichier en appuyant sur Ctrl+W
, puis en appuyant sur Ctrl+V
.

Par défaut, UFW interdit le transfert de paquets. Nous pouvons autoriser le transfert pour notre réseau IPv6 privé. Trouvez le ufw6-before-forward
chain dans ce fichier et ajoutez les 3 lignes suivantes, qui accepteront le transfert de paquets si l'IP source ou l'IP de destination est dans le fda9:4efe:7e3b:03ea::/48
plage.

Enregistrez et fermez le fichier. Redémarrez UFW pour que la modification prenne effet.
sudo systemctl restart ufw
Maintenant, si vous listez les règles dans la chaîne POSTROUTING de la table NAT en utilisant la commande suivante :
sudo ip6tables -t nat -L POSTROUTING
Vous pouvez voir la règle de mascarade.
Déconnectez la connexion VPN actuelle, ajoutez un enregistrement AAAA pour vpn.example.com
et rétablir la connexion VPN. Rendez-vous ensuite sur https://test-ipv6.com/ pour vérifier votre connectivité IPv6.
Si vous exécutez votre propre résolveur DNS BIND sur le serveur VPN, vous pouvez ajouter la ligne suivante dans /etc/ocserv/ocserv.conf
fichier pour définir le serveur VPN comme résolveur DNS pour les clients VPN.
dns = fda9:4efe:7e3b::1
Enregistrez et fermez le fichier. Pour interroger les noms DNS en IPv6, nous devons configurer BIND pour autoriser les clients VPN IPv6.
sudo nano /etc/bind/named.conf.options
Trouvez le paramètre allow-recursion et changez-le en :
allow-recursion { 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; };
Enregistrez et fermez le fichier. Redémarrez BIND9.
sudo systemctl restart named
Nous devons également autoriser le client VPN IPv6 dans le pare-feu.
sudo ufw allow in from fda9:4efe:7e3b:03ea::/48
Hébergement virtuel
Remarque :Si vous souhaitez simplement avoir la possibilité d'utiliser plusieurs noms d'hôte pour le serveur VPN, vous pouvez utiliser certbot pour obtenir un certificat multi-domaine. Ensuite, redémarrez ocserv et vous avez terminé.
Pour ajouter un nouvel hôte virtuel dans ocserv, vous devez d'abord utiliser la méthode de l'étape 3 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 Ctrl+V
pour aller au bas d'un fichier. Ajoutez les lignes suivantes. Remplacez vpn2.example.com
avec 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. Redémarrez ensuite ocserv.
sudo systemctl restart ocserv
Modifiez le fichier de configuration UFW.
sudo nano /etc/ufw/before.rules
Trouvez le ufw-before-forward
chain dans ce fichier et ajoutez les 2 lignes suivantes, qui accepteront le transfert de paquets si l'IP source ou l'IP de destination est dans le 10.10.20.0/24
plage.
-A ufw-before-forward -s 10.10.20.0/24 -j ACCEPT -A ufw-before-forward -d 10.10.20.0/24 -j ACCEPT
Enregistrez et fermez le fichier. Redémarrez ensuite UFW.
sudo systemctl restart ufw
Notez que le démon ocserv peut vous dire que certains paramètres seront ignorés pour l'hôte virtuel. Cependant, j'ai trouvé que certains des paramètres ignorés sont réellement nécessaires. Par exemple, si vous supprimez le device = vpns
ligne de l'hôte virtuel, vous pouvez rencontrer l'erreur suivante lors de l'établissement de la 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
Remarque également que le client VPN AnyConnect sur iOS ne prend pas en charge TLS SNI, de sorte que les utilisateurs iOS se connecteront à 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 /lib/systemd/system/ocserv.service
dans un nouveau fichier.
sudo cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv2.service
Modifiez ensuite le nouveau fichier.
sudo nano /etc/systemd/system/ocserv2.service
Modifier
/etc/ocserv/ocserv.conf
à
/etc/ocserv/ocserv2.conf
Enregistrez et fermez le fichier. Ensuite, vous pouvez modifier le /etc/ocserv/ocserv2.conf
fichier et ajoutez vos configurations personnalisées. Une fois que vous avez terminé, démarrez le deuxième service ocserv.
sudo systemctl start ocserv2