Licence pro ASS&RProductionLecture : 6 min

Accès distant : sortir le VPN du pare-feu, d'OpenVPN à WireGuard

L'ancien VPN, hébergé sur le pare-feu, se dégradait au-delà de trois connexions : je l'ai remplacé par WireGuard et Firezone sur une machine virtuelle dédiée, sans couper l'ancien service pendant la bascule.

Contexte
Production · PME, 6 utilisateurs à distance, pare-feu pfSense, hyperviseur Hyper-V
Période
Août 2026
Mon rôle
Étude, déploiement et bascule des utilisateurs, en autonomie
Outils
WireGuard · Firezone · Docker Compose · Debian 13 · pfSense · FortiClient et Splashtop (2024)

En bref

Le problème

OpenVPN tournait sur le pare-feu : au-delà de trois connexions simultanées, sessions coupées et mémoire saturée, alors que six personnes en avaient besoin.

Ce que j'ai fait

J'ai déplacé l'accès distant sur une VM Debian dédiée, avec WireGuard et le portail Firezone, en gardant OpenVPN en secours pendant la bascule.

Le résultat

Un accès se crée en 2 min au lieu de 15 et se révoque en un clic ; le pare-feu ne fait plus que rediriger un port. Test extérieur : 55 ms, 0 % de perte.

15 → 2minpour créer un accès, sans toucher au pare-feu
3connexions simultanées : au-delà, l'ancien VPN se dégradait
55msde latence vers le réseau local depuis l'extérieur, 0 % de perte

Contexte

Six utilisateurs se connectaient à distance pour atteindre les partages du NAS, le bureau à distance et les applications métier. Le serveur OpenVPN tournait sur le pare-feu pfSense lui-même. Au-delà de trois connexions simultanées, les sessions tombaient et la mémoire du pare-feu saturait. Chaque coupure devenait un ticket.

La cause tenait à l'architecture : OpenVPN chiffre en espace utilisateur, sur la machine qui assure déjà le filtrage et le NAT de toute l'entreprise. Ce projet prolonge mes premiers déploiements d'accès distant, faits poste par poste (ci-dessous).

Avant : FortiClient, puis Splashtop

Mon premier accès distant date de 2024, sur l'ancien pare-feu FortiGate. Mon travail se situait côté postes : FortiClient installé depuis un partage interne, en mode « VPN seulement », avec deux profils, VPN SSL et IPsec en secours. Je les ai testés câble débranché, depuis le partage 4G d'un téléphone, puis j'ai écrit une procédure illustrée pour équiper les postes suivants.

Fenêtre FortiClient « Nouvelle connexion VPN » onglet VPN IPsec, méthode Clé partagée et authentification XAuth ; nom de connexion, passerelle, clé et identifiant masqués.
Fig. 1Paramétrage d'un profil VPN IPsec dans FortiClient, authentifié par clé partagée et XAuth.
Console FortiClient indiquant « VPN connecté » pour une connexion IPsec avec la durée et les octets envoyés ; nom de la connexion masqué.
Fig. 2Tunnel IPsec établi depuis l'extérieur du réseau de l'entreprise, lors du test en 4G.

Le VPN passait mes tests mais décevait à l'usage dans notre contexte : connexions qui tombaient, client délicat à paramétrer, demandes de support régulières. L'entreprise a adopté Splashtop, un accès poste à poste avec double authentification, où l'ordinateur distant n'entre plus dans le réseau. J'en ai retenu qu'on ne juge pas un service depuis son propre poste, et qu'on mesure avant de conclure : je n'avais gardé aucun chiffre avant et après.

Après le remplacement du FortiGate par pfSense, fin 2024, le VPN est revenu sous la forme d'un serveur OpenVPN sur le nouveau pare-feu. C'est lui que ce projet remplace.

Ce que j'ai fait

  1. Choisir WireGuard, et Firezone pour le gérerWireGuard tourne dans le noyau Linux, en quelques milliers de lignes de code, avec des paires de clés au lieu de certificats. Firezone y ajoute ce qui manque : liste d'utilisateurs, dernières connexions, révocation en un clic.
  2. Monter une VM minimaleDebian 13 sans interface graphique (2 vCPU, 2 Go de RAM), Firezone en trois conteneurs Docker : l'application, sa base PostgreSQL et Caddy pour le HTTPS. Le portail n'est joignable que depuis le réseau interne, télémétrie désactivée.
  3. Lire avant d'exécuterLe script d'installation officiel exigeait « v2 » dans la version de Docker Compose, alors que la version installée, plus récente, est compatible. J'ai assoupli ce test, sans toucher au reste du script.
  4. Adapter les profils clientsSeul le trafic vers le réseau local passe dans le tunnel (split tunnel), les noms internes sont résolus par les contrôleurs de domaine, et le point de terminaison est l'adresse publique de l'entreprise.
  5. Basculer sans coupureJ'ajoute l'utilisateur et son appareil dans le portail ; il installe le client officiel, importe le fichier et clique sur « Activer ». OpenVPN reste disponible en secours jusqu'à la fin de la bascule.
Chemin d'une connexion WireGuard entrante : l'équipement de l'opérateur, puis le pare-feu, puis la VM dédiée, qui ne donne accès qu'au réseau local Connexion entrante · UDP Poste distant client WireGuard connexion résidentielle Équipement opérateur porte l'adresse publique NAT n°1, ajouté ensuite Pare-feu pfSense WAN en adresse privée NAT n°2 vers la VM VM WireGuard Firezone, Debian 13 2 vCPU · 2 Go de RAM LAN seul Réseau local Contrôleurs domaine et DNS NAS partages Serveurs sessions RDP
Fig. 3La connexion traverse deux traductions d'adresse, chez l'opérateur puis sur le pare-feu. Dans le tunnel, seul le trafic vers le réseau local passe ; la navigation Internet reste sur la connexion de l'utilisateur.
Voir les détails techniques
CritèreOpenVPN (existant)WireGuard (cible)
ExécutionEspace utilisateurModule du noyau Linux
AuthentificationCertificats X.509Paires de clés publique et privée
Taille du codePlusieurs centaines de milliers de lignesQuelques milliers de lignes
HébergementSur le pare-feuVM dédiée sur Hyper-V

Bash · installation de Firezone

# Le script d'installation est téléchargé, lu, puis seulement exécuté
curl -fsSL <URL du script officiel> -o install.sh
# Il exigeait « v2 » dans la version de Docker Compose (la version installée est plus récente)
sed -i 's/$dc version | grep -q "v2"/$dc version | grep -qE "v[2-9]"/' install.sh
bash install.sh
Paramètre clientValeur par défautValeur appliquéePourquoi
Adresses autorisées (AllowedIPs)0.0.0.0/0, ::/0Réseau local de l'entrepriseSplit tunnel : la navigation Internet reste sur la connexion de l'utilisateur
Serveurs DNS1.1.1.1, 1.0.0.1Contrôleurs de domaineRésoudre les noms internes
Point de terminaisonAdresse privée de la VMAdresse publique de l'entrepriseSans cela, les fichiers générés pointent vers une adresse injoignable depuis Internet

La VM résout les noms, mais apt n'atteint aucun dépôt. Après le passage en adresse fixe, ip route show montrait une passerelle par défaut pointant vers un contrôleur de domaine : il répondait au DNS, mais rien ne sortait. Passerelle corrigée vers le switch cœur, /etc/resolv.conf rempli, IPv6 désactivé sur un réseau uniquement en IPv4.

Le portail répond « 502 Bad Gateway ». Firezone démarrait avant que PostgreSQL accepte les connexions : le fichier docker-compose ne conditionnait pas l'un à l'autre. Démarrage en séquence, la base d'abord.

Bash · démarrage séquencé

docker compose down
docker compose up -d postgres && sleep 15 && docker compose up -d firezone caddy
docker compose ps && docker logs firezone-firezone-1 --tail 10

Créer et révoquer un accès. Firezone génère la paire de clés, attribue une adresse dans le réseau du tunnel et produit un QR code pour les mobiles ou un fichier .conf pour les postes. Supprimer l'appareil ou désactiver l'utilisateur coupe le tunnel immédiatement. Avec l'ancien service, chaque accès demandait un certificat généré dans pfSense, l'export et l'envoi manuel d'une archive, et des droits d'administration sur le pare-feu de production.

Client WireGuard Windows : interface activée, MTU 1280, DNS internes, homologue avec clé pré-partagée, adresses autorisées limitées au réseau interne et dernier établissement de liaison il y a 3 secondes ; nom du tunnel, clés publiques et point de terminaison masqués.
Fig. 4Tunnel WireGuard établi depuis l'extérieur : dernier échange de clés il y a 3 secondes, trafic dans les deux sens et routage limité au réseau interne.

L'incident

Depuis l'extérieur, aucune connexion n'aboutit

Problème

La redirection de port et la règle du pare-feu étaient correctes, mais une capture de paquets sur l'interface WAN ne montrait aucune trame entrante.

Résolution

L'adresse publique est portée par l'équipement de l'opérateur, qui ne livre au pare-feu qu'une adresse privée : le trafic traverse deux NAT. J'ai ajouté une redirection chez l'opérateur, vers le WAN du pare-feu, qui redirige ensuite vers la VM.

Résultats

Test de bout en bout depuis l'extérieur, sur une connexion résidentielle : tunnel établi en quelques secondes, ping d'un contrôleur de domaine à 55 ms sans perte, lecteur du NAS monté avec les identifiants du domaine, session de bureau à distance ouverte sur un serveur interne, droits NTFS appliqués normalement.

Invite de commandes Windows : ping vers une adresse interne, quatre réponses, 0 % de perte, minimum 33 ms, maximum 106 ms, moyenne 55 ms.
Fig. 5Test à travers le tunnel depuis une connexion résidentielle : 4 réponses du contrôleur de domaine, 0 % de perte et 55 ms de moyenne.

Une limite existait déjà avec OpenVPN : les noms courts ne se résolvaient pas, le client Windows ne gérant pas le suffixe de recherche DNS ; il fallait utiliser les noms complets.

Un premier utilisateur était migré et se connectait sans intervention ; les autres suivaient, OpenVPN en secours. La tenue à six connexions simultanées et la mémoire du pare-feu n'ont donc pas été mesurées. Ce VPN a ensuite servi à ouvrir un accès encadré au prestataire du portail B2B en DMZ.

Ce que j'améliorerais

  • Sur un prochain VPN, je prévoirais dès le départ une authentification à deux facteurs et des droits par utilisateur : le champ AllowedIPs règle le routage, il ne contrôle pas l'accès. Le filtrage se fait côté serveur, par utilisateur ou par groupe.
  • Faire générer la paire de clés sur le poste de l'utilisateur, pour que la clé privée ne le quitte jamais et qu'aucun fichier de configuration complet n'ait à circuler.
  • Appliquer la même règle à toutes les installations, Docker compris : télécharger, lire, puis exécuter, ou passer par le dépôt APT signé de l'éditeur plutôt que par curl … | sh.

Compétences

  • WireGuard et Firezone
  • Docker Compose
  • Diagnostic réseau de bout en bout
  • NAT et redirection de port
  • Choix technique argumenté
  • Migration sans coupure