Installer un VPN sur un VPS Linux : WireGuard vs OpenVPN
Transformer un VPS (serveur privé virtuel) en VPN (réseau privé virtuel) permet de sécuriser une connexion depuis un réseau public, d’accéder à certains services internes sans les exposer à tout Internet, ou de faire sortir son trafic depuis l’adresse IP dédiée de son serveur. Le VPN chiffre la connexion entre vos appareils et le VPS, mais il ne vous rend pas anonyme : le trafic rejoint ensuite Internet depuis l’adresse IP du serveur.
Dans ce guide, nous allons voir deux options simples. WireGuard est le choix moderne : léger, rapide, intégré au noyau Linux sur les distributions récentes, et très agréable pour un usage quotidien. OpenVPN reste le pilier historique : un peu plus lourd, mais très flexible, notamment si vous devez passer par TCP ou par un port très courant comme 443.
Quel VPN choisir pour votre VPS ?
Pour un nouveau déploiement, commencez généralement par WireGuard. La configuration est plus courte, les performances sont excellentes, et les clients Windows et Linux sont simples à utiliser.
Choisissez OpenVPN si vous avez un besoin de compatibilité précis : réseau très filtré, obligation d’utiliser TCP, port imposé, client déjà déployé dans une organisation, ou infrastructure existante à conserver.
En pratique :
- WireGuard est recommandé pour un VPN personnel rapide et moderne.
- OpenVPN est recommandé quand la compatibilité réseau passe avant la simplicité.
- Évitez d’installer les deux sur le même VPS si vous n’en avez pas besoin.
Prérequis
Avant de commencer, il vous faut :
- un VPS Linux avec accès root ou sudo.
- Ubuntu 24.04 ou une version récente de Debian.
- une adresse IPv4 publique ou un nom de domaine pointant vers le VPS.
- l’accès au pare-feu du VPS et, si votre hébergeur en fournit un, au pare-feu réseau externe.
- un terminal SSH fonctionnel avant toute modification du pare-feu.
Les exemples ci-dessous utilisent 203.0.113.10 comme adresse IP de documentation. Remplacez-la par l’adresse publique de votre VPS.
Les profils ci-dessous acheminent uniquement le trafic IPv4. Si votre appareil utilise IPv6, configurez-le également dans le VPN ou désactivez-le sur cette connexion afin qu’il ne contourne pas le tunnel.
Préparer le serveur
Connectez-vous au VPS en SSH. Vérifiez que son horloge est synchronisée, car les certificats OpenVPN dépendent d’une date correcte. Activez ensuite le routage IPv4, indispensable pour que le VPS transmette le trafic du VPN vers Internet :
timedatectl status
sudo tee /etc/sysctl.d/99-vpn-forward.conf > /dev/null <<'EOF'
net.ipv4.ip_forward=1
EOF
sudo sysctl -p /etc/sysctl.d/99-vpn-forward.conf
La dernière commande doit afficher net.ipv4.ip_forward = 1. Choisissez ensuite le VPN que vous souhaitez installer et suivez uniquement la section correspondante. Les commandes utilisent les paquets d’Ubuntu 24.04 et des versions récentes de Debian. Aucun script d’installation distant n’est téléchargé.
Installer WireGuard
Installez WireGuard et les commandes de routage utilisées par la configuration :
sudo apt update
sudo apt install -y wireguard iptables
Créez ensuite une paire de clés pour le serveur et une autre pour le premier ordinateur client, ici nommé client :
sudo install -d -m 700 /etc/wireguard
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server.key'
sudo sh -c 'wg pubkey < /etc/wireguard/server.key > /etc/wireguard/server.pub'
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/client.key'
sudo sh -c 'wg pubkey < /etc/wireguard/client.key > /etc/wireguard/client.pub'
Créez l’interface wg0. Les règles PostUp et PostDown autorisent uniquement le transfert du trafic VPN et son NAT vers l’interface réseau principale. Elles ne modifient pas les règles d’entrée ni l’accès SSH.
WAN_IF=$(ip route show default | awk '{print $5; exit}')
CLIENT_PUBLIC_KEY=$(sudo cat /etc/wireguard/client.pub)
sudo tee /etc/wireguard/wg0.conf > /dev/null <<EOF
[Interface]
Address = 10.66.66.1/24
ListenPort = 51820
PostUp = wg set %i private-key /etc/wireguard/server.key
PostUp = iptables -I FORWARD 1 -i %i -o $WAN_IF -j ACCEPT; iptables -I FORWARD 1 -i $WAN_IF -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.66.66.0/24 -o $WAN_IF -j MASQUERADE
PostDown = iptables -C FORWARD -i %i -o $WAN_IF -j ACCEPT 2>/dev/null && iptables -D FORWARD -i %i -o $WAN_IF -j ACCEPT || true; iptables -C FORWARD -i $WAN_IF -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 2>/dev/null && iptables -D FORWARD -i $WAN_IF -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT || true; iptables -t nat -C POSTROUTING -s 10.66.66.0/24 -o $WAN_IF -j MASQUERADE 2>/dev/null && iptables -t nat -D POSTROUTING -s 10.66.66.0/24 -o $WAN_IF -j MASQUERADE || true
[Peer]
PublicKey = $CLIENT_PUBLIC_KEY
AllowedIPs = 10.66.66.2/32
EOF
sudo chmod 600 /etc/wireguard/wg0.conf
Démarrez WireGuard et activez son lancement automatique avec le VPS :
sudo systemctl enable --now wg-quick@wg0
Créez le profil du client Windows ou Linux. La commande vous demande l’adresse IP publique ou le nom DNS du VPS afin d’éviter de laisser une valeur d’exemple dans le fichier :
SERVER_PUBLIC_KEY=$(sudo cat /etc/wireguard/server.pub)
CLIENT_PRIVATE_KEY=$(sudo cat /etc/wireguard/client.key)
read -rp "Adresse IP publique ou nom DNS du VPS : " VPN_ENDPOINT
install -m 600 /dev/null "$HOME/client.conf"
tee "$HOME/client.conf" > /dev/null <<EOF
[Interface]
PrivateKey = $CLIENT_PRIVATE_KEY
Address = 10.66.66.2/32
DNS = 1.1.1.1, 1.0.0.1
[Peer]
PublicKey = $SERVER_PUBLIC_KEY
Endpoint = $VPN_ENDPOINT:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
unset CLIENT_PRIVATE_KEY
Le profil client.conf se trouve désormais dans votre dossier personnel. Depuis votre ordinateur Windows ou Linux, récupérez-le par SSH, puis importez-le dans l’application WireGuard :
scp [email protected]:client.conf .
La commande scp s’exécute depuis votre ordinateur. Remplacez utilisateur par votre compte SSH et 203.0.113.10 par l’adresse du VPS.
Sur un client Ubuntu ou Debian sans interface graphique, installez aussi resolvconf afin que la ligne DNS du profil soit appliquée par wg-quick :
sudo apt install wireguard resolvconf
sudo install -m 600 client.conf /etc/wireguard/client.conf
sudo wg-quick up client
Après l’import et la sauvegarde chiffrée du profil, supprimez les copies de la clé privée et du profil restées sur le VPS :
sudo rm -f /etc/wireguard/client.key
rm -f "$HOME/client.conf"
Si votre hébergeur applique un pare-feu réseau externe, autorisez 51820/udp vers le VPS. Si UFW est déjà utilisé localement, vérifiez son état puis ajoutez le port :
sudo ufw status verbose
sudo ufw allow 51820/udp
Si UFW est inactif, ne l’activez pas automatiquement uniquement pour suivre ce guide. Si vous décidez de l’activer, autorisez d’abord le port SSH réellement utilisé. Avec une politique iptables existante, l’équivalent temporaire est :
sudo iptables -C INPUT -p udp --dport 51820 -j ACCEPT 2>/dev/null || sudo iptables -I INPUT -p udp --dport 51820 -j ACCEPT
Rendez cette règle persistante avec le mécanisme déjà utilisé sur votre serveur et ne mélangez pas plusieurs gestionnaires de pare-feu.
Un ufw reload ou une réinitialisation des règles peut retirer les règles directes de transfert et de NAT. Dans ce cas, redémarrez wg-quick@wg0 afin de les réappliquer.
Une fois le client connecté, vérifiez le service et le dernier handshake :
sudo systemctl status wg-quick@wg0 --no-pager
sudo wg show
sudo sysctl net.ipv4.ip_forward
Le peer client doit afficher un handshake récent. Depuis l’ordinateur connecté, l’adresse IP publique doit correspondre à celle du VPS.
Créez toujours une nouvelle paire de clés et une nouvelle adresse, par exemple 10.66.66.3/32, pour chaque appareil supplémentaire. Pour révoquer un appareil, supprimez son bloc [Peer] de /etc/wireguard/wg0.conf, puis rechargez la configuration avec sudo systemctl restart wg-quick@wg0. La reconnexion des autres appareils peut prendre quelques secondes après ce redémarrage.
Installer OpenVPN
Installez OpenVPN et Easy-RSA, puis préparez l’autorité de certification, le certificat du serveur et celui du premier client :
sudo apt update
sudo apt install -y openvpn easy-rsa iptables
getent group openvpn > /dev/null || sudo groupadd --system openvpn
getent passwd openvpn > /dev/null || sudo useradd --system --gid openvpn --home-dir /nonexistent --shell /usr/sbin/nologin openvpn
sudo install -d -o root -g openvpn -m 750 /etc/openvpn/server
sudo make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
sudo ./easyrsa init-pki
sudo env EASYRSA_REQ_CN=Private-VPN-CA ./easyrsa build-ca
sudo ./easyrsa build-server-full server nopass
sudo ./easyrsa build-client-full client nopass
sudo env EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
sudo openvpn --genkey tls-crypt /etc/openvpn/server/tc.key
sudo install -m 600 pki/ca.crt pki/private/server.key /etc/openvpn/server/
sudo install -m 644 pki/issued/server.crt /etc/openvpn/server/
sudo install -o root -g openvpn -m 640 pki/crl.pem /etc/openvpn/server/crl.pem
sudo chmod 600 /etc/openvpn/server/tc.key
Easy-RSA vous demande une phrase secrète pour protéger la clé privée de l’autorité de certification. Conservez-la : elle sera nécessaire pour créer ou révoquer des profils. Les clés du serveur et du client restent sans phrase secrète afin que le service et l’application puissent démarrer automatiquement. Le fichier .ovpn devra donc être protégé comme une clé privée.
Le compte système dédié openvpn limite les privilèges du service. La liste de révocation reste lisible par ce compte, contrairement aux clés privées. Sa validité est fixée à dix ans afin d’éviter l’expiration par défaut après 180 jours, qui ferait échouer les nouvelles connexions. Régénérez-la avant cette échéance et après chaque révocation.
Easy-RSA 3.1.7 génère par défaut les certificats serveur et client pour 825 jours. Vérifiez et notez leurs dates d’expiration dès l’installation :
sudo openssl x509 -in /etc/openvpn/server/server.crt -noout -enddate
sudo openssl x509 -in /etc/openvpn/easy-rsa/pki/issued/client.crt -noout -enddate
Planifiez leur renouvellement avant cette échéance : une CRL encore valide ne prolonge pas un certificat expiré.
Ajoutez un script local chargé uniquement du routage et du NAT OpenVPN. Il sera exécuté par systemd avec les droits nécessaires au démarrage et à l’arrêt du service :
sudo tee /etc/openvpn/server/network.sh > /dev/null <<'EOF'
#!/bin/sh
WAN_IF=$(ip route show default | awk '{print $5; exit}')
DEV=tun0
case "$1" in
up)
iptables -C FORWARD -i "$DEV" -o "$WAN_IF" -j ACCEPT 2>/dev/null || iptables -I FORWARD 1 -i "$DEV" -o "$WAN_IF" -j ACCEPT
iptables -C FORWARD -i "$WAN_IF" -o "$DEV" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 2>/dev/null || iptables -I FORWARD 1 -i "$WAN_IF" -o "$DEV" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -C POSTROUTING -s 10.8.0.0/24 -o "$WAN_IF" -j MASQUERADE 2>/dev/null || iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o "$WAN_IF" -j MASQUERADE
;;
down)
iptables -C FORWARD -i "$DEV" -o "$WAN_IF" -j ACCEPT 2>/dev/null && iptables -D FORWARD -i "$DEV" -o "$WAN_IF" -j ACCEPT || true
iptables -C FORWARD -i "$WAN_IF" -o "$DEV" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 2>/dev/null && iptables -D FORWARD -i "$WAN_IF" -o "$DEV" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT || true
iptables -t nat -C POSTROUTING -s 10.8.0.0/24 -o "$WAN_IF" -j MASQUERADE 2>/dev/null && iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o "$WAN_IF" -j MASQUERADE || true
;;
*)
exit 2
;;
esac
EOF
sudo chmod 700 /etc/openvpn/server/network.sh
Créez la configuration du serveur sur 1194/udp :
sudo tee /etc/openvpn/server/server.conf > /dev/null <<'EOF'
port 1194
proto udp4
dev tun0
ca ca.crt
cert server.crt
key server.key
dh none
tls-crypt tc.key
crl-verify /etc/openvpn/server/crl.pem
server 10.8.0.0 255.255.255.0
topology subnet
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 1.0.0.1"
keepalive 10 120
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
tls-version-min 1.2
user openvpn
group openvpn
persist-key
persist-tun
explicit-exit-notify 1
verb 3
EOF
sudo install -d /etc/systemd/system/[email protected]
sudo tee /etc/systemd/system/[email protected]/firewall.conf > /dev/null <<'EOF'
[Service]
ExecStartPost=/etc/openvpn/server/network.sh up
ExecStopPost=/etc/openvpn/server/network.sh down
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now openvpn-server@server
Construisez enfin le profil autonome client.ovpn dans votre dossier personnel :
cd /etc/openvpn/easy-rsa
read -rp "Adresse IP publique ou nom DNS du VPS : " VPN_ENDPOINT
CA_CERT=$(sudo cat pki/ca.crt)
CLIENT_CERT=$(sudo sed -ne '/BEGIN CERTIFICATE/,$ p' pki/issued/client.crt)
CLIENT_KEY=$(sudo cat pki/private/client.key)
TLS_CRYPT_KEY=$(sudo cat /etc/openvpn/server/tc.key)
install -m 600 /dev/null "$HOME/client.ovpn"
tee "$HOME/client.ovpn" > /dev/null <<EOF
client
dev tun
proto udp4
remote $VPN_ENDPOINT 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verify-x509-name server name
tls-version-min 1.2
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
verb 3
<ca>
$CA_CERT
</ca>
<cert>
$CLIENT_CERT
</cert>
<key>
$CLIENT_KEY
</key>
<tls-crypt>
$TLS_CRYPT_KEY
</tls-crypt>
EOF
unset CLIENT_KEY TLS_CRYPT_KEY
Copiez ce fichier sur votre ordinateur. Sur Windows ou Linux, importez-le dans OpenVPN Connect avec l’option d’import depuis un fichier.
scp [email protected]:client.ovpn .
La commande scp s’exécute depuis votre ordinateur. Remplacez utilisateur par votre compte SSH et 203.0.113.10 par l’adresse du VPS.
Après l’import et la sauvegarde chiffrée du profil, supprimez les copies de la clé privée et du profil restées sur le VPS. Le certificat public reste dans la PKI afin de pouvoir être révoqué :
sudo rm -f /etc/openvpn/easy-rsa/pki/private/client.key /etc/openvpn/easy-rsa/pki/inline/client.inline
rm -f "$HOME/client.ovpn"
Si votre hébergeur applique un pare-feu réseau externe, autorisez 1194/udp. Si UFW est déjà utilisé, vérifiez son état puis ajoutez le port :
sudo ufw status verbose
sudo ufw allow 1194/udp
Si UFW est inactif, ne l’activez pas automatiquement uniquement pour suivre ce guide. Avec une politique iptables existante, l’équivalent temporaire est :
sudo iptables -C INPUT -p udp --dport 1194 -j ACCEPT 2>/dev/null || sudo iptables -I INPUT -p udp --dport 1194 -j ACCEPT
Rendez cette règle persistante avec le mécanisme déjà utilisé sur votre serveur.
Un ufw reload ou une réinitialisation des règles peut retirer les règles directes de transfert et de NAT. Dans ce cas, redémarrez openvpn-server@server afin de les réappliquer.
Cette configuration utilise 1194/udp, le mode recommandé. Si un réseau bloque l’UDP et que vous devez réellement utiliser TCP sur le port 443, vérifiez d’abord qu’aucun serveur web n’occupe ce port. Remplacez ensuite port 1194 par port 443 et proto udp4 par proto tcp-server côté serveur. Dans le profil client, remplacez proto udp4 par proto tcp-client, utilisez remote $VPN_ENDPOINT 443 et retirez explicit-exit-notify 1 du serveur. Autorisez enfin 443/tcp au lieu de 1194/udp dans les pare-feu. TCP est généralement moins performant que l’UDP et doit rester une solution de compatibilité.
Vérifiez ensuite le service et l’activation du routage :
sudo systemctl status openvpn-server@server --no-pager
sudo journalctl -u openvpn-server@server -n 50 --no-pager
sudo sysctl net.ipv4.ip_forward
Depuis l’ordinateur connecté, l’adresse IP publique doit correspondre à celle du VPS.
Pour révoquer le profil d’un appareil perdu, régénérez la liste de révocation et redémarrez OpenVPN :
cd /etc/openvpn/easy-rsa
sudo env EASYRSA_BATCH=1 ./easyrsa revoke client
sudo env EASYRSA_BATCH=1 EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
sudo install -o root -g openvpn -m 640 pki/crl.pem /etc/openvpn/server/crl.pem
sudo systemctl restart openvpn-server@server
Installer l’application cliente
Le serveur VPN tourne sur votre VPS, mais chaque ordinateur qui se connecte doit aussi avoir une application cliente.
Pour WireGuard, installez l’application officielle depuis la page de téléchargement WireGuard :
- Windows et Linux : wireguard.com/install
Pour OpenVPN, le client dépend de votre appareil :
- Windows et Linux : installez gratuitement OpenVPN Connect. Ce client officiel accepte les profils
.ovpngénérés par OpenVPN Community Edition et ne nécessite aucun abonnement. - Sur un ordinateur Linux avec NetworkManager, vous pouvez aussi installer
network-manager-openvpnet importer le profil depuis les paramètres réseau. Cette intégration gère mieux le DNS qu’un simple lancement d’OpenVPN en ligne de commande.
Sur un ordinateur, le principe est simple : vous récupérez le fichier de configuration généré par le VPS, puis vous l’importez dans l’application cliente. WireGuard utilise un fichier .conf, OpenVPN utilise un fichier .ovpn.
Bonnes pratiques de sécurité
Un VPN donne accès à votre réseau privé. Traitez donc chaque profil client comme une clé sensible.
- Ne partagez jamais un fichier
.confWireGuard ou.ovpnOpenVPN publiquement. - Créez un profil différent par appareil.
- Révoquez immédiatement le profil d’un appareil perdu.
- Supprimez les copies en clair des profils laissées sur le VPS et sur votre ordinateur après leur import, sauf si elles sont conservées dans un stockage chiffré.
- Protégez la phrase secrète et une sauvegarde chiffrée de l’autorité de certification OpenVPN : sa clé privée permet de signer de nouveaux profils.
- Pour un déploiement sensible ou multi-utilisateur, conservez idéalement l’autorité de certification OpenVPN sur une machine séparée et hors ligne.
- Un tunnel complet n’est pas automatiquement un coupe-circuit : activez l’option de blocage hors VPN ou le mode VPN permanent du système client si aucune fuite ne doit être possible lors d’une coupure.
- Gardez SSH ouvert uniquement pour les adresses IP nécessaires quand c’est possible.
- Mettez le VPS à jour régulièrement.
- Conservez une copie de vos profils clients dans un stockage chiffré.
Pour un usage personnel, WireGuard sera souvent la solution la plus simple et la plus agréable. OpenVPN reste utile quand vous devez traverser un réseau restrictif ou conserver une compatibilité existante. Dans les deux cas, un VPS vous donne la liberté d’héberger votre propre passerelle privée, avec vos règles, vos ports et vos accès.
Si vous cherchez un serveur pour déployer ce type de configuration, vous pouvez partir d’un serveur VPS BoxToPlay avec une IP dédiée, un accès root, des sauvegardes et un pare-feu matériel configurable.
