Mes notes de configuration pour OpenVPN
- Mise à jour le 31 mars 2025
Intro
OpenVPN a de multiples éléments paramétrables.
Je vais mettre ici quelques éléments spécifiques que j'ai déjà eu à utiliser. J'utilise traditionnellement un Debian pour mettre en place mes serveurs OpenVPN.
Coté client ou coté serveur?
On peut paramétrer son tunnel VPN du coté du serveur ou du coté du client. La principale différence est qu'il faudra utiliser le mot clé push lorsque l'on modifie le fichier de configuration du coté du serveur, également la configuration sera appliquée sur l'ensemble des clients.
Exemple
Voyons la difference de synthaxe évoquée juste au dessus en mettant en place la même configuration des deux cotés. Ici avec le paramétrage du serveur DNS.
- Coté client :
dhcp-option DNS 192.168.0.200
- Coté serveur :
push "dhcp-option DNS 192.168.0.200"
DNS
Configurer les serveurs dns et le domaine
- On peut définir un serveur DNS et un DOMAIN :
dhcp-option DNS 192.168.0.200
dhcp-option DOMAIN domain.local
Filtrage
En terme de sécurité il peut être intéressant de restreindre les flux accessibles via le VPN, pour cela on pourra utiliser la commande iptables
.
Netfilter - iptables
- Ici on accepte seulement le trafic RDP et DNS :
root@host:~# iptables -A FORWARD -o enp4s0 -p tcp --dport 3389 -j ACCEPT
root@host:~# iptables -A FORWARD -i enp4s0 -p tcp --sport 3389 -j ACCEPT
root@host:~# iptables -A FORWARD -o enp4s0 -p tcp --dport 53 -j ACCEPT
root@host:~# iptables -A FORWARD -o enp4s0 -p udp --dport 53 -j ACCEPT
root@host:~# iptables -A FORWARD -i enp4s0 -p udp --sport 53 -j ACCEPT
root@host:~# iptables -A FORWARD -i enp4s0 -p tcp --sport 53 -j ACCEPT
root@host:~# iptables -A FORWARD -o enp4s0 -j DROP
Routage
Mode passerelle
On peut activer le routage pour donner accès à l'intégralité d'un réseau.
- Éditer le fichier
/etc/sysctl.conf
:
net.ipv4.ip_forward = 1
- Entrer la commande :
root@host:~# sysctl -p /etc/sysctl.conf
- Utiliser la commande
iptables
pour activer le NAT et autoriser les clients à atteindre le réseau interne :
root@host:~# iptables -t nat -A POSTROUTING -s 10.50.8.0/24 -o ens192 -j MASQUERADE
Ajouter une route pour un réseau
- Le réseau
192.168.1.0/24
sera annoncé comme atteignable depuis le tunnel OpenVPN :
route 192.168.1.0 255.255.255.0
Exclure des routes
Ici un cas ou les adresses 192.168.0.251
et 192.168.0.250
seront accessibles via le VPN, le reste du réseau 192.168.0.0/24
sera quand à lui accessible via le LAN ou la passerelle par défaut interne. C'est particulièrement utile lorsque le Client et le Serveur utilisent le même plan d'adressage.
route 192.168.0.251 255.255.255.255
route 192.168.0.250 255.255.255.255
route 192.168.0.0 255.255.255.0 net_gateway
Amérliorer la sécurité
ta.key
Pour se prémunir du scan de ports, attaque de type DOS sur le port UDP OpenVPN, des initiations de négociation SSL/TLS depuis des machines non authorisées et des vulnérabilités de type buffer overflow dans le protocole SSL/TLS (source) nous pouvons ajouter la protection clé HMAC.
- Générer la clé :
root@host:~# openvpn --genkey --secret /etc/openvpn/pki/issued/ta.key
- Ajouter cette ligne dans
/etc/openvpn/server.conf
:
tls-crypt /etc/openvpn/pki/issued/ta.key 0
- Ajouter le fichier
ta.key
ainsi que la ligne suivante dans le fichier de configuration client :
tls-crypt ta.key 1
Méthode de vérification du certificat serveur
OpenVPN donne la possibilité de se prémunir des attaques de type Man-in-the-Middle. Si cela n'est pas paramétré le message : WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info. devrait apparaitre dans les logs du client.
- Ajouter cette ligne depuis le fichier de configuration client :
remote-cert-tls server
Révoquer un certificat
Dans le cas ou des certificats auraient été compromis (vol d'un portable utilisateur) ou si un utilisateur ne fait plus partie de l'entreprise, il peut être interessant de savoir comment révoquer/annuler un certificat.
Ancienne méthode avec les vieilles versions de easy-rsa
- Charger les variables
vars
et lancer la commanderevoke-full
:
root@host:~# . ./vars
root@host:~# ./revoke-full user
- Éditer le fichier
/etc/openvpn/server.conf
et ajouter (à adapter selon l'endroit ou se trouve le ficheircrl.pem
) :
[…]
crl-verify /etc/openvpn/easy-rsa/keys/crl.pem
[…]
- Redémarrer le service OpenVPN :
root@host:~# /etc/init.d/openvpn restart
Nouvelle méthode avec easy-rsa 3
- Éditer le fichier
/etc/openvpn/pki/vars
:
#Configure la validité de la liste de révocation de certificats EasyRSA à 10 ans.
set_var EASYRSA_CRL_DAYS 3650
- Lancer la commande pour révoquer le certificat :
root@host:~# /usr/share/easy-rsa/easyrsa revoke user
Using SSL: openssl OpenSSL 1.1.1k 25 Mar 2021
Please confirm you wish to revoke the certificate with the following subject:
subject=
commonName = client_revoker
Type the word 'yes' to continue, or any other input to abort.
Continue with revocation: yes
Using configuration from /etc/openvpn/pki/easy-rsa-1425.nUpHJc/tmp.r2wWDy
Revoking Certificate 1EA551CC14F3856B8A30CD92BAE6F3BE.
Data Base Updated
IMPORTANT!!!
Revocation was successful. You must run gen-crl and upload a CRL to your
infrastructure in order to prevent the revoked cert from being accepted.
- Générer le fichier
crl.pem
:
root@host:~# /usr/share/easy-rsa/easyrsa gen-crl
Using SSL: openssl OpenSSL 1.1.1k 25 Mar 2021
Using configuration from /etc/openvpn/pki/easy-rsa-1468.2IiBpN/tmp.0UJjU8
An updated CRL has been created.
CRL file: /etc/openvpn/pki/crl.pem
- Éditer le fichier
/etc/openvpn/server.conf
et ajouter :
[…]
crl-verify /etc/openvpn/easy-rsa/keys/crl.pem
[…]
- Redémarrer le service OpenVPN :
root@host:~# systemctl restart openvpn@server.service
Renouveler le certificat CRL
- Pour renouveler le certificat CRL, exécutez simplement ces commandes :
root@host:~# /usr/share/easy-rsa/easyrsa gen-crl
root@host:~# systemctl restart openvpn@server.service
Vérifier la validité d'un certificat utilisateur
- Nous pouvons vérifier si un certificat utilisateur a été révoqué ou non avec cette commande :
root@host:~# openssl verify -crl_check -CRLfile /etc/openvpn/easy-rsa/keys/crl.pem -CAfile /etc/openvpn/pki/ca.crt /etc/openvpn/pki/issued/user.crt
- Nous pouvons vérifier tous les certificats avec cette commande :
root@host:~# openssl verify -crl_check -CRLfile /etc/openvpn/easy-rsa/keys/crl.pem -CAfile /etc/openvpn/pki/ca.crt /etc/openvpn/pki/issued/*
Renouveler les certificats
Renouveler les certificats du Serveur
En cas du message WARNING: Your certificate has expired!.
- Vérifier la validité du certificat :
root@host:~# openssl x509 -in /etc/openvpn/pki/issued/server.crt -noout -text | grep -i "not after"
- Renouveler les certificats serveur :
root@host:~# ./easyrsa renew server nopass
- Copier les certificats nouvellement créés :
root@host:~# copy server.crt /etc/openvpn/pki/issued/server.crt
root@host:~# copy server.key /etc/openvpn/pki/private/server.key
- Redémarrer le service openvpn :
root@host:~# systemctl restart openvpn@server.service
Renouveler les certificats d'un Client
- Renouveler les certificats client :
root@host:~# ./easyrsa renew user01 nopass
Enfin, remplacer les fichiers ./private/user01.key
et ./issued/user01.crt
nouvellement créés dans le dossier de configuration openvpn sur le PC du client.
Divers
Afficher les sessions courantes
- Ajouter la ligne suivante dans
server.conf
:
status /var/log/openvpn-status.log
- Afficher les sessions courantes :
root@host:~# cat /var/log/openvpn-status.log