Ce guide vous permet de mettre en oeuvre le contexte professionnel qui est proposé pour le support des réalisations professionnelles E6 du BTS SIO SISR.
Préparez tout d’abord un document sur lequel vous aller schématiser et inventorier précisément les matériels ou VM que vous utiliserez, les différentes informations s’y rattachant : photos, marque/modèle, configuration (CPU, RAM, Stockage, …) ; adresses MAC, adresses IP, accès d’administration (mode, adresse, login et mot de passe), accès utilisateurs (idem), ... Vous pouvez pour cela vous appuyer sur le document de présentation générique du contexte.
Pour réaliser le contexte, nous nous appuyons sur un commutateur réseau administrable au niveau 2, disposant d’au moins 8 ports GbE.
Voici le schéma final d’interconnexion du switch avec le PVE :

La liaison entre l’hyperviseur et le switch est un lien agrégé selon le protocole LACP, et porte l’ensemble des VLAN (lien trunk).
L'interface d'administration web du switch doit répondre sur l’IP 10.X.99.11.
Exemple : adresse IP (statique) d'un switch D-Link DGS-1210-08P, avec X=0 :

Il faut configurer l’interface de votre PC pour qu’il ait une adresse IP fixe sur le même réseau que le switch, par exemple
10.X.99.100/24(on paramètre aussi la future passerelle par défaut) :

Configurer la section VLAN (802.1Q) du switch selon ce schéma :
| port : | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 et + | |
|---|---|---|---|---|---|---|---|---|---|---|
| PVID : | 10 | 20 | 20 | 30 | 99 | 99 | 99 | 99 | 10 | |
| VLAN | mode : | access | access | access | access | trunk | trunk | access | access | access |
| 10 | WAN | U | T | T | U | |||||
| 20 | LAN | U | U | T | T | |||||
| 30 | DMZ | U | T | T | ||||||
| 99 | ADM | T | T | U | U | |||||
| usage : | WAN | LAN | LAN | DMZ | PVE | PVE | ADM | ADM | WAN |
Le VLAN 1 n'est pas représenté ci-dessus, mais il est possible qu'il ne puisse pas être supprimé sur le switch.
Voici la configuration sur le D-Link DGS-1210-08P. On configure de façon équivalente les ports 5 et 6 (en mode trunk).

Je laisse le port 1 dans le VLAN 1 afin de conserver grâce à lui un accès au VLAN d'administration !
Ne pas oublier de sauvegarder régulièrement la configuration du switch.
L'interface web d'administration du switch doit répondre sur le VLAN d'administration (99). On modifie donc ce paramètre.
Par exemple, toujours sur le D-Link DGS-1210-08P :

NB : après application, on "perd la main" sur la page web puisque le port 1 n'est pas dans le VLAN d'administration. En reconnectant sur le port 7 ou 8, on retrouve l'accès.
On n'oublie pas pour finir de placer le port 1 dans le VLAN 10 (WAN) :

On voit ici que le VLAN 1 existe toujours (non supprimable), mais aucun port ne lui est associé.

Le switch a automatiquement affectés les PVID à chaque port, en fonction de leur rattachement en mode access. Les ports 5 et 6 fonctionnant en mode trunk, le PVID est resté sur 1, mais c'est sans importance, toutes les trames circulant par ces ports devant être étiquetées (taggées).
Rappel : le PVID est le VLAN dans lequel le switch affecte une trame qui entre par le port (ingress).
Il est possible que le PVID ne soit pas modifiable sur certains modèles ; quand c'est possible, et que le PVID est différent du VLAN access, on est en mode asymétrique, dont l'usage est plutôt rare et spécifique.
Conformément au schéma initial, on va agréger les ports 5 et 6 du switch selon le protocole LACP. Pour cela il faut que les deux ports soient configurés de façon identique au niveau des VLAN, ce qui est le cas ici.
Dans le cas du D-Link DGS-1210-08P, il faut d'abord activer "link aggregation", puis créer le groupe LACP des ports 5 et 6.

Et on n'oublie pas de sauvegarder la config !
Nous allons déployer maintenant le superviseur principal sur une machine physique avec les caractéristiques minimales suivantes :
Vérifiez que les interfaces de stockage sont bien en mode
AHCI / NVMeet non enRAID.
Récupérer l’ISO d’installation sur le site Proxmox : https://www.proxmox.com/en/proxmox-ve

Installer PVE en utilisant le système de fichier ZFS (raid-0) sur le premier disque seulement :
ZFS / raid-0
Concernant le mot de passe d’administration à définir ensuite, il peut être intéressant de respecter les règles de complexité en vigueur et l’intégrer dans un outil de gestion des mots de passe (type Keepass ou Bitwarden).
On choisit une des interfaces réseau pour l’administration (il faut la repérer physiquement, en s’aidant par exemple de l’indicateur vert qui signale que l’interface est connectée) :

pve.carlann-X.lan10.X.99.10/2410.X.99.1 (futur pfSense)1.1.1.1 (Cloudflare DNS)Après redémarrage de PVE, on obtient ceci sur la console :

Votre PC, le switch et le PVE sont normalement dans le même plan d’adressage IP (10.X.99.0/24). En connectant le PVE sur le switch (port 7 ou 8), l’interface WEB de PVE est alors accessible via le navigateur :

Le message qui apparaît ensuite est normal, il indique que ce n’est pas une version enregistrée :

Modification des dépôts logiciels :


Voici l’interface WEB de PVE après installation, section réseau :

On y voit :
enp0s31f6 et enp1s0wlp2s0vmbr0 connecté à l'interface physique enp1s0 sur lequel est "branchée" également l'interface d'admin de PVE (10.0.99.10)On va créer d'abord l’agrégat bond0 à partir des deux interfaces filaires disponibles.
Il faut d’abord retirer l’interface du bridge vmbr0 :

Surtout n'appliquez pas la configuration maintenant !
Puis on peut créer le Linux Bond en y ajoutant les deux interfaces physiques :

Sur bond0 on crée les Linux VLAN 10 (WAN), 20 (LAN), 30 (DMZ) et 99 (ADM), en utilisant l'écriture canonique du vlan (ìnterface.vlanid).

On supprime l’éventuelle interface Wi-Fi inutile avec le bouton remove.

On voit ci-dessus les quatre VLAN créés.
Attention à ne pas encore appliquer la configuration !
Pour pouvoir utiliser ces différents VLAN, nous les connectons sur des bridges (qu'on peut assimiler à des commutateurs virtuels) :
vmbr0 (qui existe déjà) intègre l’interface VLAN bond0.99vmbr1 (à créer) intègre l’interface VLAN bond0.20vmbr2 (à créer) intègre l’interface VLAN bond0.10vmbr3 (à créer) intègre l’interface VLAN bond0.30Ce qui nous donne sur l'interface web PVE :

Voici le schéma final correspondant :

Pour valider le fonctionnement du bond LACP, tapez cette commande dans le Shell du PVE :
cat /proc/net/bonding/bond0 | less
Nous avons deux disques dans notre hyperviseur. Le premier contient le système PVE, et nous allons dédier le second au stockage des disques virtuels des futures VM, via un pool de stockage ZFS.

Dans le cas ci-dessus, on voit le disque /dev/sda qui contient le système, et le second /dev/nvme0n1 qui contient des traces (partitions) d'une "vie antérieure".

Désormais, PVE est prêt. Il ne reste plus qu'à le connecter à Internet, via une VM pfSense qu'il va héberger, pour le mettre à jour.
On téléverse l’ISO d’installation de pfSense dans PVE, dans local (pve) :

On peut maintenant créer la VM pfSense :
Après que la VM est créée, on ajoute trois interfaces réseau virtIO supplémentaires, sur vmbr1 (LAN), vmbr0 (ADM) et vmbr3 (DMZ), sans oublier de décocher l'option firewall :

Les adresses MAC sont visibles, ce qui sera utile pour la configuration de pfSense.
Une fois la VM démarrée, la console pfSense est visible sur l’interface WEB de PVE :

Attention à bien affecter l'interface WAN au vlan 10 (
vtnet0normalement) et LAN au vlan 99 (vtnet2) et à positionner les IP en conséquence. En effet, ce que pfSense appelle LAN va être renommé ADM, les interfaces LAN et DMZ seront configurées plus tard :

Voici une synthèse des connexions :
VLAN 10 ↔ vmbr2 ↔ vtnet0 ↔ WAN pfSense ↔ DHCP (10.35.13.xxx)VLAN 99 ↔ vmbr0 ↔ vtnet2 ↔ LAN pfSense ↔ 10.0.99.1/24VLAN 20 ↔ vmbr1 ↔ vtnet1 ↔ OPT1 pfSense ↔ 10.0.20.1/24 (à définir plus tard)VLAN 30 ↔ vmbr3 ↔ vtnet3 ↔ OPT2 pfSense ↔ 10.0.30.1/24 (à définir plus tard)Après l'installation de pfSense, bien penser à l'éteindre (commande
init 0via le shell en fin d'installation) et retirer le lecteur optique (dans la section hardware).
Voici le schéma mettant en situation la VM pfSense dans l’environnement PVE :

A ce stade, puisque par défaut l’interface LAN de pfSense dispose d’une règle ouverte sur le pare-feu, et que cette interface a été connecté au bridge vmbr0, on devrait pouvoir, depuis un ordinateur connecté dans le réseau ADM :


Depuis l’interface web de pfSense, réaliser la configuration initiale (« setup wizard ») selon le cahier des charges (hormis les DNS qu’on va positionner sur le DNS du labo en attendant la mise en place du serveur Windows avec son rôle DNS) :
10.35.13.11.1.1.12.pfsense.pool.ntp.org10.X.99.124Dans le menu interfaces > WAN > IPv6 Configuration Type, choisir None
Modifier le tableau de bors pour afficher l'état des passerelles ainsi que les grahes de trafic.

Renommez les interfaces (depuis le menu Interfaces ) :
LAN devient ADMOPT1 devient LANOPT2 devient DMZNous allons configurer les adresses IP de ces deux interfaces.
interfaces > LAN
10.X.20.1 / 24interfaces > DMZ
10.X.30.1 / 24Tout d'abord, comme l’éditeur de pfSense nous y invite, on remplace le serveur DHCP ISC (déprécié) par KEA, dans les paramètres avancés :
System > Advanced > Networking > Server Backend : Kea DHCPEnsuite, on active le service DHCP sur chaque interface :
Services > DHCP Server > ADM
10.X.99.10010.X.99.199Services > DHCP Server > LAN
10.X.20.10010.X.20.199Services > DHCP Server > DMZ
10.X.30.10010.X.30.199Dans un premier temps, on va mettre en place des règles de pare-feu basiques et ouvertes sur chaque interface, nous les affinerons en fin de parcours, selon le cahier des charges.
system > Advanced > Admin Access > Anti-lockout > ☑
Nous allons établir notre pfSense comme serveur NTP de notre infrastructure. Il va lui-même s’appuyer en amont sur un pool de serveurs publics (issus de *.pool.ntp.org).
Services > NTP > SettingsADM, LAN, DMZ) et sur localhost (pour le pfSense lui-même), et utilise donc un pool de trois serveurs NTP :
2.pfsense.pool.ntp.org1.pfsense.pool.ntp.orgfr.pool.ntp.org, à positionner comme serveur préféré (prefer ☑)
Etant donné la configuration de pfSense en tant que VM PVE, il convient d'optimiser le fonctionnement du réseau.
Allez dans System > Advanced > Networking et cochez les 3 cases suivantes :
Hardware Checksum OffloadingHardware TCP Segmentation OffloadingHardware Large Receive OffloadingCliquez sur Save et redémarrez pfSense comme cela vous sera proposé.
Le CPU de notre hyperviseur étant doté du jeu d'instruction AES-NI, il convient d'en faire profiter pfSense, au cas où le chiffrement serait sollicité (pour openVPN par exemple).
Allez dans System > Advanced > Miscellaneous, rubrique Cryptographic & Thermal Hardware.
AES-NI CPU-based AcceslerationOn va créer un utilisateur administrateur et désactiver le compte admin par défaut.
System > User Manager > users > + Add :

Puis sauvegardez.


Attention, si vous souhaitez plus tard activer l'administration de pfSense via une console SSH, il faudra réactiver l'admin par défaut (qui est associé à l'utilisateur
root).
Uploadez sur PVE l’ISO de Windows Server (2025) dans le stockage local (pve), ainsi que l'image ISO des drivers VirtIO téléchargeable ici : https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
Si la fonction d'upload intégrée dans PVE se plante, il est possible de téléverser l'image ISO par ssh, avec la commande scp, selon ce modèle :
scp /chemin/vers/imagexxxx.iso root@10.X.99.10:/var/lib/vz/template/iso/

Créez la VM Windows Server (DC 1) :
Lancer l’installation de Windows Server Standard en mode Core (sans l'expérience de bureau).
Le stockage virtIO ne sera pas reconnu, il faudra charger le pilote depuis le lecteur contenant l'ISO des pilotes VirtIO (dans le répertoire amd64\2k22 ou amd64\2k25, selon la version de Windows Server que vous avez choisie) :


Après l'installation, paramétrer le mot de passe administrateur.
L’utilitaire sconfig se lance alors, il faut le quitter pour le moment (option 15), afin d’installer les pilotes (notamment l'interface réseau), toujours depuis le lecteur virtIO :
d:virtio-win-guest-tools.exe
exit puis option 14 de sconfig)
Configurez le serveur avec sconfig, conformément au cahier des charges :
2 Nom de l’ordinateur : CLX-SRV01 (ne pas redémarrer tout de suite)3 Ajouter un administrateur local : p.nom4 Administration à distance :
1 activer (par défaut)3 autoriser le ping5,7 : on laisse par défaut8 Réseau
1 Définir l'adresse
10.X.20.10255.255.255.0 (par défaut)10.X.20.12 Définir le DNS
10.35.13.113 : redémarrer le serveur9 : configurer la mise à l’heure (client NTP) sur pfSense
Il est important que cette étape NTP fonctionne comme prévu ; si la synchronisation ne fonctionne pas, il faut dès maintenant trouver la cause.
Concernant les mises à jour (option 6), elles peuvent être longues, il faut reporter cela à un moment adapté (temps de pause)
15 : Sortir de sconfiglogoff pour fermer la fenêtre cmd en cours et revenir à l’écran de verrouillageCe poste client est un second ordinateur détaché, idéalement une VM sur votre PC personnel, avec une interface bridgée sur une interface filaire supplémentaire (par exemple on peut utiliser un adaptateur USB/ETHERNET). Cette VM Windows est installée et configurée selon les méthodes habituelles. L’interface réseau de la VM est laissée DHCP. Il faut veiller à la préserver (elle fait partir intégrante du contexte). Celle-ci est connectée au réseau LAN (ports 2 ou 3 du switch). Enfin, notons que la première machine reste toujours connectée au réseau ADM via l’autre interface filaire.
On renomme ce PC client conformément au cahier des charges : CLX-PC01
Puis on le redémarre.
Toujours pour respecter le cahier des charges, on va affecter un bail fixe 10.X.20.20 sur le LAN (depuis la console web de pfSense, via la page de statut DHCP) :

+ au bout de la ligne (Add static mapping)
10.X.20.20). résiduel qu'il faut retirer)Il faut redémarrer la machine, ou renouveler le bail DHCP. On vérifie qu’elle a bien obtenu l’adresse IP prévue par le bail statique :


Depuis la machine cliente, on va administrer à distance le serveur Windows Core.
Ouvrir PowerShell avec privilèges administrateur.
Tout d’abord, le profil du réseau doit être de type Privé :
Get-NetConnectionProfile
Exemple de réponse (avec un type Public, ligne 4) :
Name : Réseau
InterfaceAlias : Ethernet
InterfaceIndex : 7
NetworkCategory : Public
DomainAuthenticationKind : None
IPv4Connectivity : NoTraffic
IPv6Connectivity : NoTraffic
Dans un tel cas, pour modifier (adapter au besoin le nom du réseau) :
Set-NetConnectionProfile -Name "Réseau" -NetworkCategory Private
Puis on active la fonctionnalité winrm :
winrm qc
Il faudra répondre y plusieurs fois :
WinRM n’est pas configuré pour recevoir des demandes sur cet ordinateur.
Les modifications suivantes doivent être effectuées :
Démarrez le service WinRM.
Affectez un démarrage automatique à retardement au service WinRM.
Effectuer ces modifications [y/n] ? y
WinRM a été mis à jour pour recevoir des demandes.
Le type du service WinRM a été correctement modifié.
Le service WinRM a démarré.
WinRM n’est pas configuré pour la gestion à distance de cet ordinateur.
Les modifications suivantes doivent être effectuées :
Activez l’exception de pare-feu WinRM.
Configurez LocalAccountTokenFilterPolicy pour attribuer des droits d’administration à distance à des utilisateurs locaux.
Effectuer ces modifications [y/n] ? y
WinRM a été mis à jour pour la gestion à distance.
Exception de pare-feu WinRM activée.
LocalAccountTokenFilterPolicy configuré pour attribuer des droits d’administration à distance à des utilisateurs locaux.
En réalité le client Windows n'a pas besoin du service WinRM (contrairement au serveur). Mais il faut l'activer uniquement pour pouvoir gérer la liste des hôtes de confiance que nous verrons juste après.
Le serveur doit répondre au ping :
ping 10.X.20.10
On autorise le serveur comme hôte de confiance …
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "10.X.20.10"
Vous aurez :
Cette commande modifie la liste TrustedHosts pour le client WinRM. Les ordinateurs figurant dans la liste TrustedHosts
ne sont pas nécessairement authentifiés. Or, le client risque d'envoyer des informations d'identification à destination
de ces ordinateurs. Êtes-vous sûr de vouloir modifier cette liste ?
[O] Oui [N] Non [S] Suspendre [?] Aide (la valeur par défaut est « O ») : O
… et on s’y connecte :
Enter-PSSession -ComputerName '10.X.20.10' -Credential 'administrateur'
Si tout va bien, votre Shell est désormais connecté sur le serveur (le prompt est modifié) :
[10.X.20.10]: PS C:\Users\Administrateur\Documents>
il est (très) prudent à ce stade de faire un snapshot du serveur Windows sur PVE
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
La progression de l'installation est affichée en haut de la fenêtre. Puis on obtient ce résultat :
Success Restart Needed Exit Code Feature Result
------- -------------- --------- --------------
True No Success {Services de domaine Active Directory, Ges...
Maintenant, nous allons promouvoir le serveur comme contrôleur de domaine (et créer le domaine et la forêt au passage) :
AdminPwd ; il faut personnaliser ce mot de passe bien entendu :$AdminPwd = ConvertTo-SecureString "Azerty/123" -AsPlaintext -Force
$NomDomaine = "carlann-X.lan"
$NomDomaineNetBios = "CARLANN-X"
Install-ADDSForest `
-CreateDnsDelegation:$false `
-DomainName $NomDomaine `
-DomainNetbiosName $NomDomaineNetBios `
-DatabasePath "C:\Windows\NTDS" `
-DomainMode "Default" `
-ForestMode "Default" `
-InstallDNS:$true `
-LogPath "C:\Windows\NTDS" `
-NoRebootOnCompletion:$false `
-SysvolPath "C:\Windows\SYSVOL" `
-SafeModeAdministratorPassword $AdminPwd -Force:$true
Un certain nombre d’avertissements non bloquants doivent apparaître tout au long du processus :

Puis :
Message Context RebootRequired Status
------- ------- -------------- ------
L’opération s’est déroulée avec succès. DCPromo.General.1 False Success
Même si ce message indique qu'un redémarrage n'est pas requis, le serveur va redémarrer automatiquement, en indiquant (pendant un certain temps) sur sa console
Application des paramètres de l’ordinateur.
On pourra remarquer que l’empreinte (CPU, RAM) du serveur en mode core est assez modérée :

Windows Server assurant désormais la fonction de serveur DNS, nous allons modifier pfSense pour qu’il n’assure plus ce rôle, et que le DHCP affecte bien le bon DNS aux clients.
Services > DNS resolver > Enabled > ☐System > general setup
DNS Servers > 10.X.20.10DNS Server Override > ☐On va simplement redémarrer la VM Windows cliente, afin qu’elle récupère un nouveau bail DHCP avec le bon DNS (10.X.20.10 = le serveur AD) pour pouvoir l’intégrer dans le domaine carlann-X.lan.
Pour atteindre le bon outil, exécutez sysdm.cpl et rejoignez le domaine :

La VM WindowsAdmin va redémarrer.



Il faut ensuite installer les fonctionnalités RSAT sur cette machine pour gérer le serveur.
Get-WindowsCapability -Name RSAT* -Online | Where-Object {$_.State -eq "Installed"}
Attention l'installation de ces outils peut être longue, car elle implique un certain nombre de dépendances.
Get-WindowsCapability -Name "Rsat.ServerManager*" -Online | Add-WindowsCapability -Online
Get-WindowsCapability -Name "Rsat.ActiveDirectory*" -Online | Add-WindowsCapability -Online
Get-WindowsCapability -Name "Rsat.DNS*" -Online | Add-WindowsCapability -Online
Get-WindowsCapability -Name "Rsat.GroupPolicy.Management*" -Online | Add-WindowsCapability -Online
On vérifie les outils RSAT maintenant installés :
Get-WindowsCapability -Name RSAT* -Online | Where-Object {$_.State -eq "Installed"}
On doit obtenir cette liste :
Name : Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
State : Installed
DisplayName : RSAT : outils Active Directory Domain Services Directory et services LDS (Lightweight Directory Services)
Description : Les outils Active Directory Domain Services (AD DS) et les services AD LDS (Lightweight Directory Services) comprennent des outils de composant logiciel enfichable et de ligne de commande pour la gestion à distance d'AD DS et d'AD LDS sous Windows Server.
DownloadSize : 0
InstallSize : 53252970
Name : Rsat.Dns.Tools~~~~0.0.1.0
State : Installed
DisplayName : RSAT : outils du serveur DNS
Description : Les outils du serveur DNS incluent le composant logiciel enfichable Gestionnaire DNS, l'outil de ligne de commande dnscmd.exe et le module Windows PowerShell pour le serveur DNS.
DownloadSize : 0
InstallSize : 17841540
Name : Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0
State : Installed
DisplayName : RSAT : outils de gestion de stratégie de groupe
Description : Les outils de gestion de stratégie de groupe incluent la console de gestion des stratégies de groupe, l'éditeur de gestion des stratégies de groupe et l'éditeur d'objets GPO Starter de stratégie de groupe.
DownloadSize : 0
InstallSize : 48967574
Name : Rsat.ServerManager.Tools~~~~0.0.1.0
State : Installed
DisplayName : RSAT : gestionnaire de serveur
Description : Le Gestionnaire de serveur inclut la console du Gestionnaire de serveur et des outils PowerShell pour la gestion à distance de Windows Server, et inclut des outils pour configurer à distance l'association de cartes réseau sur Windows Server et Best Practices Analyzer.
DownloadSize : 0
InstallSize : 87548122
Après l’installation de ces outils, lancer le gestionnaire de Serveur sur le PC client admin, et ajouter le serveur :

En cas de difficulté pour trouver le gestionnaire de serveur, il faut saisir
serverdans la barre de recherche Windows. Pensez à l'épingler à la barre des tâches !
Nous allons mettre en place un partage réservés aux administrateurs.
Attention, il ne respecte pas très bien les règles habituelles AGDLP.
Depuis le gestionnaire de serveur, créer un partage simple :














C’est notamment par ce dossier réseau que nous pourrons fournir des fichiers (notamment des scripts) au serveur depuis la machine cliente.
Sur le PC WindowsAdmin, ouvrir PowerShell ISE pour avoir la console de scripting :

On se connecte à nouveau par WinRM sur le serveur ; le PC appartient au domaine et on est administrateur, c’est donc désormais plus simple (pas d’authentification requise) :
Enter-PSSession -ComputerName 'CLX-SRV01'
Création des Unités d’Organisation (OU) pour les ordinateurs et les utilisateurs (via WinRM).
Copiez ce script dans Powershell ISE, et exécutez-le :
$liste_ou = "Administration","Production","Sécurité","PC","Serveurs“
foreach ($ou in $liste_ou)
{
New-ADOrganizationalUnit -Path "DC=carlann-X,DC=lan" -Name $ou -PassThru
}

On vérifie depuis la console de gestion de Active Directory :

Nous allons maintenant importer les utilisateurs du domaine par script, depuis un fichier CSV (données séparées par un point-virgule) placé sur le serveur :
Le fichier CSV (exemple à personnaliser, notamment pour la colonne DC2) :

Le fichier CSV est à copier dans le dossier \\CLX-SRV01\admin :

Le script :
$users = import-csv -path "\\CLX-SRV01\admin\utilisateurs_ad.csv" -delimiter ";"
foreach($user in $users) {
$login=$user.login
# Vérifier si le compte utilisateur existe déjà dans l'AD
if (Get-ADUser -Filter {SamAccountName -eq $login})
{
# Si l’utilisateur existe, éditez un message d’avertissement
Write-Warning "Un utilisateur $login existe déjà dans l'Active Directory."
}
else
{
$OU = "OU=" + $user.OU + ",DC=" + $user.DC2 + ",DC=" + $user.DC1
$UPN = $user.login + "@" + $user.DC2 + "." + $user.DC1
$CN = $user.prenom + " " + $user.nom
$secure_pwd = convertto-securestring $user.password -asplaintext -force
New-ADuser `
-SamAccountName $login `
-UserPrincipalName $UPN `
-displayName $CN `
-givenname $user.prenom `
-Surname $user.nom `
-Name $CN `
-Path $OU `
-AccountPassword $secure_pwd `
-Description $user.fonction `
-Enabled $True
}
}
Le script en situation :

Après que le script a été lancé, on peut visualiser les utilisateurs dans la console :

On va créer maintenant un second serveur Windows, contrôleur de domaine complémentaire (bonne pratique).
Créez cette VM que vous appellerez win-dc-2 de la même façon que la première.
Lancer l’installation de Windows Server Standard en mode Core (sans l'expérience de bureau). Ici aussi, le processus est le même que pour le premier.
Après l'installation, paramétrer le mot de passe administrateur.
L’utilitaire sconfig se lance alors, il faut le quitter pour le moment (option 15), afin d’installer les pilotes (notamment l'interface réseau), depuis le lecteur virtIO.
Et enfin :
exit puis option 14 de sconfig)Configurez le serveur avec sconfig, conformément au cahier des charges :
1 Rejoindre le domaine carlann-X.lan
4 Administration à distance :
1 activer (par défaut)3 autoriser le ping5,7 : on laisse par défaut8 Réseau
1 Définir l'adresse
10.X.20.11255.255.255.0 (par défaut)10.X.20.12 Définir le DNS
10.X.20.10 (le premier DC)13 : redémarrer le serveur (et lui laisser un peu de temps pour se configurer)Depuis la machine cliente, connecté comme administrateur du domaine, on va maintenant configurer à distance ce second serveur Windows Core.
Deux possibilités :
Depuis le gestionnaire de serveur sur la machine GUI :
Puis on ajoute le rôle nécessaire
Ouvez PowerShell. Le serveur doit répondre au ping :
ping clX-srv03
On s’y connecte avec WinRM:
Enter-PSSession -ComputerName 'clX-srv03'
Si tout va bien, votre Shell est désormais connecté sur le serveur (le prompt est modifié) :
[clX-srv03]: PS C:\Users\Administrateur\Documents>
il est prudent à ce stade de faire un snapshot du serveur.
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
La progression de l'installation est affichée en haut de la fenêtre. Puis on obtient ce résultat :
Success Restart Needed Exit Code Feature Result
------- -------------- --------- --------------
True No Success {Services de domaine Active Directory, Ges...
Maintenant, nous allons promouvoir le serveur comme contrôleur de domaine supplémentaire :
SecureString). Ce mot de passe servira pour le mode restauration (DSRM) ET pour l'objet Credential :$MdpEnClair = "Azerty/123"
$AdminPwd = ConvertTo-SecureString $MdpEnClair -AsPlaintext -Force
$NomDomaine = "carlann-X.lan"
Credential (Identifiants Admin du domaine). C'est nécessaire pour autoriser l'ajout du serveur au domaine sans avoir de pop-up :$AdminUser = "administrateur@carlann-X.lan"
$Credential = New-Object System.Management.Automation.PSCredential ($AdminUser, $AdminPwd)
Install-ADDSDomainController `
-DomainName $NomDomaine `
-Credential $Credential `
-SafeModeAdministratorPassword $AdminPwd `
-DatabasePath "C:\Windows\NTDS" `
-LogPath "C:\Windows\NTDS" `
-SysvolPath "C:\Windows\SYSVOL" `
-InstallDNS:$true `
-NoGlobalCatalog:$false `
-NoRebootOnCompletion:$false `
-Force:$true
Résultat :
Message Context RebootRequired Status
------- ------- -------------- ------
L’opération s’est déroulée avec succès. DCPromo.General.3 False Success
Le serveur doit apparaître maintenant dans la console Active Directory :

A l'aide de sconfig, il modifier la configuration DNS des interfaces réseau de chaque DC, selon cette "bonne pratique" (accès croisé) :
10.X.20.11)127.0.0.110.X.20.10)127.0.0.1Exemple pour SRV01 :


clX-srv01 et clX-srv03) :

En effet, il faut le faire sur chaque serveur DNS, car les redirecteurs ne se répliquent pas.
Il est possible aussi de faire cela avec PowerShell :
Set-DnsServerForwarder -IPAddress "10.35.13.1" -ComputerName "CL0-SRV01"
Set-DnsServerForwarder -IPAddress "10.35.13.1" -ComputerName "CL0-SRV03"
Gardez la case "Utiliser les indications de racine ..." cochée, c'est une sécurité au cas où le serveur indiqué ne serait pas disponible. Le service irait alors chercher les serveurs DNS root d'Internet (Root Hints).
On met en place maintenant une zone de recherche inversée. Ceci est à faire sur un seul des DNS.

Choisir les propositions par défaut, en précisant le moment venu le réseau concerné :

Cette zone inversée va se répliquer sur l'autre serveur DNS, par forcément immédiatement. Pour forcer la synchronisation :
# Pour forcer CLX-SRV03 à recevoir les changements depuis CLX-SRV01 ;
repadmin /replicate "CLX-SRV03" "CLX-SRV01" "DC=carlann-X,DC=lan"
Nous avons désormais deux serveurs DNS, nous allons modifier pfSense pour ajouter le second (et que le DHCP affecte bien le bon DNS aux clients). Depuis le webadmin pfSense :
System > general setup
DNS Servers > 10.X.20.10DNS Servers > 10.X.20.11DNS Server Override > ☐
Nous allons déployer un serveur WEB dans la DMZ. Il aura vocation à fournir un site interne (intranet) et un site web externe (page statique par défaut).
Rappel des caractéristiques du serveur :
CLX-SRV02.carlann-X.lan10.X.30.11 ; GW 10.X.30.1 ; DNS : 10.X.20.10Dans un premier temps, il faut récupérer la dernière image ISO de Debian x64 netinstall, et la monter dans le stockage local de PVE, à l'instart des autres images ISO.
On crée la VM 102 appelée Debian-WEB
Un CPU et 1024 MiB de RAM :
Et l’interface réseau connectée au bridge vmbr3 (DMZ) :
Créez la VM Debian Web Server :
Lancer l’installation selon les procédés habituels :
CLX-SRV02 et le domaine carlann-X.lanOn se connecte comme root sur la console, afin d’installer et paramétrer certaines choses :
sudo apt update && sudo upgrade
sudo -y install openssh-server wget
sudo nano /etc/network/interfaces
10.X.30.11/24 :....
allow-hotplug ens18
iface ens18 inet static
address 10.0.30.11/24
gateway 10.0.30.1
sudo reboot
On peut maintenant s'y connecter en ssh. Il est normalement possible de se connecter depuis le LAN ou depuis ADM.
sudo nano /etc/resolv.conf
nameserver 10.0.20.10
sudo systemctl status qemu-guest-agent
systemctl status fstrim.timer
sudo apt install chrony
sudo nano /etc/chrony/chrony.conf
# remplace la ligne : pool 2.debian.pool.ntp.org iburst
server 10.X.30.1 iburst
sudo systemctl restart chrony
chronyc sources -v
Vous devriez voir une ligne avec 10.X.30.1. Si vous voyez un * devant, c'est que la synchronisation est active et réussie.
On va ajouter l’entrée intranet.carlann-X.lan dans le DNS pour le faire pointer vers le serveur WEB. Pour cela ouvrir le gestionnaire DNS depuis la machine d’administration et ajoutez l’entrée (A) suivante :
intranet A 10.X.30.11
Toujours connecté en SSH sur le serveur web, on installe les éléments nécessaires pour notre plateforme Wordpress :
sudo apt update && sudo apt upgrade
sudo apt install nginx
sudo rm /etc/nginx/sites-enabled/default
cd /etc/nginx/sites-available
Attention à remplacer X par votre identificateur :
sudo nano intra.carlann-X.lan
Insérez ce cette configuration (attention au X ici aussi) :
server {
listen 80 default_server;
root /var/www/html/intra-carlann/wordpress;
index index.php;
server_name intranet.carlann-X.lan;
access_log /var/log/nginx/intra.carlann.log;
error_log /var/log/nginx/intra.carlann.log;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
X) :sudo ln -s /etc/nginx/sites-available/intra.carlann-X.lan /etc/nginx/sites-enabled/
sudo apt -y install php-fpm php-mysql
sudo apt -y install mariadb-server
sudo mariadb-secure-installation
Les réponses à donner sont dans l'ordre : Entrée, n, n, y, y, y, y.
On va créer la base de données et l’utilisateur associé ; il faut évidemment personnaliser ces éléments :
sudo mysql -u root
CREATE DATABASE carlannweb;
GRANT ALL ON carlannweb.* TO 'pascal'@'localhost' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
EXIT;
sudo mkdir /var/www/html/intra-carlann
cd /var/www/html/intra-carlann
sudo wget https://wordpress.org/latest.tar.gz
sudo tar -xvzf latest.tar.gz
sudo chown -R www-data:www-data wordpress
sudo nginx -t
Si on obtient pas ce message, il faut trouver l’erreur avant d’aller plus loin :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl restart nginx
Le serveur est désormais prêt. On se connecte sur un navigateur WEB à l’adresse http://intranet.carlann-X.lan :
Si ce n’est pas cette page de choix de la langue qui apparaît, il faut trouver l’erreur en amont et ne pas aller plus loin :
Et on procède à la configuration de Wordpress :

Installez un thème (mesmerize par exemple), puis personnalisez le site :

Dans votre documentation, faites (entre autres) un rapport de test des différents services :
sudo systemctl status nginx
sudo systemctl status mariadb
sudo systemctl status php8.4-fpm
Exemple pour php :

On va ajouter un site web à l’attention du public extérieur, qui sera accessible par l’url https://ville.carlann.fr
Attention à personnaliser
villedésormais dans ce qui suit.
On crée pour cela un block serveur supplémentaire sur nginx :
cd /etc/nginx/sites-available
sudo nano ville.carlann.fr
Insérez cette configuration (attention ligne 5):
server {
listen 80;
root /var/www/html/extranet-carlann;
index index.php index.htm index.html;
server_name ville.carlann.fr;
access_log /var/log/nginx/extranet.carlann.log;
error_log /var/log/nginx/extranet.carlann.log;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
sudo ln -s /etc/nginx/sites-available/ville.carlann.fr /etc/nginx/sites-enabled/
index.html :cd /var/www/html/
sudo mkdir extranet-carlann
sudo nano extranet-carlann/index.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Groupe CAR'LANN - L'Expertise Auto & Mobilité</title>
<style>
/* --- 1. RESET & VARIABLES --- */
:root {
--primary-color: #1a2530; /* Bleu Nuit Mécanique */
--accent-color: #e74c3c; /* Rouge Dynamique */
--light-bg: #f4f7f6;
--text-color: #333;
--white: #ffffff;
--transition: all 0.3s ease;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
line-height: 1.6;
color: var(--text-color);
background-color: var(--white);
overflow-x: hidden;
}
a { text-decoration: none; color: inherit; }
ul { list-style: none; }
/* --- 2. HEADER & NAV --- */
header {
background: rgba(255, 255, 255, 0.95);
padding: 1rem 5%;
position: fixed;
width: 100%;
top: 0;
z-index: 1000;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
font-size: 1.8rem;
font-weight: 800;
color: var(--primary-color);
letter-spacing: -1px;
}
.logo span { color: var(--accent-color); }
nav ul {
display: flex;
gap: 2rem;
}
nav a {
font-weight: 600;
font-size: 0.95rem;
text-transform: uppercase;
position: relative;
}
nav a::after {
content: '';
position: absolute;
width: 0;
height: 2px;
bottom: -5px;
left: 0;
background-color: var(--accent-color);
transition: var(--transition);
}
nav a:hover::after { width: 100%; }
/* --- 3. HERO SECTION (ANIMATED) --- */
.hero {
height: 100vh;
background: linear-gradient(135deg, rgba(26, 37, 48, 0.9), rgba(26, 37, 48, 0.7)), url('https://images.unsplash.com/photo-1486262715619-72a607e3d511?ixlib=rb-4.0.3&auto=format&fit=crop&w=1920&q=80');
background-size: cover;
background-position: center;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
color: var(--white);
padding-top: 80px;
}
.hero-content {
max-width: 800px;
padding: 2rem;
}
.hero h1 {
font-size: 3.5rem;
margin-bottom: 1rem;
line-height: 1.2;
opacity: 0;
transform: translateY(30px);
animation: fadeInUp 1s forwards 0.5s;
}
.hero p {
font-size: 1.2rem;
margin-bottom: 2rem;
opacity: 0;
transform: translateY(30px);
animation: fadeInUp 1s forwards 0.8s;
}
.btn {
display: inline-block;
padding: 12px 30px;
background-color: var(--accent-color);
color: var(--white);
border-radius: 50px;
font-weight: bold;
transition: var(--transition);
border: 2px solid var(--accent-color);
opacity: 0;
animation: fadeInUp 1s forwards 1.1s;
}
.btn:hover {
background-color: transparent;
color: var(--accent-color);
}
/* --- 4. ABOUT SECTION --- */
section {
padding: 5rem 10%;
}
.section-title {
text-align: center;
margin-bottom: 4rem;
}
.section-title h2 {
font-size: 2.5rem;
color: var(--primary-color);
margin-bottom: 1rem;
}
.section-title .line {
width: 80px;
height: 4px;
background-color: var(--accent-color);
margin: 0 auto;
}
.about-text {
text-align: center;
max-width: 800px;
margin: 0 auto;
font-size: 1.1rem;
color: #555;
}
/* --- 5. SERVICES CARDS (GRID) --- */
.services {
background-color: var(--light-bg);
}
.services-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 2rem;
}
.card {
background: var(--white);
padding: 2.5rem;
border-radius: 10px;
box-shadow: 0 5px 15px rgba(0,0,0,0.05);
transition: var(--transition);
text-align: center;
border-bottom: 4px solid transparent;
opacity: 0; /* Hidden for animation */
transform: translateY(30px);
}
.card:hover {
transform: translateY(-10px);
box-shadow: 0 15px 30px rgba(0,0,0,0.1);
border-bottom: 4px solid var(--accent-color);
}
.icon-box {
font-size: 3rem;
color: var(--accent-color);
margin-bottom: 1.5rem;
}
.card h3 {
margin-bottom: 1rem;
color: var(--primary-color);
}
/* --- 6. NEW MOBILITIES --- */
.mobility {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 4rem;
}
.mobility-content, .mobility-img {
flex: 1;
min-width: 300px;
}
.mobility-img img {
width: 100%;
border-radius: 10px;
box-shadow: 0 10px 30px rgba(0,0,0,0.15);
}
.mobility-list li {
margin-bottom: 10px;
display: flex;
align-items: center;
}
.mobility-list li::before {
content: '⚡';
margin-right: 10px;
color: var(--accent-color);
}
/* --- 7. FOOTER --- */
footer {
background-color: var(--primary-color);
color: var(--white);
text-align: center;
padding: 3rem 10%;
}
.footer-content h3 {
margin-bottom: 1rem;
font-size: 2rem;
}
.contact-info {
margin-top: 2rem;
display: flex;
justify-content: center;
gap: 2rem;
flex-wrap: wrap;
}
/* --- ANIMATION UTILS --- */
@keyframes fadeInUp {
to {
opacity: 1;
transform: translateY(0);
}
}
.reveal {
opacity: 0;
transform: translateY(50px);
transition: all 0.8s ease-out;
}
.reveal.active {
opacity: 1;
transform: translateY(0);
}
/* RESPONSIVE */
@media (max-width: 768px) {
.hero h1 { font-size: 2.5rem; }
nav { display: none; } /* Simplified for mobile demo */
.header { justify-content: center; }
}
</style>
</head>
<body>
<header>
<div class="logo">CAR’<span>LANN</span></div>
<nav>
<ul>
<li><a href="#accueil">Accueil</a></li>
<li><a href="#services">Services</a></li>
<li><a href="#mobilite">Mobilités</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
</header>
<div id="accueil" class="hero">
<div class="hero-content">
<h1>L'Expertise Automobile <br>& Nouvelles Mobilités</h1>
<p>Le réseau spécialisé dans l'entretien, les pièces détachées et les solutions de transport de demain.</p>
<a href="#contact" class="btn">Trouver un magasin</a>
</div>
</div>
<section id="about">
<div class="section-title reveal">
<h2>Qui sommes-nous ?</h2>
<div class="line"></div>
</div>
<p class="about-text reveal">
Le groupe <strong>CAR’LANN</strong> est bien plus qu'un simple réseau de magasins. Nous sommes le partenaire privilégié de votre mobilité. Que vous soyez un passionné de mécanique, un professionnel ou un usager des nouvelles mobilités urbaines, nous apportons expertise, conseil et produits de qualité.
</p>
</section>
<section id="services" class="services">
<div class="section-title reveal">
<h2>Nos Métiers</h2>
<div class="line"></div>
</div>
<div class="services-grid">
<div class="card reveal">
<div class="icon-box">🔧</div>
<h3>Entretien Auto</h3>
<p>Un service complet pour la longévité de votre véhicule : vidange, freinage, pneumatiques et diagnostic électronique.</p>
</div>
<div class="card reveal" style="transition-delay: 0.2s;">
<div class="icon-box">⚙️</div>
<h3>Pièces Détachées</h3>
<p>Un large stock de pièces techniques auto et moto. Qualité d'origine et marques premium pour toutes vos réparations.</p>
</div>
<div class="card reveal" style="transition-delay: 0.4s;">
<div class="icon-box">🧴</div>
<h3>Accessoires</h3>
<p>Produits d'entretien, équipements de confort, audio, portage et esthétique pour personnaliser votre conduite.</p>
</div>
</div>
</section>
<section id="mobilite">
<div class="mobility">
<div class="mobility-content reveal">
<h2>Nouvelles Mobilités</h2>
<div class="line" style="margin: 0 0 2rem 0;"></div>
<p>Le monde change, la route aussi. CAR’LANN vous accompagne dans la transition vers des déplacements plus écologiques et urbains.</p>
<br>
<ul class="mobility-list">
<li>Vente et réparation de trottinettes électriques</li>
<li>Vélos à assistance électrique (VAE)</li>
<li>Bornes de recharge et accessoires de sécurité</li>
<li>Conseils sur les aides et subventions</li>
</ul>
<br>
<a href="#contact" class="btn" style="opacity: 1; animation: none; background:var(--primary-color); border-color:var(--primary-color);">Découvrir la gamme</a>
</div>
<div class="mobility-img reveal">
<img src="https://images.unsplash.com/photo-1593787406536-3676a152d959?ixlib=rb-4.0.3&auto=format&fit=crop&w=1000&q=80" alt="Mobilité électrique">
</div>
</div>
</section>
<footer id="contact">
<div class="footer-content reveal">
<div class="logo" style="color: white; margin-bottom: 1rem;">CAR’<span>LANN</span></div>
<p>Rejoignez le réseau leader de l'entretien et de la mobilité.</p>
<div class="contact-info">
<div>
<strong>Siège Social</strong><br>
123 Avenue de l'Automobile<br>
75000 Paris
</div>
<div>
<strong>Contact</strong><br>
contact@groupe-carlann.fr<br>
01 23 45 67 89
</div>
</div>
<br><br>
<small>© 2024 Groupe CAR'LANN. Tous droits réservés.</small>
</div>
</footer>
<script>
// Script pour gérer l'animation au scroll (Intersection Observer)
document.addEventListener('DOMContentLoaded', function() {
const reveals = document.querySelectorAll('.reveal');
const revealOnScroll = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('active');
// Une fois animé, on peut arrêter d'observer si on veut que l'anim ne se joue qu'une fois
observer.unobserve(entry.target);
}
});
}, {
root: null,
threshold: 0.15, // L'élément doit être visible à 15% pour déclencher l'anim
rootMargin: "0px 0px -50px 0px"
});
reveals.forEach(el => {
revealOnScroll.observe(el);
});
});
// Smooth scroll pour les liens d'ancrage
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
</script>
</body>
</html>
sudo chown -R www-data:www-data extranet-carlann
sudo nginx -t
Si on obtient pas ce message, il faut trouver l’erreur avant d’aller plus loin :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl restart nginx
Il est possible à ce niveau de vérifier que le site fonctionne, mais il faut modifier localement le DNS pour résoudre
ville.carlann.fren10.X.30.11. Et alors le site est accessible (en http). Faites ce point d'étape avec votre formateur.

Le package ACME va permettre d’obtenir et de renouveler automatiquement un certificat depuis Let’s Encrypt, en délégant cette mission à pfSense, conjointement avec le package HAProxy installé juste après, qui aura en charge la gestion TLS/SSL .
Depuis l’interface de gestion webadmin de pfSense, aller sur System > Package Manager > Available packages et rechercher acme (c’est probablement le premier de la liste) :


Rendez-vous sur Services > ACME certificates > Account key et cliquez sur Add :
ville.carlann.fr)
Rendez-vous sur : Services > ACME certificates > Certificates
Cliquer sur Add
Conserver les propositions par défaut, sauf :
ville.carlann.fr)Cliquer sur save, puis issue/renew
Au bout de quelques instants, normalement, l’obtention du certificat aboutit (lignes 15 et 29) :
lille.carlann.fr
Renewing certificate
account: lille.carlann.fr
server: letsencrypt-staging-2
getCertificatePSK creating new key
/usr/local/pkg/acme/acme.sh --home '/tmp/acme/lille.carlann.fr/' --accountconf '/tmp/acme/lille.carlann.fr/accountconf.conf' --create-domain-key --domain 'lille.carlann.fr' --keylength '2048' --force --log-level 3 --log '/tmp/acme/lille.carlann.fr/acme_createdomainkey.log'
Array
(
...
[Mon Feb 2 20:28:08 CET 2026] Sleeping for 3 seconds then retrying
[Mon Feb 2 20:28:11 CET 2026] Polling order status: https://acme-staging-v02.api.letsencrypt.org/acme/order/262578773/31356507493
[Mon Feb 2 20:28:11 CET 2026] Downloading cert.
[Mon Feb 2 20:28:11 CET 2026] Le_LinkCert='https://acme-staging-v02.api.letsencrypt.org/acme/cert/2cd56a9887e7db9ae3db2203397e9a566fb7'
[Mon Feb 2 20:28:12 CET 2026] Cert success.
-----BEGIN CERTIFICATE-----
MIIFHDCCBASgAwIBAgISLNVqmIfn25rj2yIDOX6aVm+3MA0GCSqGSIb3DQEBCwUA
...
YBtQ6ZW++x8fnRjcwq/FcQ==
-----END CERTIFICATE-----
[Mon Feb 2 20:28:12 CET 2026] Your cert is in: /tmp/acme/lille.carlann.fr/lille.carlann.fr/lille.carlann.fr.cer
[Mon Feb 2 20:28:12 CET 2026] Your cert key is in: /tmp/acme/lille.carlann.fr/lille.carlann.fr/lille.carlann.fr.key
[Mon Feb 2 20:28:12 CET 2026] The intermediate CA cert is in: /tmp/acme/lille.carlann.fr/lille.carlann.fr/ca.cer
[Mon Feb 2 20:28:12 CET 2026] And the full-chain cert is in: /tmp/acme/lille.carlann.fr/lille.carlann.fr/fullchain.cer
[Mon Feb 2 20:28:12 CET 2026] Your pre-generated key for future cert key changes is in: /tmp/acme/lille.carlann.fr/lille.carlann.fr/lille.carlann.fr.key.next
[Mon Feb 2 20:28:12 CET 2026] Running reload cmd: /tmp/acme/lille.carlann.fr/reloadcmd.sh
IMPORT CERT lille.carlann.fr, /tmp/acme/lille.carlann.fr/lille.carlann.fr/lille.carlann.fr.key, /tmp/acme/lille.carlann.fr/lille.carlann.fr/lille.carlann.fr.cer
update cert![Mon Feb 2 20:28:12 CET 2026] Reload successful
bien regarder les détails pour vérifier que c’est OK
Si c’est ok, on bascule sur le serveur de production ACME pour le compte clé :

Et on renouvelle l’opération issue/renew :

Le succès doit là aussi être au rendez-vous :

...

Enfin, activer la tâche cron de renouvellement (acme > General Settings) :

On installe le module HAProxy sur pfSense, afin de lui confier plusieurs rôles :
Il travaillera en lien avec le module ACME installé juste avant.
Depuis l’interface de gestion webadmin de pfSense, aller sur System > Package Manager > Available Packages et rechercher haproxy :

Installez le package haproxy (la version stable, pas la devel) :

Rendez-vous maintenant sur Services > HAProxy > Settings :
100018800 (c’est le port d’écoute de la page web de monitoring de HAProxy) :2048Puis Save
intenant sur Services > HAProxy > Baskend, puis Add
clX-srv02 (hostname du serveur Web)10.X.30.11 (adresse IP du serveur Web)80 (port http)
Méthode pour vérifier que les serveurs sont up :

NB : il faudrait préférer http, mais parfois le fonctionnement est capricieux. Cette méthode basique est moins précise (elle vérifie que le port est joignable (niveau OSI4), pas que le serveur http répond (niveau OSI7)), mais elle conviendra.
Le frontend va accepter les connexions https (sur le port tcp/443) et opérer (centraliser) le SSL offloading, c’est-à-dire gérer la partie S de HTTPS pour l’échange de clé et le chiffrement, pour tous les serveurs que nous voudrons exposer, en l’occurrence ici uniquement le serveur Web public.

Rattacher ce frontend au backend précédemment créé, en :
https://ville.carlann.fr) pour identifier le service demandé (ville.carlann.fr) :

On active l’option forward for :

On sélectionne le certificat à utiliser pour la partie SSL (on choisit bien entendu le certificat LetsEncrypt géré par ACME) :

La configuration est prête :

Il n’y a plus qu’à l’activer :

Dans l’onglet stats, vous verrez l’état global de HAProxy :

Il reste enfin à autoriser le trafic https entrant à destination du Serveur WEB.
Il ne faut pas ici mettre en place une redirection de port (NAT) comme on le ferait habituellement, car les connexions entrante sont gérées par HAProxy, qui est sur pfSense.
La règle est donc :

Nous allons ajouter une configuration complémentaire sur cette règle pour limiter les connexions entrantes à 50 par secondes :
advanced options > Max Src connections rate : 50advanced options > Max Src connections rates : 1
HAProxy accepte désormais les connexions entrantes https, gère la couche de sécurité (SSL offloading), puis relaie la requête vers le serveur web.
Dès lors, tout ordinateur connecté sur notre WAN de labo pourra joindre votre serveur web en https, avec un certificat authentifié : https://ville.carlann.fr :

La mise en place de HAProxy sur pfSense vous permet :
On souhaite ajouter un nouveau partage appelé commun, accessible à tous les utilisateurs de l’UO Administration.
On ne peut pas associer un partage directement à une UO, il faut créer des groupes de sécurité pour cela, et respecter au mieux la règle AGDLP.


_Ressources (à créer aussi), appelée dl_srv01_commun_modif

Depuis le gestionnaire de serveur, et en s’inspirant de ce qui a été fait pour le dossier partagé admin, ajouter un nouveau partage appelé commun :


On va ensuite modifier les paramètres de sécurité pour le limiter au groupe dl_srv01_commun_modif


Depuis le gestionnaire de stratégie de groupe :

On va créer une GPO pour les utilisateurs de l’UO Administration pour créer un lecteur réseau M: connecté sur les partage Commun:




Ajoutez cette autre GPO à la racine du domaine, pour indiquer que le domaine est une zone de confiance :
Configuration utilisateur > Stratégies > Modèles d'administration > Composants Windows > Internet Explorer > Panneau de configuration Internet > Onglet SécuritéListe des attributions de sites aux zones*.carlann-0.lan1 (Le chiffre 1 correspond à la zone Intranet local).Vue d'ensemble :

Vérifiez la présence du lecteur sur une session d’un utilisateur de cette UO :

Dans les options de chaque VM sur PVE, on définit que pfSense doit démarrer automatiquement en premier, puis les autres VM après un délai de 90 secondes :



Pour chaque VM, sauf pfSense, on va valider la présence de l’agent QEMU dans les options. L’agent QEMU est installé par défaut avec Debian, et il a été monté comme service sur le serveur Windows au moment d’installer l’ISO VirtIO.
Cet agent permet à PVE de mieux interagir avec la VM, notamment pour l’extinction.

NB : il faudra éteindre et redémarrer la VM pour que l’agent soit pris en compte.
Pour pfSense, on n’installe pas l’agent car il n’est pas persistent au gré des mises à jour, et un agent absent mais activé côté PVE peut poser des problèmes.
Etablir maintenant les règles de pare-feu sur chaque interface, en fonction du cahier des charges indiqué au début du document.
On va définir préalablement quelques alias utiles.
10.X.20.10 et 10.X.20.11 (Contrôleurs de domaine)10.X.30.11 (Serveur Web)10.35.13.1 (serveurs DNS autorisés ; ici, un seul)80 et 443 (ports habituels des sites web)



tcp/22)
udp/123)udp/53)
Toujours dans l'optique des "bonnes pratiques", nous allons désactiver le service DHCP sur les interfaces DMZ et ADM, où les éléments connectés (normalement peu nombreux) sont censés disposer d'une IP fixée "en dur" et bien identifiée.
Pourquoi est-ce une bonne pratique ?
Quelques pistes pour améliorer le contexte, selon vos disponibilités :
Par défaut, l'administration de pfSense utilise le port 443. Pour utiliser HAProxy pour du trafic HTTPS de "l'intérieur", il faut déplacer le port de pfSense.
8443.https://10.X.99.1:8443.Selon une méthode encore à déterminer (double NAT, ou routage), ajouter un pfSense entre WAN et DMZ, et replacer l'actuel entre DMZ et LAN/ADM