Chapitre 914 minIntermédiaire
VPN nomade sur pfSense : OpenVPN et WireGuard
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- relier pfSense à l'Active Directory en LDAPS pour authentifier les nomades ;
- configurer un serveur OpenVPN et distribuer les profils des utilisateurs ;
- configurer un tunnel WireGuard et ses pairs ;
- écrire les règles des tunnels et sécuriser l'accès distant.
3 exercices corrigés
Un VPN nomade (accès distant, remote access) relie un ordinateur portable au réseau de l'entreprise par un tunnel chiffré à travers Internet : le portable reçoit une adresse d'un réseau dédié aux nomades, et le pare-feu filtre ce qu'il peut joindre comme pour n'importe quelle zone. pfSense propose OpenVPN, intégré, avec authentification par l'Active Directory, et WireGuard, en paquet, plus simple et plus rapide. Ce chapitre configure les deux pour les commerciaux et l'astreinte de Sorbier, avec leurs règles et leurs bonnes pratiques.
Les besoins de Sorbier
- Quatre commerciaux travaillent chez les clients : ils utilisent l'application de gestion, les partages et la messagerie interne.
- Le technicien d'astreinte intervient la nuit : il passe par le bastion d'administration (
192.168.10.210), et seulement par lui. - Aucun port d'administration n'est ouvert sur Internet : tout passe par le VPN.
Les notions (tunnel complet ou partagé, protocoles, comparaison IPsec, OpenVPN, WireGuard) sont expliquées dans le cours Cybersécurité des infrastructures ; le chiffrement lui-même dans le cours Cryptographie.
| OpenVPN | WireGuard | |
|---|---|---|
| Sur pfSense | Intégré (VPN > OpenVPN) | Paquet à installer (VPN > WireGuard) |
| Transport | UDP 1194 par défaut (TCP possible) | UDP 51820 par défaut |
| Identité | Certificat par utilisateur, plus identifiant et mot de passe de l'annuaire | Une paire de clés par appareil |
| Comptes de l'annuaire, second facteur | Oui, par LDAP ou RADIUS | Non : la clé de l'appareil est la seule preuve |
| Client | OpenVPN Connect ou client communautaire, profil exporté par pfSense | Client WireGuard officiel, fichier de configuration ou code QR |
| Chez Sorbier | Les commerciaux : identité de l'annuaire, révocation en désactivant le compte | L'astreinte : un seul appareil, une clé, un accès limité au bastion |
OpenVPN : relier pfSense à l'Active Directory
Pour qu'un commercial se connecte avec son compte du domaine, pfSense interroge l'annuaire en LDAP. System > User Manager > Authentication Servers > Add :
| Champ | Valeur |
|---|---|
| Descriptive name | AD Sorbier |
| Type | LDAP |
| Hostname or IP address | srv-ad.ad.sorbier.example (résolu grâce à la substitution de domaine du chapitre 8) |
| Port value | 636 |
| Transport | SSL/TLS Encrypted (LDAPS) |
| Peer Certificate Authority | Le certificat de l'autorité de certification interne de l'annuaire, importé dans System > Cert. Manager |
| Search scope | Entire Subtree, base DN DC=ad,DC=sorbier,DC=example |
| Authentication containers | OU=Sorbier,DC=ad,DC=sorbier,DC=example |
| Extended query | memberOf=CN=GG_VPN,OU=Groupes,OU=Sorbier,DC=ad,DC=sorbier,DC=example : seuls les membres du groupe GG_VPN peuvent se connecter |
| Bind credentials | Un compte de service dédié, svc-pfsense, sans autre droit que la lecture de l'annuaire (comptes de service) |
| User naming attribute | samAccountName |
Teste avec Diagnostics > Authentication : choisis AD Sorbier, saisis un compte membre de GG_VPN, puis un compte qui ne l'est pas. Le premier doit réussir, le second échouer.
OpenVPN : le serveur
pfSense fournit un assistant, VPN > OpenVPN > Wizards, qui enchaîne toutes les étapes. Ses choix, pour Sorbier :
- Type of Server : LDAP, puis le serveur
AD Sorbier. - Certificate Authority : crée une autorité de certification propre au VPN (
CA-VPN-Sorbier), ou choisis celle de l'entreprise si elle délivre aussi les certificats des utilisateurs. - Server Certificate : crée le certificat du serveur VPN, signé par cette autorité.
- General OpenVPN Server Information : Interface WAN, Protocol UDP on IPv4 only, Local Port 1194, Description « VPN commerciaux ».
- Cryptographic Settings : garde la clé TLS (TLS Authentication, qui fait ignorer tout paquet non signé avec cette clé partagée, ce qui protège le service des balayages et des dénis de service) ; algorithmes de chiffrement des données AES-256-GCM, AES-128-GCM et CHACHA20-POLY1305 ; condensat SHA256.
- Tunnel Settings : IPv4 Tunnel Network
10.8.1.0/24; Redirect IPv4 Gateway décoché (tunnel partagé) ; IPv4 Local Network192.168.10.0/24; Concurrent Connections 10. - Client Settings : DNS Default Domain
ad.sorbier.example, DNS Server 1192.168.10.177, DNS Server 2192.168.10.181. Les portables sont membres du domaine : ils doivent interroger l'annuaire. - Firewall Rule Configuration : coche Firewall Rule (règle sur le WAN, UDP 1194) ; ne coche pas OpenVPN rule, qui autoriserait tout le trafic du tunnel : tu écriras des règles précises.
Après l'assistant, édite le serveur (VPN > OpenVPN > Servers) et vérifie le mode : Remote Access (SSL/TLS + User Auth). Chaque utilisateur doit alors présenter deux preuves : un certificat signé par l'autorité du VPN et son mot de passe de l'annuaire. Coche Strict User-CN Matching : le nom inscrit dans le certificat (son Common Name) doit être l'identifiant de l'utilisateur, ce qui empêche un commercial d'utiliser le certificat d'un collègue avec son propre mot de passe.
Crée ensuite un certificat par utilisateur : System > Cert. Manager > Certificates > Add/Sign, Method « Create an internal Certificate », autorité CA-VPN-Sorbier, Certificate Type User Certificate, Common Name égal à l'identifiant de l'annuaire (lduval pour Léa Duval).
OpenVPN : distribuer le profil
Installe le paquet openvpn-client-export (System > Package Manager). VPN > OpenVPN > Client Export :
- Remote Access Server : « VPN commerciaux UDP4:1194 » ;
- Host Name Resolution : Other,
vpn.sorbier.example(un nom DNS public qui pointe vers203.0.113.17: le jour où l'adresse change, les profils restent valables) ; - en bas de page, une ligne par certificat d'utilisateur : Inline Configurations > Most Clients télécharge un fichier
.ovpnqui contient la configuration, le certificat et la clé de l'utilisateur, et la clé TLS ; Current Windows Installers télécharge un installateur du client communautaire déjà configuré.
WireGuard : le tunnel de l'astreinte
System > Package Manager > Available Packages : installe WireGuard. Puis :
- VPN > WireGuard > Tunnels > Add Tunnel : Enable coché, Description « Astreinte », Listen Port
51820, Interface Keys : Generate (pfSense crée la clé privée du tunnel et en déduit la clé publique), Interface Addresses10.8.0.1/24. Save Tunnel. - VPN > WireGuard > Peers > Add Peer : Enable, Tunnel
tun_wg0(Astreinte), Description « Portable astreinte », Dynamic Endpoint coché (le portable se connecte depuis n'importe où), Keep Alive vide, Public Key : la clé publique du portable, Allowed IPs10.8.0.200/32. Save Peer. - VPN > WireGuard > Settings : Enable coché, Save, Apply Changes.
Sur le portable, le client WireGuard pour Windows génère lui-même la paire de clés (Ajouter un tunnel > Ajouter un tunnel vide) ; sous Linux, wg genkey | tee prive.key | wg pubkey > public.key. La clé privée ne quitte jamais l'appareil : seule la clé publique est copiée dans pfSense. La configuration du portable :
[Interface]
PrivateKey = <clé privée du portable>
Address = 10.8.0.200/32
[Peer]
PublicKey = <clé publique du tunnel de pf1>
Endpoint = vpn.sorbier.example:51820
AllowedIPs = 192.168.10.210/32
PersistentKeepalive = 25
AllowedIPs a deux rôles. Côté pfSense (dans le pair), c'est une liste de contrôle : le pare-feu n'accepte de ce portable que des paquets venant de 10.8.0.200. Côté portable, c'est la table de routage : seuls les paquets vers le bastion entrent dans le tunnel. Pour un tunnel complet, on écrirait AllowedIPs = 0.0.0.0/0 ; il faudrait alors autoriser la navigation dans les règles du tunnel, le NAT sortant automatique couvrant déjà le réseau 10.8.0.0/24.
Pas de ligne DNS : l'astreinte joint le bastion par son adresse, et le portable garde son DNS habituel. Mettre ici les contrôleurs de domaine sans les inclure dans AllowedIPs ni les autoriser dans l'onglet WireGuard casserait toute la résolution de noms du portable dès que le tunnel est actif : ses requêtes partiraient vers 192.168.10.177 par sa connexion Internet locale et resteraient sans réponse.
Les règles des VPN
Sur le WAN, deux règles (déjà au chapitre 5) : UDP 1194 et UDP 51820 vers WAN address, journalisées.
Dans l'onglet OpenVPN (tout ce qui sort des tunnels OpenVPN) :
| N° | Action | Proto | Source | Destination | Port | Journal | Description |
|---|---|---|---|---|---|---|---|
| 1 | Pass | TCP | 10.8.1.0/24 | SRV_DC | PORTS_AD_TCP | Nomades vers AD (TCP) | |
| 2 | Pass | UDP | 10.8.1.0/24 | SRV_DC | PORTS_AD_UDP | Nomades vers AD (UDP) | |
| 3 | Pass | TCP | 10.8.1.0/24 | SRV_FICHIERS | 445 | Partages | |
| 4 | Pass | TCP | 10.8.1.0/24 | SRV_GESTION | 443 | Application de gestion | |
| 5 | Block | Any | any | any | Oui | Refus final OpenVPN |
Dans l'onglet WireGuard :
| N° | Action | Proto | Source | Destination | Port | Journal | Description |
|---|---|---|---|---|---|---|---|
| 1 | Pass | TCP | 10.8.0.200 | 192.168.10.210 | 443 | Oui | Astreinte vers bastion |
| 2 | Block | Any | any | any | Oui | Refus final WireGuard |
Le portable d'astreinte n'atteint que le bastion, en HTTPS ; c'est le bastion qui ouvre ensuite les sessions d'administration, enregistrées. Une règle par adresse fixe de pair permet de donner des droits différents à chaque appareil ; avec OpenVPN, les substitutions par client (VPN > OpenVPN > Client Specific Overrides) donnent une adresse fixe dans le tunnel à un utilisateur, pour la même raison.
Vérifier et exploiter
- Status > OpenVPN : les clients connectés, leur adresse publique, leur adresse dans le tunnel, l'heure de connexion, les octets échangés.
- Status > WireGuard : chaque pair, la date de la dernière poignée de main (handshake) et les octets échangés ; un pair sans poignée de main récente n'est pas connecté.
- Status > System Logs > OpenVPN : les connexions réussies et les échecs d'authentification.
- Révoquer : un commercial quitte l'entreprise ? Désactiver son compte dans l'annuaire suffit à bloquer OpenVPN (le mot de passe ne passe plus), et on révoque son certificat (System > Cert. Manager > Certificate Revocation, puis on sélectionne la liste de révocation dans le serveur OpenVPN). Un portable d'astreinte perdu ? On supprime son pair dans VPN > WireGuard > Peers : sa clé n'ouvre plus rien.
Sécuriser l'accès distant
La passerelle VPN est exposée à tout Internet et ouvre la porte du réseau interne : c'est une cible prioritaire.
- Mettre à jour pfSense sans tarder à chaque avis de sécurité : beaucoup d'intrusions commencent par une faille de passerelle VPN.
- Ajouter un second facteur à OpenVPN : pfSense peut déléguer l'authentification à un serveur RADIUS qui gère le second facteur (code à usage unique, notification sur téléphone). Un mot de passe seul, volé par hameçonnage, suffirait sinon. Les méthodes sont détaillées dans le chapitre MFA du cours Authentification.
- Un accès par personne, jamais de profil partagé ; un groupe de l'annuaire (
GG_VPN) qui dit qui a le droit. - Journaliser les connexions et les envoyer à Wazuh, qui alerte sur une connexion depuis un pays inhabituel ou sur une rafale d'échecs (chapitre 15).
- Choisir le tunnel complet si la navigation des nomades doit rester filtrée par l'entreprise ; le tunnel partagé si le débit du siège est limité.
Exercices
Exercice 1 sur 3 Remplir le tunnel d'un nouveau pair Réussi À revoir
Un second technicien rejoint l'astreinte, avec son propre portable. Le premier utilise 10.8.0.200.
- Que crées-tu dans pfSense ? Donne les champs importants.
- Écris la configuration de son client, en tunnel partagé vers le bastion.
- Quelle règle ajoutes-tu, ou comment fais-tu évoluer celle qui existe ?
Voir la réponseMasquer la réponse de l'exercice 1
- Un nouveau pair dans VPN > WireGuard > Peers : Tunnel
tun_wg0, Description « Portable astreinte 2 », Dynamic Endpoint coché, Public Key = clé publique de son portable (générée sur le portable), Allowed IPs10.8.0.201/32. On ne réutilise jamais la clé d'un autre appareil. - La configuration du portable 2 :
[Interface]
PrivateKey = <clé privée du portable 2>
Address = 10.8.0.201/32
[Peer]
PublicKey = <clé publique du tunnel de pf1>
Endpoint = vpn.sorbier.example:51820
AllowedIPs = 192.168.10.210/32
PersistentKeepalive = 25
Pas de ligne DNS, comme pour le premier portable : les contrôleurs de domaine ne sont ni dans AllowedIPs ni autorisés dans l'onglet WireGuard, et le portable perdrait toute résolution de noms.
- Créer un alias
ASTREINTE(Host(s)) contenant10.8.0.200et10.8.0.201, et l'utiliser comme source de la règle « Astreinte vers bastion ». Ajouter un troisième technicien ne demandera plus qu'une entrée dans l'alias.
Tu avais trouvé ?
Exercice 2 sur 3 Le commercial qui voit tout Réussi À revoir
Un audit relève sur pfSense : un serveur OpenVPN en mode Remote Access (User Auth), authentification sur la base locale de pfSense avec un seul compte commerciaux partagé, l'option Redirect IPv4 Gateway décochée, et dans l'onglet OpenVPN une règle Pass any any. Liste les problèmes et la correction de chacun.
Voir la réponseMasquer la réponse de l'exercice 2
| Constat | Risque | Correction |
|---|---|---|
| Mode User Auth seul | Un mot de passe volé suffit à se connecter | Mode SSL/TLS + User Auth : certificat personnel et mot de passe, Strict User-CN Matching |
Compte local partagé commerciaux | Aucune traçabilité, aucune révocation individuelle ; le départ d'un commercial impose de changer le mot de passe de tous | Authentification par l'annuaire (LDAPS), un compte par personne, groupe GG_VPN ; second facteur par RADIUS |
| Règle Pass any any | Un portable compromis atteint tout le réseau, administration comprise | Règles précises : contrôleurs de domaine, srv-fichiers, srv-gestion, puis refus final journalisé |
| Tunnel partagé | La navigation des commerciaux échappe au filtrage de l'entreprise | Acceptable si le débit du siège est limité, à condition de protéger les portables autrement (filtrage DNS en nuage, EDR) ; sinon, tunnel complet |
Tu avais trouvé ?
Exercice 3 sur 3 Pourquoi l'astreinte ne joint pas le bastion Réussi À revoir
Le portable d'astreinte se connecte : Status > WireGuard montre une poignée de main récente. Pourtant, https://192.168.10.210 ne répond pas. Le journal du pare-feu ne montre aucun blocage. La configuration du portable contient AllowedIPs = 10.8.0.0/24.
- Explique.
- Corrige.
Voir la réponseMasquer la réponse de l'exercice 3
- Côté portable,
AllowedIPsest la table de routage du tunnel : seuls les paquets vers10.8.0.0/24y entrent. Les paquets vers192.168.10.210partent par la connexion Internet locale du portable, n'atteignent jamais pfSense, d'où l'absence de ligne dans le journal. - Mettre
AllowedIPs = 192.168.10.210/32(ou le réseau dont il a besoin) dans la section[Peer]du portable, réactiver le tunnel, et vérifier que la règle « Astreinte vers bastion » de l'onglet WireGuard voit passer le trafic (colonne States).
Tu avais trouvé ?