rss logo

Comment Configurer un Serveur OpenVPN sur Debian 13 Trixie

Logo OpenVPN

Avec la sortie Debian 13 “Trixie”, c’est le moment idéal pour mettre à jour mon tutoriel de mise en place d'un serveur OpenVPN et découvrir les nouveautés avec cette version.

Il s’agit d’un tutoriel pratique pour installer et configurer un serveur OpenVPN sur Debian 13 Trixie.

Notre objectif est de transformer le serveur Debian en une passerelle VPN pleinement fonctionnelle, offrant aux clients Windows distants un accès sécurisé à l’ensemble du réseau.

Cette configuration est mon approche privilégiée, car elle permet un accès à toutes les ressources internes de l’entreprise (voir la section Mode Passerelle pour plus de détails).

Schéma du Réseau OpenVPN

Client Windows connecté via OpenVPN à un serveur Debian 13 Trixie, schéma du réseau de la passerelle VPN.
  • Serveur OpenVPN :
    • OS : Debian GNU/Linux 13 (Trixie)
    • Rôle : Serveur OpenVPN + Passerelle
    • IP (wan) : OPENVPN_IP
    • IP (lan) : 192.168.0.254 et 10.50.8.1

Configuration du Serveur OpenVPN (Debian 13 Trixie)

Logo Debian

Installation

  • Installez le paquet OpenVPN :
root@host:~# apt update && apt install openvpn
  • Activez le démarrage automatique du service OpenVPN :
root@host:~# sed -i 's/#AUTOSTART="all"/AUTOSTART="all"/' /etc/default/openvpn
root@host:~# systemctl daemon-reload; systemctl restart openvpn

PKI

  • Accédez au répertoire /etc/openvpn/ :
root@host:~# cd /etc/openvpn/
  • Initialisez l'PKI (Infrastructure à Clé Publique) :
root@host:~# /usr/share/easy-rsa/easyrsa init-pki
  • Tapez yes lorsque vous êtes invité à initialiser l'PKI et confirmez la suppression de la configuration existante :
WARNING!!!

You are about to remove the EASYRSA_PKI at:
* /etc/openvpn/pki

and initialize a fresh PKI here.

Type the word 'yes' to continue, or any other input to abort.
  Confirm removal: yes

         ******************************************
         * SECOND WARNING - STOP - SECOND WARNING *
         ******************************************

  To keep your current 'pki/vars' settings use 'init-pki soft'.
  To keep your current Request files use 'init-pki soft'
  The Requests can then be signed by a new CA (Partial CA renewal)
  To keep your current Easy-RSA TLS Key use 'init-pki soft'
  This private key file is in use by your current VPN.

       ** USE OF   'init-pki soft'   IS RECOMMENDED **


Type the word 'yes' to continue, or any other input to abort.
  
  WARNING: COMPLETELY DESTROY current PKI (NOT recommended) ?

    [yes/NO]: yes


Notice
------
'init-pki' complete; you may now create a CA or requests.

Your newly created PKI dir is:
* /etc/openvpn/pki

Using Easy-RSA configuration:
* undefined
  • Si, comme moi, vous ne souhaitez pas régénérer les certificats fréquemment, créez et modifiez le fichier /etc/openvpn/pki/vars :
root@host:~# cp -a /usr/share/easy-rsa/vars.example /etc/openvpn/pki/vars
# In how many days should the root CA key expire?
set_var EASYRSA_CA_EXPIRE       3650

# In how many days should certificates expire?
set_var EASYRSA_CERT_EXPIRE     1825

# How many days until the Certificate Revokation List will expire.
#
# IMPORTANT: When the CRL expires, an OpenVPN Server which uses a
# CRL will reject ALL new connections, until the CRL is replaced.
#
set_var EASYRSA_CRL_DAYS        1095

# Choose a size in bits for your keypairs. The recommended value is 2048.
# Using 2048-bit keys is considered more than sufficient for many years into
# the future. Larger keysizes will slow down TLS negotiation and make key/DH
# param generation take much longer. Values up to 4096 should be accepted by
# most software. Only used when the crypto alg is rsa, see below.
set_var EASYRSA_KEY_SIZE        4096
  • Une fois tout configuré, créez l'Autorité de Certification (CA) dans /etc/openvpn/pki/ca.crt :
root@host:~# /usr/share/easy-rsa/easyrsa build-ca nopass
  • Lorsqu'on vous le demande, entrez un Nom Commun (CN) pour votre CA :
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:openvpn-server

Notice
------
CA creation complete. Your new CA certificate is at:
* /etc/openvpn/pki/ca.crt

Create an OpenVPN TLS-AUTH|TLS-CRYPT-V1 key now: See 'help gen-tls'

Build-ca completed successfully.

Générer le Certificat, la Clé Privée et les Paramètres Diffie-Hellman du Serveur OpenVPN

  • Créez le certificat du serveur OpenVPN et sa clé privée :
root@host:~# /usr/share/easy-rsa/easyrsa build-server-full server nopass
Using Easy-RSA 'vars' configuration:
* /etc/openvpn/pki/vars
[…]
-----

Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /etc/openvpn/pki/reqs/server.req
* key: /etc/openvpn/pki/private/server.key

You are about to sign the following certificate:

  Requested CN:     'server'
  Requested type:   'server'
  Valid for:        '1825' days


subject=
    commonName                = server

Type the word 'yes' to continue, or any other input to abort.
  Confirm requested details: yes

Using configuration from /etc/openvpn/pki/9934d973/temp.6.1
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Aug 14 13:00:21 2030 GMT (1825 days)

Write out database with 1 new entries
Database updated

Notice
------
Inline file created:
* /etc/openvpn/pki/inline/private/server.inline


Notice
------
Certificate created at:
* /etc/openvpn/pki/issued/server.crt

💡 Note : La ligne Valid for: '1825' days confirme que la modification apportée dans le fichier /etc/openvpn/pki/vars a bien été appliquée.

  • Générez les paramètres Diffie–Hellman (DH) et enregistrez-les dans /etc/openvpn/pki/dh.pem :
root@host:~# /usr/share/easy-rsa/easyrsa gen-dh
Using Easy-RSA 'vars' configuration:
* /etc/openvpn/pki/vars
Generating DH parameters, 4096 bit long safe prime
[…]
DH parameters appear to be ok.

Notice
------

DH parameters of size 4096 created at:
* /etc/openvpn/pki/dh.pem

Générer les Certificats et Clés des Clients OpenVPN

💡 Note : Les clés privées des clients sont stockées dans /etc/openvpn/pki/private/ et les certificats émis dans /etc/openvpn/pki/issued/.

  • Générez le certificat et la clé privée pour client01 :
root@host:~# /usr/share/easy-rsa/easyrsa build-client-full client01 nopass
Using Easy-RSA 'vars' configuration:
* /etc/openvpn/pki/vars
[…]
-----

Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /etc/openvpn/pki/reqs/client01.req
* key: /etc/openvpn/pki/private/client01.key

You are about to sign the following certificate:

  Requested CN:     'client01'
  Requested type:   'client'
  Valid for:        '1825' days


subject=
    commonName                = client01

Type the word 'yes' to continue, or any other input to abort.
  Confirm requested details: yes

Using configuration from /etc/openvpn/pki/7e41ac10/temp.6.1
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'client01'
Certificate is to be certified until Aug 14 13:09:38 2030 GMT (1825 days)

Write out database with 1 new entries
Database updated

Notice
------
Inline file created:
* /etc/openvpn/pki/inline/private/client01.inline


Notice
------
Certificate created at:
* /etc/openvpn/pki/issued/client01.crt

Après avoir exécuté la commande ci-dessus, le certificat et la clé privée pour client01 seront générés dans les emplacements suivants :

Client Chemin du Certificat Chemin de la Clé Privée
client01 /etc/openvpn/pki/issued/client01.crt /etc/openvpn/pki/private/client01.key
  • Pour générer 10 certificats et clés privées pour les clients (client01 à client10) en une seule commande :
root@host:~# for i in $(seq -w 1 10);do /usr/share/easy-rsa/easyrsa build-client-full client"$i" nopass; done

Configuration du Serveur OpenVPN – server.conf

  • Créez et modifiez le fichier de configuration du serveur OpenVPN à l'emplacement /etc/openvpn/server.conf :
port 1194
proto udp
dev tun

ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/server.crt
key /etc/openvpn/pki/private/server.key # the server.key private key must be kept secret
dh /etc/openvpn/pki/dh.pem

# internal tun0 connection IP
server 10.50.8.0 255.255.255.0

ifconfig-pool-persist ipp.txt

keepalive 10 120

# Compression - must now be turned off for security reasonfor security reasons.
# Use compress stub-v2 if needed in place
#comp-lzo

persist-key
persist-tun

# parameters to be adjusted according to your network configuration
push "dhcp-option DNS 192.168.0.200"
push "dhcp-option DOMAIN std.local"
push "route 192.168.0.0 255.255.255.0"

status /var/log/openvpn-status.log

# verbose mode
verb 3

Gérer le Service du Serveur OpenVPN avec Systemd

  • Activez le service OpenVPN server pour qu'il démarre automatiquement au boot :
root@host:~# systemctl enable openvpn@server.service
  • Redémarrez le service OpenVPN server pour appliquer les modifications :
root@host:~# systemctl restart openvpn@server.service

Mode Passerelle

Le mode passerelle permet aux clients VPN d'accéder au réseau interne 192.168.0.0/24 depuis le côté client.

Configuration de nftables

Quelques règles netfilter permettront aux clients VPN d'accéder à l'ensemble du réseau via le tunnel VPN.

Identifier les Interfaces Réseau

  • Listez toutes les interfaces réseau sur le serveur et identifiez celle connectée au réseau local (LAN) :
root@host:~# ip addr sh
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 01:02:a0:21:fd:54 brd ff:ff:ff:ff:ff:ff
    inet OPENVPN_IP brd X.X.X.X scope global wan
       valid_lft forever preferred_lft forever
    inet6 fe80::ff:fe5d:f333/64 scope link 
       valid_lft forever preferred_lft forever
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 11:a2:a9:21:fd:54 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.254 brd X.X.X.X scope global wan
       valid_lft forever preferred_lft forever
    inet6 fe80::6a05:caff:fe39:c153/64 scope link 
       valid_lft forever preferred_lft forever
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none 
    inet 10.50.8.1 peer 10.50.8.2/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::7ea2:577f:e834:7a20/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

Règles Temporaires

  • Ajoutez des règles de masquerade pour rendre le réseau interne accessible aux clients VPN Windows :
root@host:~# nft add table ip NAT
root@host:~# nft add chain ip NAT my_masquerade '{ type nat hook postrouting priority 100; }'
root@host:~# nft add rule NAT my_masquerade ip saddr { 10.50.8.0/24 } oifname enp2s0 masquerade

Règles Persistantes

  • Pour rendre la configuration nat persistante, modifiez le fichier /etc/nftables.conf :
#!/usr/sbin/nft -f

flush ruleset

table inet filter {
        chain input {
                type filter hook input priority 0;
        }
        chain forward {
                type filter hook forward priority 0;
        }
        chain output {
                type filter hook output priority 0;
        }
}
table ip NAT {
        chain my_masquerade {
                type nat hook postrouting priority 100; policy accept;
                ip saddr { 10.50.8.0/24 } oifname "enp2s0" masquerade comment "outgoing NAT"
        }
}
  • Activez le service nftables pour qu'il démarre automatiquement au boot :
root@host:~# systemctl enable nftables.service

Activer le Transfert IP pour le Mode Passerelle

  • Modifiez le fichier /etc/sysctl.conf et ajoutez la ligne suivante :
net.ipv4.ip_forward=1
  • Appliquez le changement immédiatement avec la commande suivante :
root@host:~# sysctl -p /etc/sysctl.conf

OpenVPN avec une Interface Réseau Unique (Pas Passerelle par Défaut)

Configuration OpenVPN avec une interface unique, qui n'est pas la passerelle par défaut.

Parfois, il n'est pas possible d'installer OpenVPN directement sur le routeur. Dans de tels cas, vous pouvez configurer le serveur OpenVPN en tant que machine virtuelle ou le déployer sur un serveur dédié au sein du LAN interne.

Créez une règle de redirection de port sur le routeur WAN pour rediriger le trafic OpenVPN (étape 1 du schéma) vers le serveur OpenVPN (étape 2).

Le reste de la configuration reste identique : activez le mode passerelle et créez une règle NAT afin que le client puisse atteindre l'ensemble du LAN 192.168.0.0/24 (étape 3).

En résumé, appliquez les mêmes règles que celles décrites précédemment.

Configuration du Client Windows

Logo Microsoft

Tout d'abord, téléchargez et installez l'édition communautaire d'OpenVPN pour Windows depuis le site officiel : OpenVPN Community Edition pour Windows.

  • Copiez les fichiers suivants depuis le serveur Debian vers le client Windows :
    • ca.crt/etc/openvpn/pki/ca.crt
    • client01.crt/etc/openvpn/pki/issued/client01.crt
    • client01.key/etc/openvpn/pki/private/client01.key
    Placez-les dans l'un des répertoires suivants :
    • C:\Program Files\OpenVPN\config
    • C:\Users\utilisateur\OpenVPN\config\ (recommandé)
  • Après avoir copié les fichiers, vous devriez voir les fichiers client suivants sur votre machine Windows :
Dossier de configuration OpenVPN sous Windows affichant les fichiers ca.crt, client01.crt et client01.key..
  • Créez le fichier client.ovpn dans le même répertoire que les fichiers ci-dessus :
client

dev tun

proto udp

remote OPENVPN_IP 1194

resolv-retry infinite
nobind
persist-key
persist-tun

ca ca.crt
cert client01.crt
key client01.key

# disabled for security, use compress stub-v2 if needed in place
#comp-lzo

verb 3
  • Ouvrez OpenVPN et cliquez sur connect :
Menu de la barre des tâches du client OpenVPN sous Windows affichant l'option Se connecter.
  • Si OpenVPN est lancé pour la première fois par un utilisateur sans droits administrateur, cette fenêtre contextuelle apparaîtra. Cliquez sur Oui et entrez les identifiants administrateur pour ajouter l'utilisateur actuel au groupe Administrateurs OpenVPN :
Invite OpenVPN sous Windows demandant de rejoindre le groupe Administrateurs OpenVPN avant de se connecter.
  • Cette fenêtre de confirmation devrait apparaître, et l'icône OpenVPN deviendra verte, indiquant que vous êtes connecté avec succès au serveur.
Notification OpenVPN sous Windows indiquant que le client est connecté avec l'IP attribuée 10.50.8.6.

💡 Remarque : Maintenant que votre VPN est pleinement fonctionnel, je vous recommande d’en renforcer la sécurité en ajoutant une clé HMAC ta.key. Voir Améliorer la sécurité d’OpenVPN pour plus de détails.