Configurer un serveur OpenVPN sur Ubuntu vous offre une solution VPN éprouvée, adossée à une PKI mature — idéale pour les travailleurs à distance, les liaisons site à site et la sécurisation du trafic sur des réseaux non fiables. Ce guide vous accompagne à chaque étape : construction d’une autorité de certification avec Easy-RSA, rédaction d’un server.conf prêt pour la production, génération de profils client .ovpn, configuration des règles de pare-feu UFW et activation du masquage NAT pour que les clients VPN accèdent à internet.

Prérequis

  • Serveur Ubuntu 22.04 LTS ou 24.04 LTS avec une adresse IP publique
  • Accès sudo ou root
  • Un nom de domaine ou une IP statique pointant vers votre serveur (recommandé)
  • Familiarité de base avec la ligne de commande Linux
  • UFW installé (par défaut sur Ubuntu ; installez avec sudo apt install ufw si absent)

Installation d’OpenVPN et d’Easy-RSA

Commencez par mettre à jour la liste des paquets et installer OpenVPN ainsi que la boîte à outils Easy-RSA :

sudo apt update && sudo apt upgrade -y
sudo apt install openvpn easy-rsa -y

Copiez le répertoire modèle Easy-RSA vers un emplacement persistant dans le répertoire OpenVPN :

sudo mkdir -p /etc/openvpn/easy-rsa
sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa

Construction de la PKI avec Easy-RSA

Une PKI OpenVPN complète comprend une Autorité de Certification (CA), une paire certificat/clé serveur, des paramètres Diffie-Hellman et une clé HMAC pour l’authentification TLS.

Initialiser la PKI et créer la CA

sudo ./easyrsa init-pki
sudo ./easyrsa build-ca nopass

Acceptez le Nom Commun par défaut (Easy-RSA CA) ou définissez le vôtre. L’option nopass ignore la demande de mot de passe CA — acceptable pour les serveurs automatisés, mais ajoutez une phrase secrète dans les environnements haute sécurité.

Générer le certificat serveur

sudo ./easyrsa gen-req server nopass
sudo ./easyrsa sign-req server server

Tapez yes pour confirmer la signature. Cela produit pki/issued/server.crt et pki/private/server.key.

Générer les paramètres Diffie-Hellman et la clé d’authentification TLS

Les paramètres DH prennent plusieurs minutes à générer :

sudo ./easyrsa gen-dh
sudo openvpn --genkey secret /etc/openvpn/easy-rsa/pki/ta.key

Copiez toutes les clés requises dans le répertoire du serveur OpenVPN :

sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key \
        pki/dh.pem pki/ta.key /etc/openvpn/server/

Rédaction de server.conf

Créez /etc/openvpn/server/server.conf avec la configuration suivante :

# /etc/openvpn/server/server.conf

port 1194
proto udp
dev tun

ca   /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key  /etc/openvpn/server/server.key
dh   /etc/openvpn/server/dh.pem

# Sous-réseau VPN — les clients reçoivent des adresses depuis ce pool
server 10.8.0.0 255.255.255.0

# Pousser la route par défaut (tout le trafic client via le VPN)
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"

# Durcissement TLS
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

keepalive 10 120
user nobody
group nogroup
persist-key
persist-tun

# Journalisation
status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3

Créez le répertoire de journaux et démarrez le service :

sudo mkdir -p /var/log/openvpn
sudo systemctl enable --now openvpn-server@server
sudo systemctl status openvpn-server@server

Règles de Pare-feu et Routage NAT

Activer le transfert IP

Éditez /etc/sysctl.conf et décommentez (ou ajoutez) la ligne suivante :

net.ipv4.ip_forward=1

Appliquez immédiatement sans redémarrage :

sudo sysctl -p

Ajouter les règles de masquage NAT à UFW

Trouvez votre interface réseau publique (généralement eth0 ou ens3) :

ip route | grep default

Éditez /etc/ufw/before.rules et insérez le bloc suivant avant la section *filter :

# OpenVPN NAT
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT

Remplacez eth0 par le nom réel de votre interface.

Ensuite, autorisez le transfert de paquets dans /etc/default/ufw :

DEFAULT_FORWARD_POLICY="ACCEPT"

Ouvrez le port OpenVPN et rechargez UFW :

sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
sudo ufw reload

Génération des Certificats Client et des Fichiers .ovpn

Créer un certificat client

cd /etc/openvpn/easy-rsa
sudo ./easyrsa gen-req client1 nopass
sudo ./easyrsa sign-req client client1

Construire le fichier client1.ovpn

Un fichier .ovpn autonome intègre tous les certificats en ligne afin que l’utilisateur n’ait besoin que d’un seul fichier. Créez /root/clients/client1.ovpn :

client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3

<ca>
# collez ici le contenu de /etc/openvpn/server/ca.crt
</ca>

<cert>
# collez ici le contenu de /etc/openvpn/easy-rsa/pki/issued/client1.crt
</cert>

<key>
# collez ici le contenu de /etc/openvpn/easy-rsa/pki/private/client1.key
</key>

<tls-auth>
# collez ici le contenu de /etc/openvpn/server/ta.key
</tls-auth>

Vous pouvez automatiser l’intégration avec un script shell :

#!/bin/bash
# gen-client.sh
CLIENT=$1
OVPN_DIR=/root/clients
KEYS=/etc/openvpn/easy-rsa/pki

cat > "$OVPN_DIR/$CLIENT.ovpn" <<EOF
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3

<ca>
$(cat "$KEYS/ca.crt")
</ca>

<cert>
$(openssl x509 -in "$KEYS/issued/$CLIENT.crt")
</cert>

<key>
$(cat "$KEYS/private/$CLIENT.key")
</key>

<tls-auth>
$(cat /etc/openvpn/server/ta.key)
</tls-auth>
EOF
echo "Generated $OVPN_DIR/$CLIENT.ovpn"

Utilisation : sudo bash gen-client.sh client1

Comparaison OpenVPN vs WireGuard

FonctionnalitéOpenVPNWireGuard
ProtocoleTLS sur UDP/TCPUDP uniquement (protocole WireGuard)
Flexibilité du portUDP 1194 ou TCP 443UDP uniquement (défaut 51820)
Support clientToutes plateformes + appareils legacyPlateformes modernes (Linux 5.6+, iOS, Android, Windows)
Complexité de configurationÉlevée (PKI, plusieurs fichiers)Faible (paire de clés, config unique)
DébitBonExcellent (espace noyau)
Traversée de pare-feuExcellente (mode TCP 443)Limitée (UDP uniquement)
Historique d’auditÉtendu (depuis 2001)Léger, formellement vérifié
Support site à siteNatifNatif
IP dynamiquesVia l’option --floatRoaming automatique
Idéal pourCompatibilité étendue, clients legacy, réseaux TCP uniquementHautes performances, déploiements modernes, simplicité

Recommandation : Choisissez WireGuard pour les nouveaux déploiements où tous les clients fonctionnent sur des systèmes d’exploitation modernes. Choisissez OpenVPN lorsque vous devez prendre en charge Windows 7/8, les anciennes versions iOS, ou des réseaux qui bloquent entièrement l’UDP.

Scénario Réel

Vous gérez une petite équipe de développement logiciel où trois développeurs distants accèdent à une instance GitLab interne et à un serveur de base de données de préproduction. Votre serveur GitLab se trouve sur 192.168.10.10 dans votre réseau de bureau, derrière un pare-feu qui n’expose que SSH et HTTPS à internet.

Après avoir configuré OpenVPN avec les étapes ci-dessus, chaque développeur exécute son profil prenom.ovpn dans le client OpenVPN. Une fois connecté, son poste de travail reçoit une adresse dans la plage 10.8.0.0/24. Vous ajoutez une route statique sur le serveur OpenVPN en poussant 192.168.10.0/24 vers les clients :

push "route 192.168.10.0 255.255.255.0"

Les développeurs atteignent désormais 192.168.10.10 directement via le tunnel chiffré sans exposer GitLab à internet public. Vous révoquez l’accès instantanément en exécutant ./easyrsa revoke prenom suivi de ./easyrsa gen-crl, puis en ajoutant crl-verify /etc/openvpn/server/crl.pem à server.conf — aucun changement de mot de passe requis.

Pièges et Cas Particuliers

Conflits de routage avec 10.8.0.0/24 : Si votre réseau local utilise déjà ce sous-réseau, changez la directive server pour une plage inutilisée comme 10.9.0.0 255.255.255.0 et mettez à jour la règle de masquage NAT en conséquence.

Tunnel fractionné vs tunnel complet : La directive push redirect-gateway def1 route tout le trafic client via le VPN. Pour un tunnel fractionné (uniquement des sous-réseaux spécifiques), supprimez cette ligne et poussez des routes explicites à la place.

Mode TCP pour les pare-feux restrictifs : Si UDP 1194 est bloqué, changez proto udp en proto tcp et port 1194 en port 443 dans les configs serveur et client. Les performances seront moindres en raison de l’inefficacité TCP-sur-TCP, mais la traversée s’améliore considérablement.

Révocation de certificats : Générez et servez toujours une CRL lors de la révocation de clients. Sans crl-verify dans server.conf, les certificats révoqués continuent de fonctionner.

Fragmentation MTU : Si les clients connaissent un faible débit ou des paquets perdus, ajoutez tun-mtu 1400 et mssfix 1360 à server.conf.

Assignations d’IP persistantes : Utilisez un client-config-dir (CCD) avec des directives ifconfig-push par client pour assigner la même adresse IP à chaque connexion.

Résolution de Problèmes

Le service ne démarre pas : Exécutez sudo journalctl -u openvpn-server@server -e pour lire le journal complet. Les causes courantes sont des chemins de fichiers incorrects dans server.conf ou une direction ta.key incorrecte.

Les clients se connectent mais ne peuvent pas accéder à internet : Confirmez que le transfert IP est actif (cat /proc/sys/net/ipv4/ip_forward doit retourner 1), que la règle MASQUERADE est présente (sudo iptables -t nat -L) et que DEFAULT_FORWARD_POLICY=ACCEPT est défini dans /etc/default/ufw.

Échec de la négociation TLS : Assurez-vous que la valeur key-direction correspond : 0 côté serveur, 1 côté client (ou utilisez tls-crypt au lieu de tls-auth, qui est agnostique à la direction).

Fuites DNS : Vérifiez que les pushes dhcp-option DNS sont reçus par le client avec openvpn --show-status client.log. Utilisez dnsleak.com pour confirmer que les requêtes DNS sortent via le VPN.

Certificat client expiré : Easy-RSA expire les certificats client par défaut à 825 jours. Régénérez avant expiration avec ./easyrsa renew client1 nopass et redistribuez le fichier .ovpn mis à jour.

Résumé

  • Installez openvpn et easy-rsa, puis initialisez une PKI avec une CA, un certificat serveur, des paramètres DH et ta.key
  • Rédigez server.conf avec le chiffrement AES-256-GCM, le durcissement d’authentification TLS et le sous-réseau VPN 10.8.0.0/24
  • Activez le transfert IP et ajoutez une règle UFW MASQUERADE pour que les clients VPN accèdent à internet
  • Utilisez un script shell pour intégrer les certificats en ligne dans des profils client .ovpn autonomes
  • OpenVPN est le bon choix pour les clients legacy et la traversée de pare-feux TCP uniquement ; WireGuard gagne en performances et simplicité pour les déploiements modernes
  • Révoquez les clients instantanément via la CRL Easy-RSA sans réinitialiser les secrets partagés
  • Surveillez /var/log/openvpn/openvpn.log et utilisez journalctl pour les diagnostics au niveau du service

Articles Connexes