VPN / Sécurité

📚 Installation OpenVPN Serveur Debian — PKI EasyRSA Guide Complet

Installation complète OpenVPN sur Debian/Ubuntu : PKI avec EasyRSA 3, certificats CA/serveur/clients, configuration server.conf, NAT, profils .ovpn et révocation de certificats.

OpenVPNEasyRSAPKICertificatsTLSNAT.ovpnDebian

Architecture et fonctionnement

OpenVPN est un VPN SSL/TLS open-source très répandu. Il utilise une PKI (Infrastructure à Clés Publiques) avec une Autorité de Certification (CA) pour authentifier serveurs et clients. Il fonctionne en UDP (recommandé) ou TCP sur le port de votre choix.

ModeDescriptionUsage typique
TUN (couche 3)Tunnel IP — routage entre réseauxAccès distant, site-to-site routé
TAP (couche 2)Pont Ethernet — même broadcastVoIP, LAN étendu, cas spécifiques
UDP 1194Mode par défaut — plus rapideRecommandé pour tous les usages
TCP 443Passe les firewalls restrictifsContournement de restrictions réseau
ℹ️
Ce guide utilise EasyRSA 3 pour gérer la PKI et OpenVPN 2.6 sur Debian/Ubuntu. La PKI peut être sur le serveur OpenVPN ou sur une machine dédiée (recommandé en production).

Étape 1 — Installation du serveur et EasyRSA

01-install-openvpn.sh
#!/bin/bash
# Installation OpenVPN + EasyRSA sur Debian 12 / Ubuntu

apt update
apt install -y openvpn easy-rsa

# Créer le répertoire de travail EasyRSA
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa

echo "[OK] OpenVPN et EasyRSA installés"

Étape 2 — Créer la PKI et le CA

02-pki-setup.sh
cd /etc/openvpn/easy-rsa

# Initialiser la PKI (crée le répertoire de structure)
./easyrsa init-pki

# Créer l'Autorité de Certification (CA)
# --batch évite les questions interactives
./easyrsa build-ca nopass --batch

# Vérifier les fichiers créés
ls pki/
#  ca.crt        — Certificat public du CA (à distribuer aux clients)
#  private/ca.key — Clé privée du CA (NE JAMAIS partager)

echo "[OK] PKI et CA créés"

Étape 3 — Générer les certificats serveur et clients

03-certificates.sh
cd /etc/openvpn/easy-rsa

# ── Certificat et clé du SERVEUR ─────────────────────────────
./easyrsa gen-req server nopass --batch
./easyrsa sign-req server server --batch

# ── Paramètres Diffie-Hellman (échange de clés sécurisé) ─────
./easyrsa gen-dh

# ── Clé TLS-Auth (protection contre les attaques DoS/replay) ─
openvpn --genkey secret pki/ta.key

# ── Certificat CLIENT (répéter pour chaque client) ───────────
CLIENT="client-jean"
./easyrsa gen-req $CLIENT nopass --batch
./easyrsa sign-req client $CLIENT --batch

# ── Copier les fichiers serveur dans /etc/openvpn/server/ ────
cp pki/ca.crt              /etc/openvpn/server/
cp pki/issued/server.crt   /etc/openvpn/server/
cp pki/private/server.key  /etc/openvpn/server/
cp pki/dh.pem              /etc/openvpn/server/
cp pki/ta.key              /etc/openvpn/server/

chmod 600 /etc/openvpn/server/*.key
chown -R root:root /etc/openvpn/server/

echo "[OK] Certificats générés et copiés"

Étape 4 — Configuration du serveur OpenVPN

/etc/openvpn/server/server.conf
# ── Réseau ────────────────────────────────────────────────────
port 1194
proto udp
dev tun

# ── Certificats PKI ───────────────────────────────────────────
ca   /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key  /etc/openvpn/server/server.key
dh   /etc/openvpn/server/dh.pem

# ── Sécurité TLS ─────────────────────────────────────────────
tls-auth /etc/openvpn/server/ta.key 0
tls-version-min 1.2
cipher AES-256-GCM
auth SHA256
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384

# ── Réseau VPN ───────────────────────────────────────────────
server 10.8.0.0 255.255.255.0    # Plage IP attribuée aux clients
ifconfig-pool-persist /var/log/openvpn/ipp.txt

# ── Pousser la route et le DNS vers les clients ───────────────
push "redirect-gateway def1 bypass-dhcp"     # Tout le trafic via VPN
push "dhcp-option DNS 192.168.1.10"          # DNS interne
push "dhcp-option DNS 8.8.8.8"
push "route 192.168.1.0 255.255.255.0"       # Réseau LAN entreprise

# ── Maintien de connexion ─────────────────────────────────────
keepalive 10 120
persist-key
persist-tun

# ── Sécurité (moindre privilège) ──────────────────────────────
user nobody
group nogroup

# ── Logs ─────────────────────────────────────────────────────
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3

# ── Révocation (CRL) ─────────────────────────────────────────
# crl-verify /etc/openvpn/server/crl.pem

Étape 5 — Activation NAT et démarrage

05-nat-start.sh
#!/bin/bash

# ── Activer le routage IP ─────────────────────────────────────
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

# ── NAT : partager la connexion internet avec les clients VPN ─
# Remplacer eth0 par votre interface WAN réelle
NIC=$(ip route | awk '/default/ {print $5; exit}')
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o $NIC -j MASQUERADE
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT

# Rendre les règles persistantes
apt install -y iptables-persistent
netfilter-persistent save

# ── Créer le répertoire de logs ───────────────────────────────
mkdir -p /var/log/openvpn

# ── Démarrer et activer OpenVPN ───────────────────────────────
systemctl enable --now openvpn-server@server
systemctl status openvpn-server@server

# ── Ouvrir le port dans le firewall ──────────────────────────
ufw allow 1194/udp
ufw allow OpenSSH

echo "[OK] OpenVPN démarré sur UDP 1194"

Étape 6 — Générer un fichier .ovpn pour le client

06-gen-client-ovpn.sh
#!/bin/bash
# Script de génération de profil .ovpn client

CLIENT=${1:-"client-jean"}
EASYRSA_DIR="/etc/openvpn/easy-rsa"
SERVER_IP="vpn.entreprise.fr"   # IP publique ou FQDN du serveur
OUTPUT="/root/clients/${CLIENT}.ovpn"
mkdir -p /root/clients

cat > $OUTPUT << EOF
client
dev tun
proto udp
remote $SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
verb 3
key-direction 1

<ca>
$(cat $EASYRSA_DIR/pki/ca.crt)
</ca>

<cert>
$(openssl x509 -in $EASYRSA_DIR/pki/issued/${CLIENT}.crt)
</cert>

<key>
$(cat $EASYRSA_DIR/pki/private/${CLIENT}.key)
</key>

<tls-auth>
$(cat $EASYRSA_DIR/pki/ta.key)
</tls-auth>
EOF

echo "[OK] Profil généré : $OUTPUT"
echo "     Transférer ce fichier au client de manière sécurisée (SCP, chiffré)"

Révoquer un certificat client

revoke-client.sh
cd /etc/openvpn/easy-rsa

# Révoquer le certificat d'un client (départ, vol de laptop...)
CLIENT="client-jean"
./easyrsa revoke $CLIENT --batch

# Générer la CRL (Certificate Revocation List)
./easyrsa gen-crl

# Copier la CRL dans le répertoire serveur
cp pki/crl.pem /etc/openvpn/server/

# Décommenter dans server.conf :
# crl-verify /etc/openvpn/server/crl.pem
systemctl restart openvpn-server@server

echo "[OK] Certificat de $CLIENT révoqué"

Vérification et diagnostic

CommandeDescription
systemctl status openvpn-server@serverÉtat du service OpenVPN
journalctl -u openvpn-server@server -fLogs OpenVPN en temps réel
cat /var/log/openvpn/openvpn-status.logClients connectés et IPs attribuées
ip addr show tun0Interface tunnel VPN (10.8.0.1)
ping 10.8.0.2Tester la connectivité avec un client VPN
iptables -t nat -L -n -vVérifier les règles NAT
netstat -ulnp | grep 1194Vérifier que OpenVPN écoute sur UDP 1194
💡
Client Windows/Mac/Linux : Installer OpenVPN Connect ou le client openvpn, importer le fichier .ovpn et se connecter. Sur Linux : openvpn --config client.ovpn. Sur Android/iOS : application OpenVPN Connect.
Ajouter Les Fibrés à mes sources préférées
Retrouvez plus souvent nos guides dans vos résultats Google