Ports 110/143/1433/3306 « open » malgré Windows Defender Firewall sur Windows Server 2022 (Plesk) : causes, tests et solutions

Vous avez bloqué POP 110, IMAP 143, SQL 1433 et MySQL 3306 dans Windows Defender Firewall, mais un scan Nmap continue de les indiquer « open » ? Voici une méthode concrète et reproductible pour comprendre pourquoi et les fermer réellement sur Windows Server 2022 avec Plesk.

Sommaire

Vue d’ensemble du problème

Scénario typique : un serveur Windows Server 2022 hébergeant Plesk perd soudain ses règles de pare‑feu. Une adresse APIPA 169.254.x.x apparaît, symptôme d’un DHCP défaillant ou d’un changement d’interface. Après rétablissement des règles Plesk / Windows Defender, vous désactivez les ports non sécurisés (POP 110, IMAP 143, SQL 1433, MySQL 3306) dans l’interface graphique et même via des règles « Block ». Pourtant, Nmap affiche toujours ces ports en « open ». La question : comment s’assurer qu’ils sont vraiment fermés ?

Comprendre « open » dans Nmap vs. Windows Defender Firewall

  • Nmap « open » : une application répond au handshake (SYN/SYN‑ACK) ou à connect(). Le port écoute réellement.
  • Nmap « closed » : aucun processus n’écoute ; le système renvoie généralement un RST.
  • Nmap « filtered » : un filtre (pare‑feu, ACL, routeur) bloque ou ignore les paquets.

Point clé : Windows Defender Firewall ne filtre pas le trafic de bouclage (loopback). Si vous scannez depuis la machine elle‑même (Nmap vers 127.0.0.1 ou l’IP locale), les ports apparaîtront « open » tant qu’un service écoute, même si une règle inbound bloquerait ce trafic depuis l’extérieur. Testez toujours depuis un hôte distant pour valider l’exposition réelle.

Checklist : pourquoi ces ports restent affichés « open » ?

SymptômePourquoi Nmap voit « open »VérificationCorrection
Scan exécuté depuis le serveurLe loopback n’est pas filtré par le pare‑feuComparer un scan local et un scan depuis une autre machineValider avec un scan externe ; le local n’est pas probant
Un service écoute encoreUn processus POP/IMAP/SQL répond au handshakenetstat -abno / Get-NetTCPConnectionArrêter/désactiver le service ou restreindre son binding
Règle mal orientéeRègle outbound créée, mais trafic à bloquer est inboundVérifier Direction dans la règleCréer des règles inbound et, si besoin, outbound
Profil inadaptéLa règle s’applique à Private mais l’interface est en PublicGet-NetConnectionProfileAppliquer la règle à Any (Domain/Private/Public) ou corriger le profil
Scope limitéLa règle ne bloque que Local SubnetOnglet Scope / Get-NetFirewallAddressFilterBloquer Any adresse distante (IPv4/IPv6)
Edge traversalDes paquets traversent via NAT/EdgeChamp EdgeTraversal de la règleForcer EdgeTraversalPolicy = Block
Firewall amont autorisant/redirectUn Security Group / pare‑feu VPS publie le portComparer scan public vs. privé ; inspecter la console du cloudBloquer au niveau du SG/ACL en plus de l’hôte
Changement d’IP (APIPA 169.254.x.x)Règles liées à l’ancienne interface/IPv4 uniquementipconfig /all et liste des interfacesRétablir l’IP correcte, lier les règles à Any interface
IPv6 encore ouvertBlocage mal ciblé, service écoute sur ::netstat -ano affiche :::1433 etc.Règles couvrant v4 & v6 ; restreindre le binding
Plesk gère ses propres règlesExtension Firewall de Plesk réécrit les ACLComparer l’état avant/après application PleskDéfinir les ports en deny aussi côté Plesk
Hyper‑V / conteneurs / portproxyRedirection locale publiée sur l’externenetsh interface portproxy show allSupprimer les mappings indésirables
Règles contradictoiresUne règle Allow plus spécifique prend le dessusGet-NetFirewallRule + filtresSupprimer/désactiver l’Allow ou ajouter un Block plus spécifique

Procédure en 7 étapes pour fermer de façon certaine

1) Vérifier qui écoute vraiment

Avant de « tirer sur le pare‑feu », confirmez qu’aucune application utile ne dépend de ces ports.

netstat -abno | findstr /R ":(110|143|1433|3306)\s"
# Ou PowerShell
Get-NetTCPConnection -LocalPort 110,143,1433,3306 |
  Select-Object LocalAddress,LocalPort,State,OwningProcess |
  Sort-Object LocalPort

# Identifier le processus

Get-Process -Id  

Si un service écoute et que vous n’en avez plus besoin, désactivez‑le : c’est la fermeture la plus sûre.

# Exemples (adaptez les noms réels)
Stop-Service "MailEnable POP3"; Set-Service "MailEnable POP3" -StartupType Disabled
Stop-Service "MailEnable IMAP"; Set-Service "MailEnable IMAP" -StartupType Disabled
Stop-Service "MySQL80";        Set-Service "MySQL80"        -StartupType Disabled
Stop-Service "MSSQLSERVER";    Set-Service "MSSQLSERVER"    -StartupType Disabled

2) Créer des règles de blocage explicite (inbound & outbound)

Empêchez l’ouverture accidentelle future, même si une application reconfigure le pare‑feu.

# PowerShell moderne (recommandé)
$ports = 110,143,1433,3306
foreach ($p in $ports) {
  New-NetFirewallRule -DisplayName "BLOCK In TCP $p" `
    -Direction Inbound -Action Block -Protocol TCP -LocalPort $p `
    -Profile Any -EdgeTraversalPolicy Block
  New-NetFirewallRule -DisplayName "BLOCK Out TCP $p" `
    -Direction Outbound -Action Block -Protocol TCP -RemotePort $p `
    -Profile Any
}

# Équivalent 'netsh' (si politique, script hérité, etc.)

netsh advfirewall firewall add rule name="Block Port 110 In"  dir=in  action=block protocol=TCP localport=110
netsh advfirewall firewall add rule name="Block Port 110 Out" dir=out action=block protocol=TCP remoteport=110
netsh advfirewall firewall add rule name="Block Port 143 In"  dir=in  action=block protocol=TCP localport=143
netsh advfirewall firewall add rule name="Block Port 143 Out" dir=out action=block protocol=TCP remoteport=143
netsh advfirewall firewall add rule name="Block Port 1433 In" dir=in  action=block protocol=TCP localport=1433
netsh advfirewall firewall add rule name="Block Port 1433 Out" dir=out action=block protocol=TCP remoteport=1433
netsh advfirewall firewall add rule name="Block Port 3306 In" dir=in  action=block protocol=TCP localport=3306
netsh advfirewall firewall add rule name="Block Port 3306 Out" dir=out action=block protocol=TCP remoteport=3306 

Pour SQL Server, bloquez aussi le SQL Browser en UDP 1434 si vous ne publiez pas d’instances nommées :

New-NetFirewallRule -DisplayName "BLOCK In UDP 1434" -Direction Inbound -Action Block -Protocol UDP -LocalPort 1434 -Profile Any

3) Contrôler la priorité et la portée des règles

Une règle Allow plus spécifique (par exemple limitée à une IP, un service ou une interface) peut neutraliser un Block mal positionné. Vérifiez la pile complète :

# Règles liées aux ports cibles
Get-NetFirewallRule | Where-Object {$_.DisplayName -match '110|143(\D|$)|1433|3306'} |
  Get-NetFirewallPortFilter, Get-NetFirewallAddressFilter, Get-NetFirewallApplicationFilter |
  Format-List

# Activer l’audit si besoin (journalisation des paquets bloqués)

Set-NetFirewallProfile -All -LogAllowed True -LogBlocked True -LogMaxFileSizeKB 4096 

Assurez-vous que vos règles s’appliquent à tous les profils (Domain, Private, Public) et à toutes les adresses distantes. Désactivez ou supprimez les Allow superflus hérités de Plesk ou d’anciennes configurations.

4) Redémarrer le service pare‑feu et remettre à plat

Lors de modifications massives, forcez un rechargement propre.

Restart-Service -Name mpssvc
# Si l’état est incohérent :
netsh advfirewall reset
# ⚠️ Réimportez ensuite vos règles (sauvegardées au préalable)

5) Vérifier la couche réseau externe (VPS/Cloud/Edge)

Un Security Group ou pare‑feu amont peut publier un port indépendamment de Windows Defender. Bloquez aussi en amont. Assurez-vous que les règles Plesk (si son extension Firewall est utilisée) refusent explicitement ces ports.

6) Corriger l’adressage IP (APIPA) et le profil réseau

Une interface en 169.254.x.x signifie « pas de DHCP ». Rétablissez l’IP statique/ DHCP corrects, la passerelle et le DNS, puis contrôlez le profil réseau actif :

# Voir le profil
Get-NetConnectionProfile

# Si nécessaire, replacer l’interface en Private (exemple)

Set-NetConnectionProfile -InterfaceAlias "Ethernet" -NetworkCategory Private 

Des règles limitées à Private/Domain ne s’appliquent pas si l’interface est en Public, et inversement.

7) Valider correctement (depuis l’extérieur)

Testez depuis une autre machine, idéalement depuis Internet si votre serveur est public.

# Windows
Test-NetConnection -ComputerName <IP_publique> -Port 1433 -InformationLevel Detailed
Test-NetConnection -ComputerName <IP_publique> -Port 3306 -InformationLevel Detailed

# Nmap (depuis un hôte externe)

nmap -Pn -sS -p 110,143,1433,3306 
nmap -6 -Pn -sS -p 110,143,1433,3306   # si applicable 

Script d’automatisation « tout‑en‑un » (audit, blocage, test)

Le bloc suivant automatise l’audit, la création de règles Block, la désactivation optionnelle des services connus et une validation locale (indicative) :

# Exécuter en PowerShell en tant qu'administrateur

$Ports = 110,143,1433,3306

Write-Host "== Audit des écoutes =="
Get-NetTCPConnection -LocalPort $Ports -ErrorAction SilentlyContinue |
Select-Object LocalAddress,LocalPort,State,OwningProcess |
Sort-Object LocalPort | Format-Table -AutoSize

Write-Host "== Règles de blocage (In/Out) =="
foreach ($p in $Ports) {
if (-not (Get-NetFirewallRule -DisplayName "BLOCK In TCP $p" -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName "BLOCK In TCP $p" -Direction Inbound -Action Block -Protocol TCP -LocalPort $p -Profile Any -EdgeTraversalPolicy Block | Out-Null
}
if (-not (Get-NetFirewallRule -DisplayName "BLOCK Out TCP $p" -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName "BLOCK Out TCP $p" -Direction Outbound -Action Block -Protocol TCP -RemotePort $p -Profile Any | Out-Null
}
}

Write-Host "== Journalisation Firewall =="
Set-NetFirewallProfile -All -LogAllowed True -LogBlocked True -LogMaxFileSizeKB 8192

Write-Host "== Services (optionnel : décommentez) =="

# Stop-Service "MailEnable POP3" -ErrorAction SilentlyContinue

# Set-Service "MailEnable POP3" -StartupType Disabled

# Stop-Service "MailEnable IMAP" -ErrorAction SilentlyContinue

# Set-Service "MailEnable IMAP" -StartupType Disabled

# Stop-Service "MySQL80" -ErrorAction SilentlyContinue

# Set-Service "MySQL80" -StartupType Disabled

# Stop-Service "MSSQLSERVER" -ErrorAction SilentlyContinue

# Set-Service "MSSQLSERVER" -StartupType Disabled

Write-Host "== Vérification (locale) =="
foreach ($p in $Ports) {
try {
$r = Test-NetConnection -ComputerName 127.0.0.1 -Port $p -WarningAction SilentlyContinue
"{0}/TCP loopback Listening={1}" -f $p, $r.TcpTestSucceeded
} catch {}
}

Write-Host "== Rappel =="
Write-Host "Validez depuis un hôte distant avec Nmap ou Test-NetConnection." 

Cas particuliers Plesk (Windows)

  • POP/IMAP : Plesk s’appuie souvent sur MailEnable sous Windows. Si vous n’offrez pas de messagerie, désactivez les services IMAP/POP au niveau de Windows et dans Plesk (pour éviter une réactivation automatique).
  • MySQL/MariaDB (3306) : si la base ne doit pas être exposée, soit désactivez le service, soit limitez‑le à 127.0.0.1 (fichier my.ini, clé bind-address=127.0.0.1) et ajoutez vos règles Block.
  • SQL Server (1433) : via SQL Server Configuration Manager, désactivez Listen All et ne laissez que l’IP loopback si l’accès est strictement local. Si vous n’utilisez plus SQL, désactivez le service. Si vous gardez SQL Browser, bloquez UDP 1434 en inbound.
  • Extension Firewall Plesk : alignez la politique Plesk sur Windows Defender (mêmes ports en deny), sinon Plesk peut écraser vos ACL à la prochaine application.

IPv4, IPv6 et « ouvert ici / fermé là »

Un service peut écouter simultanément en IPv4 et IPv6 (0.0.0.0:1433 et :::1433). Si vous ne bloquez que l’un des deux, Nmap peut encore voir « open ». Les règles ci‑dessus pour TCP couvrent les deux piles ; vérifiez néanmoins le binding d’écoute dans netstat -ano.

Diagnostics avancés

  • Règles contradictoires : listez toutes les règles pertinentes : Get-NetFirewallRule | Where-Object {$_.DisplayName -match '110|143(\D|$)|1433|3306'} | Format-Table -AutoSize
  • Portproxy / redirections : netsh interface portproxy show all # Supprimer un mapping inutile netsh interface portproxy delete v4tov4 listenport=1433 listenaddress=0.0.0.0
  • Hyper‑V / conteneurs : un switch virtuel NAT peut publier des ports via WinNAT. Inspectez votre stack virtuelle si le serveur héberge des VMs/conteneurs.
  • Journal Firewall : le fichier journal (chemin défini dans les profils) permet de vérifier qu’un paquet entrant a bien été bloqué.

Plan de prévention et résilience

  • Sauvegarder vos règles après (ré)création : Export-WindowsFirewallRules -FilePath "C:\Backup\wfpol.wfw" # via MMC WF.msc # ou PowerShell (granulaire) Get-NetFirewallRule | Export-Clixml "C:\Backup\firewall_rules.xml"
  • Politique « deny first » : n’autorisez que ce qui est strictement nécessaire. Bloquez explicitement les ports sensibles (110, 143, 1433, 3306, 3389 si non utilisé, etc.).
  • Surveillance : programmez des scans depuis un hôte externe de confiance (Nmap) après chaque changement majeur (mises à jour Plesk, patchs SQL/MySQL, changement réseau).
  • Rollback rapide : conservez un snapshot/backup système et une copie hors‑machine des règles. En cas de doute, restaurer un état connu reste la voie la plus rapide.

FAQ courte

Pourquoi Nmap indique encore « open » après mes règles ?
Parce que l’application écoute toujours et que vous scannez peut‑être en local. Le pare‑feu n’intercepte pas le loopback ; testez depuis l’extérieur et arrêtez/désactivez le service si vous n’en avez plus l’usage.

Un « Block » ne devrait‑il pas gagner sur un « Allow » ?
Oui, un blocage explicite prend le pas, mais une Allow plus spécifique (par exemple ciblée service/interface) peut s’appliquer dans une autre couche. D’où l’intérêt d’un Block global sur tous profils et toutes adresses, et de retirer les Allow superflus.

Dois‑je aussi bloquer UDP 1434 ?
Si vous n’exposez pas d’instances nommées SQL, bloquez‑le pour éviter la découverte à distance.

APIPA 169.254.x.x a tout cassé ; rapport avec le pare‑feu ?
Oui : le changement d’interface/profil peut invalider vos hypothèses de portée des règles. Corrigez l’IP, le profil et réappliquez vos politiques.

Modèle d’exécution pas‑à‑pas (résumé opérationnel)

ÉtapeActionObjectif
1. Vérifier l’écoutenetstat -ano ou Get-NetTCPConnection -LocalPort 110,143,1433,3306Confirmer qu’aucun processus POP/IMAP/SQL/MySQL n’écoute
2. Règles de blocage explicitesCréer des Block In/Out pour 110, 143, 1433, 3306 (et UDP 1434)Empêcher toute (ré)ouverture, même depuis Plesk ou un setup
3. Priorité & portéeVérifier profils, scope, EdgeTraversal, Allow concurrentesS’assurer qu’aucune Allow plus spécifique ne contourne le Block
4. Redémarrer le service FirewallRestart-Service mpssvc (ou netsh advfirewall reset)Recharger une configuration propre
5. Effet de l’amontContrôler Security Groups/pare‑feux VPS & règles PleskÉviter une exposition malgré le blocage local
6. IP & profil réseauRemplacer APIPA par l’IP correcte, corriger le profilAligner la portée des règles et l’interface active
7. Validation externeTest-NetConnection / Nmap depuis une autre machineConfirmer l’état réel depuis l’extérieur

Conclusion

Si Nmap continue d’indiquer « open » sur 110/143/1433/3306 après vos réglages, ne suspectez pas d’emblée un « pare‑feu qui n’obéit pas ». Dans l’immense majorité des cas : (1) un service écoute encore, (2) le test est réalisé en loopback, (3) une règle/profil/scope est mal ciblé, ou (4) une couche réseau amont publie le port. En suivant la checklist et la procédure ci‑dessus—désactivation des services non nécessaires, règles Block explicites et globales, contrôle des profils/scope/EdgeTraversal, redémarrage du service pare‑feu, vérification des ACL amont et validation depuis l’extérieur—vous obtiendrez une fermeture certaine de ces ports sensibles.

Sommaire