Debian 11 et OpenVPN : comment créer son propre serveur VPN ?

I. Présentation

Dans ce tutoriel, nous allons apprendre à configurer un serveur VPN sous Debian 11 avec OpenVPN, dans l'objectif de créer un serveur VPN sur lequel on va s'appuyer pour naviguer sur Internet. Ce tutoriel est idéal si vous souhaitez mettre en place votre propre serveur VPN, sur un serveur VPS dans le Cloud chez OVHcloud ou autre... Ainsi, une machine cliente à distance pourra se connecter au serveur OpenVPN pour accéder à Internet en exploitant la connexion du serveur OpenVPN, mais aussi à l'infrastructure distante, que ce soit le serveur VPN en lui-même, ou un autre serveur du même réseau. En effet, ce principe repose sur la mise en place d'un VPN "client-to-site".

Pour rappel, VPN signifie Virtual Private Network et l'objectif d'un VPN est simple : le VPN va créer un lien virtuel entre deux points, par exemple entre deux réseaux d'entreprise (VPN site à site), ou entre un PC client et un réseau d'entreprise (VPN client à site). Au sein de ce lien, que l'on appelle un tunnel, les données seront chiffrées et isolées du reste du trafic, c'est là tout l'intérêt du VPN et cette notion de "privé". De nos jours, les VPN pour un usage personnel sont très populaires pour contourner la censure, masquer sa navigation sur Internet, etc.

Pour mettre en place un serveur VPN basé sur OpenVPN, il y a différentes solutions : s'appuyer sur un pare-feu comme Pfsense, utiliser une machine Linux, utiliser une machine Windows, etc... Aujourd'hui, on s'intéresse à la mise en œuvre sur une machine Linux, en l'occurrence sous Debian 11.

Voici quelques informations sur l'infrastructure du jour :

Debian 11 Serveur OpenVPN

Il y a plusieurs architectures possibles, notamment :

  • Le serveur OpenVPN dispose d'une adresse IP publique (cas d'un VPS) donc on se connecte en direct sur son adresse IP publique
  • Le serveur OpenVPN est masqué derrière un routeur / un pare-feu, et donc derrière un NAT. Résultat, on se connecte sur l'adresse IP publique de l'équipement (routeur/pare-feu) et grâce à une règle de redirection de port, on se connecte à notre VPN - Je suis dans ce cas, dans le cadre de cette démo

Une fois connecté au VPN à partir du client VPN, tout le trafic de la machine passe par le VPN et sort par la connexion Internet du serveur OpenVPN.

II. Installation d'OpenVPN Server sur Debian 11

Nous pourrions configurer le serveur OpenVPN manuellement, et pas à pas sur notre serveur Debian 11. Toutefois, nous allons utiliser un script d'installation qui va permettre de déployer un serveur VPN très facilement et rapidement. Ce script, compatible Debian, Rocky Linux, Fedora, Ubuntu, etc... est disponible sur GitHub : vous pouvez réviser son code à volonté.

En quoi consiste cette installation ? Ce script est très pratique, mais que va-t-il faire sur la machine ?

  • Sur une machine Debian, il va installer les paquets suivants : openvpn, iptables, openssl, wget, ca-certificates, curl, unbound
  • Configurer OpenVPN via le fichier de configuration : /etc/openvpn/server.conf
  • Configurer IPtables sur le serveur pour autoriser les flux
  • Activer le routage sur le serveur VPN ("sysctl net.ipv4.ip_forward = 1" dans /etc/sysctl.d/99-openvpn.conf)

Au-delà d'installer OpenVPN Server, le script va s'appuyer sur une PKI locale pour générer un certificat indispensable au bon fonctionnement du VPN.

Avant de commencer, veillez à ce que votre serveur VPN soit bien connecté à Internet et qu'il dispose d'une adresse IP fixe.

A. Télécharger le script d'installation

Connectez-vous sur votre futur serveur VPN, et commencez par mettre à jour le cache des paquets. On en profite aussi pour installer cURL.

sudo apt-get update
sudo apt-get install curl

Ensuite, téléchargez le script d'installation avec cURL :

curl -O https://raw.githubusercontent.com/Angristan/openvpn-install/master/openvpn-install.sh

Dès que le script est téléchargé, vous devez ajouter des droits d'exécution afin de pouvoir l'exécuter par la suite :

chmod +x openvpn-install.sh

Ensuite, exécutez le script pour commencer la configuration pas à pas d'OpenVPN Server :

sudo ./openvpn-install.sh

B. Configurer le VPN

Le message "Welcome ton the OpenVPN installer!" s'affiche et les étapes de configuration vont s'enchaîner. Tout d'abord, il faut indiquer l'adresse IPv4 du serveur VPN, mais la bonne nouvelle, c'est qu'elle remonte automatiquement. S'il s'agit de l'adresse IP locale, cela signifie qu'il y a un NAT et dans ce cas, c'est logique. Sinon, l'adresse IP publique de votre serveur, par exemple de votre serveur VPS, s'affichera ici. Ici, le script remonte bien "192.168.100.51" Validez.

Serveur OpenVPN - Debian 11 - Script d'installation - Etape 1

D'ailleurs, le script détecte la présence du NAT et indique l'adresse IP publique. Il suffit de valider, à moins que vous souhaitiez préciser un nom de domaine spécifique ou corriger l'information remontée par le script (qui s'appuie sur cURL pour récupérer votre IP publique).

Serveur OpenVPN - Debian 11 - Script d'installation - Etape 2

Il est demandé si vous souhaitez activer le support IPv6, vous pouvez indiquer "n" pour refuser.

  • What port do you want OpenVPN to listen to?

Ensuite, il faut choisir le port sur lequel va écouter le serveur VPN. Par défaut, c'est le port 1194, mais je vous recommande d'utiliser un port personnalisé pour masquer votre VPN (vous pouvez utiliser un port utilisé par un autre protocole (exemple : 443/HTTPS) pour passer plus facilement au travers de certains pare-feu).

Pour définir un port personnalisé, indiquez "2" puis indiquez le numéro de port. Par exemple "44912" dans mon exemple.

  • What protocol do you want OpenVPN to use ?

OpenVPN est plus rapide avec le protocole de transport UDP, et d'ailleurs c'est son mode de fonctionnement par défaut. Je vous encourage à rester sur UDP, sauf si vous chercher à passer au travers d'un pare-feu : si vous utilisez le port 443, il est plus cohérent d'utiliser le TCP pour faire comme le HTTPS !

  • What DNS resolvers do you want to use with the VPN ?

Une fois connecté au VPN, quel serveur VPN voulez-vous utiliser pour la résolution de noms. Vous pouvez choisir un serveur personnalisé avec le choix 13, ou en choisir un dans la liste en indiquant son numéro.

Serveur OpenVPN - Debian 11 - Script d'installation - Etape 3

Voilà pour la première série de questions. Passons à la suite.

  • Do you want to use compression ?

Le script nous recommande de ne pas utiliser la compression, car elle est exploitée par les attaques VORACLE. Indiquez "n" et validez.

  • Customize encryption settings ?

Le script est déjà préconfiguré pour utiliser certains paramètres pour le chiffrement du tunnel VPN et sa sécurité dans son ensemble. Vous avez la possibilité de définir vos propres paramètres en indiquant "y", sinon il suffit de faire "n".

Serveur OpenVPN - Debian 11 - Script d'installation - Etape 4

Ci-dessous, voici les différentes options proposées (ainsi que les choix recommandés et correspondants à la configuration automatique) pour ceux qui décident de personnaliser les options de chiffrement.

Serveur OpenVPN - Debian 11 - Script d'installation - Etape 5

La première partie de l'interrogatoire est terminé ! Jusqu'à présent, le script n'a pas encore modifié la machine locale. Par contre, à ce moment précis si vous appuyez sur la touche "Entrée" (ou une autre touche), l'installation du serveur OpenVPN débutera. 

Serveur OpenVPN - Debian 11 - Script d'installation - Etape 6

C. Création d'un premier client

Suite à la configuration du serveur VPN, l'installation via le script se poursuit avec la création d'un premier client VPN. Indiquez le nom du PC qui va utiliser le VPN (histoire de s'y retrouver), par exemple "pc-flo". Ensuite, la question "Do you want to protect the configuration file with a password?" s'affiche, indiquez "2" pour oui afin de définir un mot de passe qui sera nécessaire pour établir la connexion VPN.

Serveur OpenVPN - Debian 11 - Script d'installation - Etape 7

Ceci va générer un fichier de configuration OVPN dans le profil de l'utilisateur en cours d'utilisation. Ici, je suis connecté en tant que root alors la configuration est générée dans "/root/". D'un point de vue du serveur VPN, l'ajout de ce client va générer  deux fichiers :

  • Le certificat du client dans /etc/openvpn/easy-rsa/pki/issued/<nom du client>.crt
  • La clé privée du client dans /etc/openvpn/easy-rsa/pki/private/<nom du client>.key

Note : à tout moment, vous pouvez modifier la configuration de votre serveur OpenVPN en modifiant le fichier de config : /etc/openvpn/server.conf

D. Ajouter un nouveau client OpenVPN

À tout moment, vous pouvez ajouter un nouveau client pur que chaque machine qui se connecte dispose de son propre certificat. Que ce soit pour ajouter ou supprimer un nouveau client, il suffit de réexécuter le script et de faire le choix "1".

sudo ./openvpn-install.sh

OpenVPN - Ajouter un nouvel utilisateur

E. En mode NAT : la règle de redirection de ports

En mode NAT, c'est-à-dire avec un serveur VPN connecté derrière un routeur/pare-feu où le NAT est activé, vous allez devoir créer une règle de redirection de port. Sinon, les flux à destination de votre adresse IP publique sur le port 44912 ne seront pas redirigés vers le serveur VPN.

Ainsi, sur mon pare-feu, je crée une règle pour rediriger les flux UDP/44912 à destination de mon adresse IP publique à destination du serveur VPN (192.168.100.51).

Serveur OpenVPN - Debian 11 - Script d'installation - Etape 8

III. Tester la connexion VPN

Le fichier de configuration généré précédemment (/root/pc-flo.ovpn) dans le profil de l'utilisateur doit être transféré sur l'ordinateur qui doit se connecter au VPN. Si vous êtes sur Windows, vous pouvez utiliser WinSCP ou SCP, et sous Linux vous pouvez utiliser SCP.

A. Sur Windows

Sur Windows, il faudra installer OpenVPN GUI ou OpenVPN Connect. Personnellement, j'utilise OpenVPN GUI donc je dois copier-coller le fichier OVPN dans le répertoire suivant :

C:\Program Files\OpenVPN\config

Ainsi, dans mon client VPN, je vois bien ma nouvelle connexion VPN apparaître qui reprend pour nom celui du fichier OVPN :

OpenVPN - Connexion au VPN avec le serveur Debian

En cliquant sur "Connecter", je dois saisir le mot de passe associé au client "PC-FLO" afin de m'authentifier à l'aide de mon certificat.

Une fois connecté, je peux accéder en SSH à mon serveur Debian 11 grâce à son adresse IP locale, à savoir "192.168.100.51". Je peux également accéder aux autres serveurs de mon infrastructure distante. Si j'accède à Internet, je passe par mon VPN et j'utilise donc la connexion Internet de mon serveur VPN !

Côté Windows, en regardant la configuration IP de ma machine, je vois que le tunnel VPN fonctionne sur le réseau "10.8.0.0/24" puisque je dispose de l'adresse IP "10.8.0.2/24". Ce sous-réseau est définit dans le fichier "/etc/openvpn/server.conf" du serveur VPN via la ligne "server 10.8.0.0 255.255.255.0". Au niveau des serveurs DNS, ce sont bien ceux de Cloudflare qui sont définis (1.0.0.1 et 1.1.1.1) et que j'avais choisis lors de la configuration initiale.

OpenVPN - Configurer un serveur sous Debian - Connexion depuis Windows

B. Sur Linux

Si votre poste client, qui doit utiliser le VPN, est sous Linux, vous pouvez installer OpenVPN via cette commande :

sudo apt-get install openvpn

Ensuite, le fichier de configuration OVPN devra être déposé à cet emplacement :

/etc/openvpn/client/

Pour déclencher une connexion basée sur ce fichier de configuration, il suffira de faire :

openvpn --client --config /etc/openvpn/client/pc-flo.ovpn

C. Les journaux sur le serveur VPN

La connexion du poste client est visible dans les journaux du serveur VPN, en exécutant la commande ci-dessous.

journalctl --identifier ovpn-server

Par exemple, lors de la connexion depuis mon poste client sous Windows, les journaux suivants sont visibles :

SRV-DEB-1 ovpn-server[436393]: MULTI: multi_init called, r=256 v=256
SRV-DEB-1 ovpn-server[436393]: IFCONFIG POOL IPv4: base=10.8.0.2 size=252
SRV-DEB-1 ovpn-server[436393]: IFCONFIG POOL LIST
SRV-DEB-1 ovpn-server[436393]: Initialization Sequence Completed
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 Outgoing Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 Outgoing Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 Incoming Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 Incoming Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 TLS: Initial packet from [AF_INET]89.87.49.50:53471, sid=eb971c1d a6a6884b
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 VERIFY OK: depth=1, CN=cn_uIEY50Oeg1zhnla8
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 VERIFY OK: depth=0, CN=pc-flo
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_VER=2.5.6
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_PLAT=win
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_PROTO=6
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_NCP=2
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_CIPHERS=AES-256-GCM:AES-128-GCM
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_LZ4=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_LZ4v2=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_LZO=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_COMP_STUB=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_COMP_STUBv2=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_TCPNL=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_GUI_VER=OpenVPN_GUI_11
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_SSO=openurl,crtext
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, 256 bit EC, curve: prime256v1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 [pc-flo] Peer Connection Initiated with [AF_INET]<IP publique du PC Client>:53471

En complément, vous pouvez visualiser les règles IPtables avec la commande ci-dessous :

iptables -t nat -L -n -v

Cette commande doit vous permettre de voir que la chaîne POSTROUTING contient cette ligne :

 2200 971K MASQUERADE all -- * ens192 10.8.0.0/24 0.0.0.0/0

Une ligne indispensable pour que les flux du VPN soient correctement routés et acheminés.

IV. Conclusion

Ce tutoriel touche à sa fin : nous venons de voir une manière simple de mettre en place un serveur OpenVPN sous Debian 11 à l'aide de ce superbe script d'installation. J'ai pris le temps de vous expliquer ce que faisait le script pour que vous puissiez comprendre ce que vous faites, en même temps. Sachez qu'il existe de nombreuses configurations possibles pour la mise en place d'un VPN avec OpenVPN.

Pour mettre en place un VPN permettant de se connecter à une infrastructure complète, je vous recommande de le mettre en place sur votre pare-feu afin de pouvoir gérer les flux directement à ce niveau-là. Ce sera plus facile pour autoriser uniquement certains protocoles dans le tunnel VPN ou pour autoriser les flux uniquement vers certains hôtes. Par contre, pour un VPN que vous utilisez à usage personnel, pour contourner la censure par exemple, cette solution est idéale.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5561.Voir tous les posts

2 thoughts on “Debian 11 et OpenVPN : comment créer son propre serveur VPN ?

  • Bonsoir. L’article est très interessant. Mais j’ai des difficultés. J’ai installé VMWare workstation 17 et j’ai installer un server ubuntu 22.04 LTS, puis j’ai deployé OpenVpn et creer 1 client pc01. Ensuite j’ai ensuite installé windows 10 comme client. j’ai installé openvpn gui et j’ai mis le fichier pc1.opvn dans le repertoire approprié.
    Le problème c’est que mon server vpn se trouve derrière un box orange qui ne possède pas les fonction de redirection de port. Alors comment faire pour que mon vpn puisse marché ?
    IP server vpn : 192.168.204.134
    ip client vpn : 192.168.204.133
    ip public de la box : 154.118.143.46
    port : 44912 en UDP

    Besoin d’aide pour la redirection de port pour que le vpn puis marcher

    Répondre
    • salut, je n’ai pas le réponse à ta question, essaie d’appeler orange pour qu’ils te le fassent ou te donnent accès aux réglages.
      Par contre je pense que tu ne devrais pas mettre ton ip publique à la vue de tous, on m’a toujours dit que c’est risqué.

      Bon courage à toi

      Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.