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 ufwsi 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é | OpenVPN | WireGuard |
|---|---|---|
| Protocole | TLS sur UDP/TCP | UDP uniquement (protocole WireGuard) |
| Flexibilité du port | UDP 1194 ou TCP 443 | UDP uniquement (défaut 51820) |
| Support client | Toutes plateformes + appareils legacy | Plateformes modernes (Linux 5.6+, iOS, Android, Windows) |
| Complexité de configuration | Élevée (PKI, plusieurs fichiers) | Faible (paire de clés, config unique) |
| Débit | Bon | Excellent (espace noyau) |
| Traversée de pare-feu | Excellente (mode TCP 443) | Limitée (UDP uniquement) |
| Historique d’audit | Étendu (depuis 2001) | Léger, formellement vérifié |
| Support site à site | Natif | Natif |
| IP dynamiques | Via l’option --float | Roaming automatique |
| Idéal pour | Compatibilité étendue, clients legacy, réseaux TCP uniquement | Hautes 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
openvpneteasy-rsa, puis initialisez une PKI avec une CA, un certificat serveur, des paramètres DH etta.key - Rédigez
server.confavec le chiffrement AES-256-GCM, le durcissement d’authentification TLS et le sous-réseau VPN10.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
.ovpnautonomes - 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.loget utilisezjournalctlpour les diagnostics au niveau du service