
Dans un contexte de production restreint (infrastructure Core, Cloud hybride, environnement durci), le besoin de construire une couche de reverse proxy HTTPS entièrement via ligne de commande est critique. Cet article expose une solution avancée et automatisable sur Windows Server Core 2022, basée sur IIS + ARR + URL Rewrite, déployée sans GUI, avec gestion des règles dynamiques, intégration TLS automatisée, failover applicatif, monitoring JSON, et tests de montée en charge.
1. Préparer le serveur IIS avec les rôles requis
Install-WindowsFeature Web-Server, Web-WebSockets, Web-Mgmt-Console, Web-Scripting-Tools, Web-Dyn-Compression, Web-Request-Monitor, Web-Http-Redirect, Web-Filtering, Web-Custom-Logging -IncludeAllSubFeature
2. Automatiser l’installation de ARR et URL Rewrite
$urls = @{
'arr' = 'https://download.microsoft.com/download/D/9/7/D97339A0-A62F-4A28-BD85-93AA7D3D4106/requestRouter_amd64.msi'
'rewrite' = 'https://download.microsoft.com/download/5/D/D/5DD24937-CFE1-4124-BB87-EC9D91CB9A7E/rewrite_amd64_en-US.msi'
}
foreach ($key in $urls.Keys) {
Invoke-WebRequest $urls[$key] -OutFile "C:\\Temp\\$key.msi"
Start-Process msiexec.exe -ArgumentList "/i C:\\Temp\\$key.msi /quiet /norestart" -Wait
}
3. Activer les fonctionnalités ARR via PowerShell et appcmd
cd "C:\\Windows\\System32\\inetsrv"
.& "appcmd.exe" set config -section:system.webServer/proxy /enabled:"True" /preserveHostHeader:"True" /reverseRewriteHostInResponseHeaders:"False" /commit:apphost
4. Créer une règle de reverse proxy dynamique avec timeout, retry et inspection d’en-tête
Cette étape est essentielle pour que le serveur agisse en tant que proxy vers un backend HTTPS tout en préservant les informations de client via les en-têtes. Comme les éditeurs comme WordPress peuvent supprimer des balises XML sensibles (comme <rule> ou <match>), il est recommandé de les encoder.
$rule = @"
<rule name="ReverseProxy-Advanced" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^proxy\.mondomaine\.fr$" />
</conditions>
<action type="Rewrite" url="https://10.10.0.5/{R:1}" />
<serverVariables>
<set name="HTTP_X-Forwarded-For" value="{REMOTE_ADDR}" />
<set name="HTTP_X-Forwarded-Proto" value="https" />
</serverVariables>
</rule>
"@
Add-Content "C:\\inetpub\\wwwroot\\web.config" $rule
5. Configuration TLS automatisée avec Let’s Encrypt (via win-acme CLI)
Invoke-WebRequest -Uri https://github.com/win-acme/win-acme/releases/latest/download/win-acme.v2.1.22.1185.x64.trimmed.zip -OutFile wacs.zip
Expand-Archive wacs.zip -DestinationPath C:\\Tools\\win-acme -Force
C:\\Tools\\win-acme\\wacs.exe --target iis --host proxy.mondomaine.fr --email [email protected] --accepttos --installation iis --validation selfhosting --store centralssl --centralsslstore "C:\\certs" --notaskscheduler
6. Surveillance avancée et logs personnalisés au format JSON
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.applicationHost/sites/siteDefaults/logFile" -name "logFormat" -value "W3C"
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.applicationHost/sites/siteDefaults/logFile" -name "customFields" -value @{fieldName='X-Forwarded-For'; sourceName='X-Forwarded-For'; sourceType='RequestHeader'}
7. Configuration avancée de ferme backend + algorithmes de load balancing
.& "appcmd.exe" set config -section:webFarms /+"[name='backendfarm'].servers.[address='10.0.0.20']"
.& "appcmd.exe" set config -section:webFarms /+"[name='backendfarm'].servers.[address='10.0.0.21']"
.& "appcmd.exe" set config -section:webFarms /[name='backendfarm'].loadBalancing.algorithm:"LeastRequests" /commit:apphost
8. Tests fonctionnels avancés et vérification des performances
# Vérification du certificat SSL
Test-Connection proxy.mondomaine.fr -Count 2
Invoke-WebRequest https://proxy.mondomaine.fr -UseBasicParsing
# Test de latence proxy ↔ backend
Measure-Command { Invoke-WebRequest -Uri "https://proxy.mondomaine.fr/api/status" -UseBasicParsing }
# Audit des journaux IIS
Get-Content "C:\\inetpub\\logs\\LogFiles\\W3SVC1\\u_ex*.log" | Select-String "/api/"
Conclusion
Cette solution offre un déploiement complet, industrialisable et sécurisé de reverse proxy HTTPS sur Windows Server Core. Grâce à l’encodage XML dans les scripts PowerShell, même les éditeurs web restrictifs comme WordPress peuvent accueillir cette configuration avancée sans altérer le contenu critique. Une méthode idéale pour les ingénieurs systèmes souhaitant industrialiser leur proxy applicatif dans un cadre DevOps sécurisé.