Mise en place d'un serveur OpenVPN sous Debian 11 Bullseye

OpenVPN Logo

Voici un tutoriel pour mettre en place rapidement un serveur OpenVPN sous Debian 11 Bullseye.

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

Synoptique

OpenVPN windows client/debian server architecture
  • Serveur OpenVPN :
    • OS : Debian GNU/Linux 11 (Bullseye)
    • 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 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 :
  • Type yes to initialize :
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
  • 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 :
Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating RSA private key, 2048 bit long modulus (2 primes)
.........+++++
............................+++++
e is 65537 (0x010001)
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:~# 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

Microsoft Logo
  • 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) :
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 :