DHCP plein sur Windows Server 2019 : libérer des adresses IP et éviter l’épuisement du pool

Votre serveur DHCP Windows Server 2019 a épuisé son pool ? Voici une procédure claire pour libérer des adresses IP, rétablir les attributions et éviter la récidive — sans croire au fameux bouton « nettoyage »… qui n’existe pas côté DHCP.

Sommaire

Vue d’ensemble de la question

Un serveur DHCP Windows Server 2019 ne distribue plus d’adresses : le pool est plein. L’objectif est double : récupérer immédiatement des IP utilisables (en supprimant ce qui est réellement libérable) et mettre en place des garde‑fous pour que l’épuisement ne se reproduise pas.

Diagnostic rapide

Vérifier l’utilisation du scope

  • Console DHCPIPv4[Votre scope] ► clic droit Display Statistics (Statistiques).
  • Liste des baux : Address Leases (Baux d’adresses). Triez par Lease Expiration (Échéance) et Active (Actif).

Chercher les causes courantes

  • Durée de bail trop longue : les IP restent « retenues » trop longtemps.
  • Plage trop petite, exclusions larges ou réservations obsolètes.
  • Bad_Address (conflits), baux expirés non encore réutilisés.
  • Failover en état dégradé : restrictions liées au MCLT (Maximum Client Lead Time) et à la synchronisation.

États de bail à connaître

ÉtatSignificationImpact sur la capacitéAction
ActiveBail en cours sur un client supposé connectéConsomme une IPNe supprimez que si l’équipement est définitivement parti
ExpiredÉchéance dépassée, IP théoriquement réutilisableBloque parfois la réattribution immédiatePeut être supprimé sans risque
Bad_AddressConflit détecté (duplication d’IP sur le réseau)IP mise en quarantaine, indisponibleÀ supprimer après correction de la cause
DeclinedClient a refusé l’IP (ARP conflict)Indisponible tant que la cause perdureTraiter la cause (doublon, VLAN, VM clonée)
OfferedOffre envoyée mais pas finaliséeTemporairement réservéeAttendre ou libérer si stuck (rare)

Libérer immédiatement des IP (actions sûres)

Supprimer les baux expirés et « Bad_Address »

GUI : dans Address Leases, sélectionnez les lignes Expired / Bad_AddressDelete.
PowerShell : exemple prêt à l’emploi :

$srv   = "DHCP01"         # nom du serveur
$scope = "192.168.10.0"   # ID du scope (adresse réseau)

Get-DhcpServerv4Lease -ComputerName \$srv -ScopeId \$scope |
Where-Object { \$*.AddressState -in @('Expired','Bad\_Address') } |
ForEach-Object {
Remove-DhcpServerv4Lease -ComputerName \$srv -ScopeId \$scope -IPAddress \$*.IPAddress -Confirm:\$false
} 

Astuce : si vous devez préserver des baux Expired pour des postes critiques, filtrez par ClientId ou Hostname avant suppression.

Réconcilier la base de baux (corrige les incohérences)

GUI : clic droit sur IPv4 ou sur le scopeReconcileVerifyReconcile.
La réconciliation corrige les enregistrements fantômes et remet en phase la base avec l’état réel.

Redémarrer le service (facultatif)

net stop dhcpserver && net start dhcpserver

Important : un redémarrage n’efface pas les baux encore Active. Il ne remplace pas la suppression des Expired/Bad_Address ni la réconciliation.

Rétablir de la capacité à court terme

Raccourcir temporairement la durée de bail

Objectif : accélérer la remise en circulation des IP.

GUI : propriétés du scope ► Lease duration.
PowerShell :

Set-DhcpServerv4Scope -ScopeId $scope -LeaseDuration (New-TimeSpan -Days 1)  # 1 jour

Après retour à la normale, remontez à une valeur adaptée (voir recommandations ci‑dessous).

Étendre la plage si possible

  • Si le plan d’adressage le permet, élargissez StartRange/EndRange dans le scope.
  • Si vous devez ajouter une plage non contiguë sur le même VLAN, créez un second scope et regroupez-les en superscope (la carte réseau verra deux sous‑réseaux sur le même lien).
  • Réduisez les exclusions trop larges et supprimez ou mettez à jour les réservations obsolètes.

Forcer des renouvellements côté clients (si possible)

Sur des postes gérés, un ipconfig /release puis ipconfig /renew (ou via vos outils d’administration) peut libérer vite des IP détenues inutilement.

Prévenir la récidive : bonnes pratiques concrètes

Durées de bail : recommandations réalistes

Type d’usageDurée conseilléePourquoi
Postes filaires stables (bureaux)4–8 joursPeu de mobilité, charge minime sur le serveur
Wi‑Fi interne (mobilité modérée)24–48 hBeaucoup d’allers‑retours, recycle les IP plus vite
Réseau Invités / évènementiel8–24 hTrès volatil ; évite d’épuiser en pic d’affluence
Objets connectés / lab / VMs éphémères2–8 hTurnover élevé, réactivité maximale

Surveiller l’utilisation et alerter

# Statistiques d'un scope
Get-DhcpServerv4ScopeStatistics -ScopeId $scope

# Exemple d'alerte simple quand > 85% utilisé

\$threshold = 85
\$stats = Get-DhcpServerv4ScopeStatistics -ScopeId \$scope
\$used = \[math]::Round(100 \* (\$stats.InUse / (\$stats.InUse + \$stats.Available)), 0)
if (\$used -ge \$threshold) {
Write-Host "Alerte: scope \$scope à \$used% d'utilisation"

# Intégrez ici votre envoi de mail / webhook selon vos outils

} 

Activer une détection de conflit raisonnable

Set-DhcpServerv4 -ConflictDetectionAttempts 1

1 tentative suffit dans la majorité des cas. Au‑delà, la latence d’attribution augmente sensiblement.

Failover : ce qu’il faut réellement vérifier

  • État de la paire : communication normale, interrompue, partenaire indisponible… tout état dégradé peut limiter les attributions.
  • MCLT : il borne la marge avec laquelle un partenaire peut prolonger un bail en autonomie. En état dégradé, vous pouvez manquer d’IP alors qu’il en reste théoriquement.
  • Répliquer la configuration après modification (options, réservations, nouvelles plages) pour éviter des divergences.

GUI : dans la console DHCP, ouvrez les propriétés de la relation de failover, vérifiez l’état et lancez une resynchronisation si nécessaire. Assurez‑vous que les deux serveurs voient la même liste de scopes et qu’aucun n’est arrêté ou saturé.

DNS : ne pas confondre « nettoyage »

  • Il n’existe pas de bouton « Clean up expired leases » dans la console DHCP.
  • Le « nettoyage » (Aging/Scavenging) concerne DNS uniquement. Il purge les enregistrements périmés dans la zone DNS, sans effet direct sur la disponibilité des IP dans DHCP.

Procédure guidée : de l’urgence à la stabilisation

Étape 1 — Récupérer de l’air (10 minutes)

  1. Supprimez Expired + Bad_Address sur le scope saturé.
  2. Lancez Reconcile sur le scope.
  3. Diminuez temporairement la Lease duration (ex. 24 h sur Wi‑Fi / 1 jour sur LAN).
  4. Optionnel : redémarrez le service si la console reste incohérente.

Étape 2 — Comprendre ce qui a rempli le pool

SymptômeCause probableCorrectif
Beaucoup de Bad_AddressClonage de VM, doublons MAC, mauvais VLAN, ARP spoofCorriger l’adressage/MAC, segmenter, 1 tentative de conflit
Baux Active très anciensDurée de bail trop longue, postes rarement présentsRéduire la durée, planifier un nettoyage ciblé
Scope proche de 100 % pendant les picsPlage trop petite vs pic d’affluence (invités, formation)Étendre le scope ou ajouter un superscope pour absorber les pics
Failover « communication interrompue »Lien/pare‑feu, service arrêté, désalignement de configRétablir la communication, resynchroniser, vérifier MCLT

Étape 3 — Durcir et automatiser

  • Réserver les IP de serveurs/équipements critiques hors du pool ou via réservations.
  • Nettoyage périodique des baux Expired par tâche planifiée (script ci‑dessous).
  • Surveillance du % d’utilisation avec alerte > 80–85 %.
  • Revue trimestrielle des exclusions et des réservations.

Scripts PowerShell utiles (copier‑coller)

1) Purge ciblée des baux expirés/Bad_Address sur tous les scopes

$server = "DHCP01"

Get-DhcpServerv4Scope -ComputerName \$server | ForEach-Object {
\$scopeId = \$*.ScopeId.IPAddressToString
Get-DhcpServerv4Lease -ComputerName \$server -ScopeId \$scopeId |
Where-Object { \$*.AddressState -in @('Expired','Bad\_Address') } |
ForEach-Object {
Remove-DhcpServerv4Lease -ComputerName \$server -ScopeId \$scopeId -IPAddress $\_.IPAddress -Confirm:\$false
}
} 

2) Raccourcir les baux d’un scope pendant 48 h puis revenir à la normale

$scope = "192.168.10.0"
$normal = New-TimeSpan -Days 7
$short  = New-TimeSpan -Days 2

# Passe en mode "crise"

Set-DhcpServerv4Scope -ScopeId \$scope -LeaseDuration \$short

# ... Après résolution (exécutez de nouveau pour revenir à la normale)

# Set-DhcpServerv4Scope -ScopeId \$scope -LeaseDuration \$normal

3) Rapport rapide d’occupation pour prioriser les actions

$server = "DHCP01"
$result = Get-DhcpServerv4Scope -ComputerName $server | ForEach-Object {
  $s = Get-DhcpServerv4ScopeStatistics -ComputerName $server -ScopeId $_.ScopeId
  [PSCustomObject]@{
    Scope     = $_.ScopeId.IPAddressToString
    Name      = $_.Name
    InUse     = $s.InUse
    Available = $s.Available
    UsedPct   = [math]::Round(100 * ($s.InUse / ($s.InUse + $s.Available)), 1)
  }
} | Sort-Object UsedPct -Descending

\$result | Format-Table -AutoSize 

4) Tâche planifiée de purge quotidienne (modèle)

# Enregistrez ce script sous C:\Scripts\DhcpPurge.ps1 puis créez une tâche planifiée
# (avec un compte ayant les droits DHCP).

\$server = "DHCP01"
Get-DhcpServerv4Scope -ComputerName \$server | ForEach-Object {
\$scopeId = \$*.ScopeId.IPAddressToString
Get-DhcpServerv4Lease -ComputerName \$server -ScopeId \$scopeId |
Where-Object { \$*.AddressState -in @('Expired','Bad\_Address') } |
ForEach-Object {
Remove-DhcpServerv4Lease -ComputerName \$server -ScopeId \$scopeId -IPAddress $\_.IPAddress -Confirm:\$false
}
} 

Cas particuliers et pièges fréquents

VMs clonées / golden images

Des VM clonées avec la même adresse MAC ou des cartes virtuelles incorrectement générées entraînent des conflits (Declined / Bad_Address) qui immobilisent des IP. Vérifiez vos modèles et assurez‑vous que la génération de MAC est unique.

Équipements hors site « oubliés »

Supprimer manuellement un bail Active d’un appareil réellement parti libère l’IP, mais risque un conflit si l’appareil revient sans renouveler correctement. D’où l’intérêt d’une durée de bail adaptée et de la détection de conflit.

Réseaux invités et évènementiels

Ce sont les principaux générateurs d’épuisement. Préparez un superscope tampon pour les pics (formations, séminaires) et abaissez les baux à 8–24 h sur ces SSID.

Exclusions « de confort » trop larges

Les plages réservées « au cas où » finissent oubliées et amputent la capacité. Faites une revue trimestrielle et remettez ces IP dans le pool si elles ne sont pas réellement utilisées.

Failover « bloquant »

Une relation en communication interrompue peut empêcher un nœud d’allouer au‑delà du MCLT. Rétablissez le lien, resynchronisez, puis vérifiez que la jauge d’utilisation baisse à nouveau. Évitez les fenêtres de sauvegarde réseau qui coupent la synchronisation.

Dimensionner correctement votre pool

Un bon dimensionnement vaut mieux qu’un nettoyage perpétuel. Utilisez une approche simple :

  1. Population active maximale (en pic) × 1,2 (20 % de marge).
  2. Si hétérogène (Wi‑Fi invités + filaire), prévoyez un scope par usage ou des durées de bail différenciées.

Exemple

Site avec 220 postes filaires (stables) + 180 mobiles/visiteurs (volatils).
Pool conseillé : 400 × 1,2 = 480 IP. Si votre /24 ne suffit pas, passez en /23, ou ajoutez un second scope en superscope pour absorber les pics invités avec des baux très courts.

Check‑list « zéro panique »

  • Supprimer Expired et Bad_Address.
  • Reconcile sur le scope.
  • Durée de bail temporairement abaissée.
  • Vérifier failover & MCLT, resynchroniser.
  • Élargir le pool / ajouter un superscope si nécessaire.
  • Mettre en place la surveillance > 85 % d’occupation.

FAQ rapide

Existe‑t‑il un bouton « nettoyer les baux expirés » ?

Non. On supprime manuellement les Expired / Bad_Address ou via script. Le « nettoyage » visible dans d’autres consoles (DNS) n’a pas d’équivalent automatique dans DHCP.

Supprimer un bail Active libère‑t‑il toujours l’IP ?

Oui, immédiatement côté serveur, mais dangereux si le client revient avec l’IP en cache. Utilisez cela seulement pour des appareils définitivement sortis de l’environnement.

La réconciliation supprime‑t‑elle les baux actifs ?

Non. Elle corrige les incohérences et libère des IP tenues « à tort » par la base.

Que faire si beaucoup de Declined apparaissent ?

Traquez les doublons d’IP (réservations conflictuelles), les VMs clonées, les erreurs de VLAN ou d’ACL ARP. L’option ConflictDetectionAttempts à 1 aide, mais ne remplace pas le diagnostic réseau.

Exemples de politiques durables

  • Pools séparés par usage (bureaux / invités / IoT) avec des baux adaptés.
  • Réservations pour les équipements fixes (imprimantes, bornes Wi‑Fi) et IP statiques hors du pool.
  • Revue trimestrielle : exclusions, réservations, scopes inactifs.
  • Surveillance intégrée (script, SIEM, supervision) avec seuils et notifications.

Annexe : commandes d’inventaire utiles

# Lister les scopes
Get-DhcpServerv4Scope -ComputerName $srv | Format-Table ScopeId, Name, State -Auto

# Lister les exclusions d'un scope

Get-DhcpServerv4ExclusionRange -ComputerName \$srv -ScopeId \$scope | Format-Table StartRange, EndRange

# Lister les réservations et les baux d'un scope

Get-DhcpServerv4Reservation -ComputerName \$srv -ScopeId \$scope | Format-Table IPAddress, ClientId, Name
Get-DhcpServerv4Lease -ComputerName \$srv -ScopeId \$scope | Format-Table IPAddress, ClientId, HostName, AddressState

# Exporter la config (sauvegarde)

Export-DhcpServer -ComputerName \$srv -Leases -File "C:\Backup\dhcp-\$(\$srv)-\$(Get-Date -Format yyyyMMdd).xml" 

En résumé

Pour un DHCP plein, la recette est simple : supprimez les baux réellement libérables (Expired / Bad_Address), réconciliez, réduisez temporairement la durée des baux, redimensionnez (ou ajoutez un superscope) et surveillez l’occupation avec alerte. En prévention, adaptez les durées de bail à la volatilité des usages, traquez les causes de conflit et gardez vos exclusions et réservations sous contrôle. Avec ces gestes, la distribution d’IP redémarre vite et l’épuisement du pool devient un incident rare.


Réponse & solutions (récapitulatif compact)

Diagnostic rapide

  1. Statistiques du scope pour mesurer l’occupation.
  2. Liste des baux triée par échéance et état.
  3. Causes : bail trop long, plage insuffisante, exclusions/réservations, Bad_Address, failover/MCLT.

Libérer immédiatement

  1. Supprimer Expired & Bad_Address (GUI/PowerShell).
  2. Reconcile sur le scope.
  3. Redémarrage du service (facultatif).

Capacité à court terme

  1. Raccourcir les baux (temporairement).
  2. Étendre la plage / ajouter un superscope.
  3. Réduire les exclusions ; nettoyer les réservations obsolètes.

Prévenir la récidive

  • Durées de bail adaptées par usage.
  • Surveillance du % d’utilisation (alerte dès 85 %).
  • Détection de conflit à 1 tentative.
  • Failover en santé (synchronisation + MCLT maîtrisé).
  • DNS : le nettoyage est indépendant du DHCP.

Informations complémentaires utiles

  • Les baux Expired sont réutilisables mais peuvent rester listés ; la suppression accélère la remise en circulation sans risque.
  • Les entrées Bad_Address doivent être supprimées après avoir éliminé la cause (conflit réel). Sinon, elles réapparaîtront.
  • Réservez les IP critiques hors du pool dynamique pour éviter d’épuiser la plage par inadvertance.

Compatible avec Windows Server 2016/2019/2022 ; noms exacts des menus susceptibles de varier selon la langue et les mises à jour.

Sommaire