logo rss

Mise en place d'un serveur OpenVPN sous Debian 12 Bookworm

OpenVPN Logo

Voici un tutoriel pour mettre rapidement en place un serveur OpenVPN sur Debian 12 Bookworm.

Le but est de faire de notre serveur Debian une passerelle VPN permettant à nos clients distants Windows de se connecter à l'intégralité de notre réseau.

C'est généralement la méthode que je privilégie (par rapport à la mise en place sur un serveur Windows) car depuis un serveur Linux il est assez facilement possible de mettre en place le routage (voir la section dédiée) et donc de pouvoir joindre l'entièreté du réseau de l'entreprise depuis le client VPN.

Synoptique

OpenVPN windows client/debian server architecture
  • Serveur OpenVPN :
    • OS : Debian GNU/Linux 12 (Bookworm)
    • Rôle : OpenVPN Serveur + Gateway
    • IP : 192.168.0.254

Configuration côté serveur Debian

Debian Logo

Installation

  • Installation du service OpenVPN :
root@host:~# apt update && apt install openvpn
  • Activer OpenVPN au démarrage :
root@host:~# sed -i 's/#AUTOSTART="all"/AUTOSTART="all"/' /etc/default/openvpn ; systemctl daemon-reload

PKI

  • Se déplacer dans le dossier /etc/openvpn/ :
root@host:~# cd /etc/openvpn/
  • Mise en place du pki :
root@host:~# /usr/share/easy-rsa/easyrsa clean-all root@host:~# /usr/share/easy-rsa/easyrsa init-pki
  • Entrer yes pour démarrer l'initialisation :
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
  • Si comme moi vous n'avez pas envie de regénérer les certificats souvents, éditer le fichier /etc/openvpn/pki/vars :
#Sets the validity period of the EasyRSA certificate authority to 10 years (3650 days). set_var EASYRSA_CA_EXPIRE 3650 #Sets the validity period of EasyRSA-issued certificates to 10 years (3650 days). set_var EASYRSA_CERT_EXPIRE 3650 #Sets the key size for the EasyRSA certificate authority to 4096 bits, ensuring high security without excessive processing load. set_var EASYRSA_KEY_SIZE 4096 #Sets EasyRSA certificate revocation list validity to 10 years. set_var EASYRSA_CRL_DAYS 3650
  • Création du certificate authority dans /etc/openvpn/pki/ca.crt
root@host:~# /usr/share/easy-rsa/easyrsa build-ca nopass
  • Renseigner le Common Name :
* Notice: Using Easy-RSA configuration from: /etc/openvpn/pki/vars * Notice: Using SSL: openssl OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023) Using configuration from /etc/openvpn/pki/cca2af5c/temp.3299e061 .........+++++ ............................+++++ ----- 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-host CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /etc/openvpn/pki/ca.crt

Certificats Serveur

  • Création du certificat et de la clé privé serveur
root@host:~# /usr/share/easy-rsa/easyrsa build-server-full server nopass
  • Génération des paramètres Diffie Hellman dans /etc/openvpn/pki/dh.pem
root@host:~# /usr/share/easy-rsa/easyrsa gen-dh

Certificats Client

  • Créer un certificat client01 :
root@host:~# /usr/share/easy-rsa/easyrsa build-client-full client01 nopass
  • Ou créer 10 certificats clients en une ligne de commande :
root@host:~# for i in $(seq -w 1 10);do /usr/share/easy-rsa/easyrsa build-client-full client"$i" nopass; done

/etc/openvpn/server.conf

  • Éditer le fichier de configuration /etc/openvpn/server.conf :
port 1194 proto udp dev tun ca /etc/openvpn/pki/ca.crt # generated keys cert /etc/openvpn/pki/issued/server.crt key /etc/openvpn/pki/private/server.key # keep secret dh /etc/openvpn/pki/dh.pem server 10.50.8.0 255.255.255.0 # internal tun0 connection IP ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo # Compression - must be turned on at both end persist-key persist-tun 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 verb 3 # verbose mode

Systemd

  • Activer le service OpenVPN Server :
root@host:~# systemctl enable openvpn@server.service
  • Démarrer le service OpenVPN Server :
root@host:~# systemctl start openvpn@server.service

Mode Routeur

Le mode routeur va nous permettre de joindre le réseau privé 192.168.0.0/24 depuis notre client.

nftables

Nous allons utiliser des règles nftables pour permettre aux clients vpn d'accéder à notre réseau 192.168.0.0/24.

identifier ses interfaces réseau

  • Lister les interfaces réseau
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

  • Entrer les règles de masquerade en remplaçant si besoin l'interface enp2s0 :
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

Dans ce cas présent les règles seront perdus au prochain redémarrage.

Règles persistent

  • Pour rendre notre nat persistent éditer 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" } }
  • Activer le service nftables avec systemctl :
root@host:~# systemctl enable nftables.service

Activer le mode Routeur

Pour pouvoir accéder au réseau LAN il faut également activer le routage sur le serveur OpenVPN.

  • Ajouter dans /etc/sysctl.conf la ligne
net.ipv4.ip_forward = 1
  • Pour une prise en compte immédiate, exécuter :
root@host:~# sysctl -p /etc/sysctl.conf

Et si mon serveur OpenVPN a une seule interface réseau et qu'il n'est pas mon routeur par défaut?

OpenVPN VM server architecture

Bien sur, dans de nombreuses situations il ne sera pas possible d'installer OpenVPN sur le routeur internet. Dans ce cas on pourra par exemple installer le serveur OpenVPN dans une Machine Virtuelle.

Nous avons évidemment besoin de créer une redirection de port sur notre routeur internet pour rediriger le traffic OpenVPN (étape 1 sur le schéma) vers notre serveur OpenVPN (étape 2).

Et c'est à peu près tout, ça ne changera rien en terme de configuration pour le reste car nous aurons toujours besoin d'activer le mode routeur et de créer notre règle NAT.

En fait on pourra appliquer les mêmes règles évoquées au dessus et c'est tout.

Configuration côté client Windows

Logo Microsoft
  • Récapitulatifs des fichiers coté client :
    • ca.crt : /etc/openvpn/pki/ca.crt
    • client01.crt : /etc/openvpn/pki/issued/client01.crt
    • client01.key : /etc/openvpn/pki/private/client01.key
  • Les fichiers clients :
fichiers openvpn sur un poste windows
  • Éditer le fichier C:\Program Files\OpenVPN\config\client.ovpn :
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 comp-lzo verb 3
  • Démarrer le client OpenVPN avec les droits administrateur (sinon notre règle de route vers 192.168.0.0 ne fonctionnera pas) :
Note : L'exécution en mode administrateur ne semble plus nécessaire dans les dernières versions d'OpenVPN. Start openvpn from a windows host
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

adresse mail de contact