Configurer un serveur VPN sur une machine Linux générique

Notre page d'accueil sur la programmation d'un serveur VPN évoque le vieux matériel Linux comme plateforme cible pour un serveur maison. Ce guide détaille concrètement comment installer et durcir un serveur VPN sur une machine Linux générique, sans dépendre du matériel spécifique d'un Raspberry Pi.

Choisir entre OpenVPN et WireGuard

Sur une distribution Linux classique (Debian, Ubuntu, ou une distribution serveur équivalente), deux options dominent. OpenVPN reste la référence historique, disponible dans les dépôts de la plupart des distributions et éprouvé depuis plus de vingt ans. WireGuard, plus récent, repose sur une base de code d'environ 4 000 lignes contre plusieurs dizaines de milliers pour OpenVPN, et sur des primitives cryptographiques modernes (Curve25519, ChaCha20-Poly1305), ce qui se traduit par une charge processeur réduite et une négociation de connexion quasi instantanée. Sur du matériel ancien à ressources limitées, cette différence de performance est particulièrement perceptible.

Installation de base avec WireGuard

  1. Installer le paquet WireGuard depuis les dépôts officiels :

    sudo apt update && sudo apt install wireguard
  2. Générer la paire de clés privée et publique du serveur :

    wg genkey | tee privatekey | wg pubkey > publickey
  3. Créer le fichier de configuration de l'interface, généralement /etc/wireguard/wg0.conf, en y renseignant la clé privée du serveur, l'adresse IP interne du tunnel et le port d'écoute (le port UDP 51820 est la valeur par défaut, mais peut être changé).

  4. Activer le transfert de paquets IP, indispensable pour que le serveur relaie le trafic des clients vers Internet :

    echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p
  5. Démarrer l'interface et l'activer au démarrage via systemd :

    sudo systemctl enable --now wg-quick@wg0

Configurer le pare-feu correctement

Un serveur VPN exposé sur Internet doit restreindre strictement les ports ouverts au strict nécessaire : le port du VPN lui-même, et éventuellement le port SSH pour l'administration à distance, idéalement changé de son port par défaut et restreint par adresse IP source lorsque c'est possible. Sur les distributions basées sur Debian, ufw simplifie cette configuration :

sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
sudo ufw enable

Sur des distributions plus orientées serveur, nftables ou iptables directement offrent un contrôle plus fin, notamment pour configurer le masquage d'adresse (NAT) nécessaire au relais du trafic des clients :

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Durcir l'accès administrateur au serveur

Le serveur VPN lui-même devient une cible de choix une fois exposé publiquement. Désactiver l'authentification par mot de passe SSH au profit d'une authentification par clé, désactiver la connexion directe du compte root, et installer un outil de bannissement automatique des tentatives de connexion répétées (comme fail2ban) réduisent significativement la surface d'attaque, indépendamment de la robustesse du chiffrement VPN lui-même.

sudo apt install fail2ban
sudo systemctl enable --now fail2ban

Les mises à jour de sécurité, une responsabilité qui vous incombe désormais

À la différence d'un service VPN commercial, dont l'éditeur applique les correctifs de sécurité à votre place, un serveur auto-hébergé transfère cette responsabilité à son opérateur. Activer les mises à jour de sécurité automatiques du système reste la mesure la plus simple pour limiter l'exposition aux vulnérabilités découvertes après la mise en service :

sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

Cette responsabilité s'étend également au logiciel VPN lui-même : une faille découverte dans OpenVPN ou WireGuard doit être corrigée par une mise à jour manuelle ou automatisée du paquet, sans attendre qu'un tiers s'en charge.

Vérifier que la configuration fonctionne réellement

Une fois le serveur en service, un test d'adresse IP effectué depuis un appareil client connecté au VPN doit afficher l'adresse IP publique du serveur, et non celle de l'appareil client. Un test de fuite DNS confirme que les requêtes de résolution de noms de domaine passent bien par le tunnel plutôt que par le résolveur habituel du réseau du client. Ces deux vérifications, réalisables en quelques minutes via des outils en ligne dédiés, restent la meilleure garantie qu'une configuration fonctionne comme prévu, indépendamment de la documentation suivie pour la mettre en place.

Ce qu'il faut retenir

Configurer un serveur VPN sur une machine Linux générique suit les mêmes principes que sur un Raspberry Pi, avec davantage de marge de manœuvre matérielle mais aussi davantage de responsabilité : pare-feu correctement configuré, accès administrateur durci, et mises à jour de sécurité appliquées régulièrement. Ces éléments, souvent négligés au profit de la seule configuration du tunnel VPN, déterminent en pratique la sécurité réelle du serveur mis en place.