Debian 11 et OpenVPN : comment créer son propre serveur VPN ?
Sommaire
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 :
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.
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).
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.
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".
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.
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.
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.
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
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.
- Si ces concepts sont flous pour vous : Le NAT et le PAT pour les débutants
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).
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 :
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.
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.
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
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
bonjour j’ai créé le serveur VPN sur mon PVE mais au moment de faire la redirection de port il me demande le port interne mais il est pas indiqué dans le tuto si quelqu’un peut m’aider?
info monn srv est en .248 et quand je scanne mon reseau il me dit que uniquement le port 22 est ouvert car j’ai activé le SSH
merci