DHCP Scope saturo su Windows Server 2019: diagnosi e soluzioni senza downtime

Il tuo scope DHCP su Windows Server 2019 è arrivato a zero indirizzi? In questa guida trovi un piano d’azione pratico per liberare rapidamente IP, prevenire nuove saturazioni e ristrutturare il pool senza downtime, con esempi concreti in GUI e PowerShell.

Indice

Capire il problema: quando e perché uno scope DHCP si satura

Un scope saturo è una condizione in cui il server DHCP non ha più indirizzi liberi da assegnare ai client. I sintomi tipici includono:

  • Nuovi client che non ottengono un IP (o ricevono un APIPA 169.254.x.x).
  • Eventi e log che riportano offerte fallite o rifiutate.
  • Picchi di richieste su reti Wi‑Fi, guest o BYOD, spesso legati a MAC randomizzati (smartphone/IoT) che consumano molti lease.
  • Lease troppo lunghi rispetto al turnover dei dispositivi.
  • Conflitti di indirizzo o IP statici “fuori policy”.
  • Scope ridimensionati nel tempo senza adeguare esclusioni, riserve e subnet mask.

La buona notizia è che Windows Server 2019 gestisce già la pulizia automatica: un lease scaduto torna disponibile, se il client non lo rinnova e non esistono conflitti. Se però la rete è dinamica (laboratori, open space, guest, aule, fiere, IoT) i tempi di rilascio possono non stare al passo con il churn dei dispositivi. Qui sotto trovi le azioni più efficaci, ordinate da “pronto intervento” a “progettazione”.

Checklist rapida: ripristinare l’erogazione di IP senza fermare la produzione

AzioneObiettivoDoveImpattoNote
Verificare i lease correntiCapire chi occupa gli IP e quali sono già scadutiDHCP Manager → IPv4 → <Scope> → Address LeasesNulloOrdina per Expiration e Active; identifica macchine “zombie”.
Ridurre la durata del leaseAccelerare il rientro degli IP inattiviProprietà dello scope → General → Lease durationNulloPassa da 8 giorni a 1–3 giorni nelle LAN dinamiche.
Forzare pulizia scadutiRilasciare subito gli IP marked ExpiredPowerShell o riavvio servizioBassissimoVedi comandi sotto; i lease validi restano.
Eliminare lease specificiRecuperare IP bloccati da device notiPowerShellMiratoFiltra per State, MAC o IP.
Allineare DHCP‑DNSRimuovere nomi obsoleti che ostacolano il ricicloDNS Manager / dnscmdBassoAbilita Aging/Scavenging, avvia Scavenge.
Aumentare il poolAggiungere indirizzi disponibiliRouting, VLAN, DHCPMedio/23, superscope, o nuovo scope con failover.
Prevenire sprechiRidurre “lease fantasma” e conflittiPolicy, switch, DHCP settingsMedioConflict detection, NAC, inventario IP statici.

Operazioni in DHCP Manager (GUI) che danno subito risultati

Verificare rapidamente i lease

  1. Apri dhcpmgmt.mscIPv4 → <Scope> → Address Leases.
  2. Attiva le colonne Active, Expiration, Unique ID (MAC).
  3. Ordina per Expiration e identifica:
    • Lease Expired non ancora rilasciati.
    • Lease “Active = No”.
    • Dispositivi con MAC casuali (spesso smartphone e IoT).
  4. Controlla Reservations: troppe riserve possono “ingessare” il pool.
  5. Rivedi le Exclusions: una excluderange ampia può mascherare un pool in realtà sufficiente.

Ridurre la durata del lease (senza riavviare nulla)

Nel nodo dello scope → Properties → General imposta Lease duration a 1‑3 giorni per le reti con alto turnover. I client rinnoveranno più spesso e gli IP torneranno disponibili prima. In reti stabili (server, desktop fissi) 4–7 giorni sono generalmente adeguati.

Riconciliare e “rinfrescare” lo scope

Dal nodo Address Leases puoi usare Reconcile per riallineare database e registrazioni. Se molti lease risultano già scaduti, un riavvio controllato del servizio (senza riavviare il server) libera rapidamente gli IP marcati come Expired.

# Opzione rapida (cmd)
net stop dhcpserver &amp;&amp; net start dhcpserver

PowerShell equivalente
Restart-Service -Name dhcpserver

Questo non interrompe i client che già possiedono un lease valido: continueranno a usarlo fino alla scadenza; i client in discovery riceveranno nuove offerte immediatamente dopo il riavvio del servizio.

PowerShell: kit essenziale per sbloccare e analizzare

PowerShell offre visibilità e controllo granulare. Ecco i cmdlet più utili su Windows Server 2019:

# Elenco e statistiche di utilizzo per uno scope
Get-DhcpServerv4ScopeStatistics -ScopeId 192.168.1.0

Visualizza tutti i lease di uno scope

Get-DhcpServerv4Lease -ScopeId 192.168.1.0 |
Select-Object IPAddress, ClientId, HostName, State, ExpirationTime |
Format-Table -AutoSize

Rimuove in blocco i lease già scaduti

Get-DhcpServerv4Lease -ScopeId 192.168.1.0 |
Where-Object { $\_.State -eq 'Expired' } |
Remove-DhcpServerv4Lease -Confirm:\$false

Rimuove un lease specifico per IP

Remove-DhcpServerv4Lease -ScopeId 192.168.1.0 -IPAddress 192.168.1.150 -Confirm:\$false

Riduce la durata del lease a 1 giorno (formato d.hh\:mm\:ss)

Set-DhcpServerv4Scope -ScopeId 192.168.1.0 -LeaseDuration 1.00:00:00

Trova lease duplicati per MAC (utile con MAC randomizzati)

Get-DhcpServerv4Lease -ScopeId 192.168.1.0 |
Group-Object ClientId | Where-Object { $\_.Count -gt 1 } |
Select-Object Count, Name </code></pre>

<p><strong>Suggerimento:</strong> se usi più scope, puoi iterare la riduzione del lease su tutti i pool in un colpo solo:</p>
<pre><code>Get-DhcpServerv4Scope | 
  ForEach-Object { Set-DhcpServerv4Scope -ScopeId $_.ScopeId -LeaseDuration 2.00:00:00 }
</code></pre>

<h2>Sincronizzare DHCP e DNS dinamico (DDNS)</h2>
<p>DDNS tiene allineati IP e nomi, ma record obsoleti possono intralciare il riuso degli indirizzi. Agisci su due fronti:</p>
<ol>
  <li><strong>Credenziali DHCP per aggiornamenti DNS sicuri:</strong> in <em>DHCP Manager → Server → Properties → Advanced → Credentials</em> configura un account dedicato (es. <code>svcdhcpdns</code>) per creare/eliminare record A/PTR nelle zone AD‑integrated.</li>
  <li><strong>Aging &amp; Scavenging in DNS:</strong> in <em>DNS Manager</em>, abilita l’<em>aging</em> sulle zone interessate e usa <em>Action → Scavenge Stale Resource Records</em> per ripulire i record scaduti. Se necessario, forza via CLI:
    <pre><code>dnscmd /ageallrecords      # contrassegna tutti i record per l'aging
dnscmd /startscavenging    # avvia subito lo scavenging

Nota: l’opzione “Scavenge” può essere meno evidente nelle interfacce più recenti; la CLI rimane affidabile per eseguire una pulizia immediata durante la gestione dell’emergenza.

Ampliare o ristrutturare il pool di indirizzi

Estendere la subnet (es. /24 → /23)

Quando il consumo medio è stabilmente oltre il 70–80%, valuta l’aumento degli indirizzi disponibili:

  • Coordina il cambio di subnet mask con router, firewall e VLAN.
  • Allinea Scope Options (gateway, DNS, NTP) e Reservations.
  • Evita esclusioni superflue: in un /23, rivedi le excluderange ereditate dal vecchio /24.

Aggiungere un secondo scope e configurare il failover

Il failover DHCP (introdotto da tempo in Windows Server) offre due modalità:

  • Load Balance (50/50 tipico): entrambi i server rispondono alle richieste ripartendo gli indirizzi.
  • Hot Standby: un server primario eroga, il partner subentra in caso di guasto, con una percentuale di riserva.

Esempi PowerShell:

# Load Balance su uno scope
Add-DhcpServerv4Failover -Name "LB-LAN" -ComputerName DHCP1 -PartnerServer DHCP2 `
  -ScopeId 192.168.1.0 -LoadBalancePercent 50 -MaxClientLeadTime 01:00:00

Hot Standby con riserva 5%

Add-DhcpServerv4Failover -Name "HS-LAN" -ComputerName DHCP1 -PartnerServer DHCP2 \`
-ScopeId 192.168.1.0 -Mode HotStandby -ReservePercent 5 -MaxClientLeadTime 01:00:00 </code></pre>

<h3>Superscope su una singola LAN fisica</h3>
<p>Se hai bisogno di più reti logiche nello stesso dominio di broadcast (es. 192.168.10.0/24 e 192.168.11.0/24 sulla medesima LAN), crea un <strong>superscope</strong> e associa i due scope. Attenzione a default gateway e routing: i client devono ricevere l’<em>option 003</em> coerente con la loro VLAN/segmento.</p>
<pre><code># Crea un superscope con due scope esistenti
Add-DhcpServerv4Superscope -Name "LAN-Super" -ScopeId 192.168.10.0,192.168.11.0
</code></pre>

<h2>Prevenire conflitti e sprechi</h2>
<h3>Conflict Detection Attempts</h3>
<p>Abilita 1–2 <em>Conflict Detection Attempts</em> nelle <em>Properties</em> del server DHCP (tab <em>Advanced</em>) oppure via PowerShell:</p>
<pre><code>Set-DhcpServerSetting -ConflictDetectionAttempts 2
</code></pre>
<p>Il server invia ARP prima di assegnare l’IP. <em>Trade‑off:</em> ogni tentativo aggiunge un piccolo ritardo; non superare 2 su reti con latenza elevata.</p>

<h3>Individuare IP statici fuori policy</h3>
<ul>
  <li>Confronta <em>Address Leases</em> con gli inventari CMDB e <em>Reservations</em>.</li>
  <li>Scansiona ARP sul core switch per identificare host con IP “fissi” dentro il pool dinamico.</li>
  <li>Insegna la policy: statici <em>solo</em> in range riservati e documentati.</li>
</ul>

<h3>MAC randomizzati e IoT “rumorosi”</h3>
<p>Smartphone moderni usano <strong>MAC privati</strong> per SSID, generando molti lease; access point e alcuni IoT cambiano MAC dopo ogni riavvio. Mitigazioni:</p>
<ul>
  <li>Per SSID gestiti, disabilita la randomizzazione via MDM o imposta un SSID “enterprise” con 802.1X.</li>
  <li>Riduci la durata del lease nelle WLAN ad alto churn (12–24 ore).</li>
  <li>Isola IoT in un scope dedicato con lease molto brevi.</li>
</ul>

<h2>Log, audit e manutenzione del database DHCP</h2>
<h3>Audit e log</h3>
<p>Abilita il <strong>DHCP Audit Log</strong> (in genere attivo per default) in <em>DHCP Manager → Server → Properties → General</em>. I log si trovano in <code>C:\Windows\System32\dhcp\DhcpSrvLog-*.log</code> e aiutano a scoprire:</p>
<ul>
  <li>Client che saturano il pool con richieste frequenti.</li>
  <li>Dispositivi non autorizzati.</li>
  <li>Rinnovi anomali o NACK ripetuti.</li>
</ul>
<p>Controlla anche il <em>Registro eventi</em> → <em>Applications and Services Logs → Microsoft → Windows → DHCP‑Server</em> (canali <em>Operational/Audit</em>).</p>

<h3>Backup e compattazione JET</h3>
<p>Il database DHCP (<code>dhcp.mdb</code>) è un archivio JET. Il servizio esegue backup automatici nella cartella configurata (default sotto <code>System32\dhcp\backup</code>). In ambienti molto attivi, una compattazione offline può migliorare le prestazioni:</p>
<ol>
  <li>Programma una finestra di manutenzione breve.</li>
  <li>Arresta il servizio DHCP: <code>net stop dhcpserver</code>.</li>
  <li>Vai nella cartella del database (tipicamente <code>C:\Windows\System32\dhcp</code>).</li>
  <li>Esegui:
    <pre><code>jetpack.exe dhcp.mdb tmp.mdb

Riavvia il servizio: net start dhcpserver.

Consiglio: tieni sempre un export della configurazione prima di interventi strutturali:

# Backup in chiaro della configurazione e dei lease
Export-DhcpServer -ComputerName DHCP1 -File "C:\Backup\dhcp-backup.xml" -Leases -Force

Ripristino (da usare con cautela)

Import-DhcpServer -ComputerName DHCP1 -File "C:\Backup\dhcp-backup.xml" -Leases -BackupPath "C:\Backup" -Force 

Errori comuni da evitare

  • Contare solo sui lease “Expired” nel database: se un client rimane online con IP statico o collisione ARP, l’indirizzo non tornerà disponibile finché il conflitto non è risolto.
  • Ridurre il lease a pochi minuti: aumenta il chatter DHCP, carica gli AP e non risolve i conflitti sottostanti.
  • Dimenticare le esclusioni quando si estende la subnet: vecchie excluderange possono “tagliare” il nuovo spazio.
  • Delegare a DNS non scavengiante: senza aging, nomi obsoleti complicano il troubleshooting.

Piano di intervento consigliato (T+60 minuti, T+24 ore, T+7 giorni)

Entro 60 minuti

  1. Riduci la lease duration dello scope (1–3 giorni in LAN/WLAN dinamiche).
  2. Riavvia il servizio DHCP per liberare gli Expired già marcati.
  3. Elimina con PowerShell i lease scaduti di massa o per cluster di MAC randomizzati.
  4. Verifica e riduci eventuali excluderange superflue.

Entro 24 ore

  1. Abilita o verifica DNS Aging/Scavenging, avvia uno scavenge mirato.
  2. Imposta Conflict Detection Attempts = 1–2.
  3. Segmenta le WLAN “rumorose” con lease brevi e, se possibile, SSID separati.
  4. Esegui Export-DhcpServer e pianifica backup periodici.

Entro 7 giorni

  1. Valuta estensione subnet, nuovo scope o superscope.
  2. Implementa DHCP Failover (Load Balance o Hot Standby).
  3. Allinea il piano IP: statici documentati fuori dal pool, riserve essenziali, esclusioni minimali.
  4. Monitora con job schedulati (Get-DhcpServerv4ScopeStatistics) e avvisi quando l’utilizzo supera l’80%.

Tabella operativa dettagliata

PassaggioDescrizione operativaComandi utiliNote / Varianti
Verificare i lease correntiControlla stato, scadenza, MAC e host nei Address Leases.Get-DhcpServerv4Lease -ScopeId 192.168.1.0Filtra State = Expired o Active = No per pulizia mirata.
Comprendere la pulizia automaticaIl servizio libera gli IP allo scadere del lease; se ciò non avviene, indaga conflitti o lease eccessivi.Lease predefinito 8 giorni; per LAN dinamiche 1–3 giorni è più adeguato.
Ridurre la durata del leaseApplica una durata più breve allo scope in saturazione.Set-DhcpServerv4Scope -LeaseDuration 2.00:00:00Effetto immediato senza riavviare il servizio.
Forzare la pulizia manualeElimina in blocco gli expired, quindi riavvia il servizio per riconciliare.Remove-DhcpServerv4Lease ...
Restart-Service dhcpserver
I lease validi non vengono toccati.
Eliminare lease specificiRimuovi IP bloccati da device noti (per IP o MAC).Remove-DhcpServerv4Lease -IPAddress ...Usare con cautela; preferire indirizzi già scaduti.
Sincronizzare DHCP‑DNSAbilita aging/scavenging e credenziali DHCP per DDNS sicuro.dnscmd /ageallrecords
dnscmd /startscavenging
In server recenti l’opzione è nel DNS Manager; la CLI resta disponibile.
Ampliare o ristrutturare il poolEstendi subnet, aggiungi scope con failover o crea un superscope.Add-DhcpServerv4Failover ...
Add-DhcpServerv4Superscope ...
Richiede allineamento con router/VLAN.
Prevenire conflitti e sprechiAbilita conflict detection, individua IP statici fuori policy, limita MAC randomizzati.Set-DhcpServerSetting -ConflictDetectionAttempts 2Riduce i “lease fantasma”.

Monitoraggio e alert proattivi

  • Statistiche scope: pianifica un job che esegua Get-DhcpServerv4ScopeStatistics e invii un alert e‑mail se InUse supera l’80%.
  • Contatori (PerfMon): osserva Discovers/sec, Offers/sec, Declines, picchi coincidenti con orari di ingresso/uscita.
  • IPAM (se disponibile): trend d’uso, conflitti e saturazione a colpo d’occhio.

Script d’esempio: sblocco rapido dello scope

Questo snippet riduce il lease, rimuove gli expired e produce un report sintetico:

$ScopeId = '192.168.1.0'

1) Riduci la lease duration a 2 giorni

Set-DhcpServerv4Scope -ScopeId \$ScopeId -LeaseDuration 2.00:00:00

2) Libera i lease scaduti senza prompt

Get-DhcpServerv4Lease -ScopeId \$ScopeId |
Where-Object { $\_.State -eq 'Expired' } |
Remove-DhcpServerv4Lease -Confirm:\$false

3) Riavvia il servizio per pulizia e riconciliazione

Restart-Service -Name dhcpserver

4) Report di utilizzo

Get-DhcpServerv4ScopeStatistics -ScopeId \$ScopeId 

Domande frequenti

Devo “cancellare” manualmente ogni IP inattivo? No. Il meccanismo di lease lo fa nativamente. Agisci manualmente solo in emergenza o per casi anomali (conflitti, MAC randomizzati, dispositivi fuori policy).

Ridurre il lease non sovraccarica il server? Con valori realistici (12–72 ore su WLAN dinamiche) l’impatto è trascurabile e di solito migliora l’esperienza utente.

Conviene 80/20 o Failover? Il failover nativo è preferibile: sincronizza gli stati e gestisce meglio i guasti. Lo split 80/20 è un retaggio compatibile ma meno flessibile.

Serve reinventare la rete? Non sempre. Spesso bastano lease più corti, conflict detection e pulizia DDNS. L’estensione di subnet o nuovi scope diventano necessari quando il profilo d’uso è stabilmente alto.

In sintesi

Il server DHCP non richiede di “cancellare” manualmente ogni IP inattivo: il ciclo di lease già lo fa. Se il pool risulta comunque esaurito, le azioni più efficaci sono:

  1. Ridurre la durata del lease per accelerare il riciclo.
  2. Rimuovere/forzare i lease scaduti via PowerShell o restart del servizio.
  3. Allineare DHCP‑DNS con aging/scavenging e credenziali corrette.
  4. Ampliare o ristrutturare lo scope (nuova subnet, superscope, failover).
  5. Prevenire conflitti e sprechi (IP statici, MAC randomizzati, conflict detection).

Seguendo questi passaggi il server riprenderà rapidamente a distribuire indirizzi senza tempi di fermo estesi e con una base più solida per evitare future saturazioni.


Appendice: comandi “pronti all’uso”
Riduzione lease su tutti gli scope

Get-DhcpServerv4Scope | ForEach-Object {
  Set-DhcpServerv4Scope -ScopeId $_.ScopeId -LeaseDuration 2.00:00:00
}

Pulizia lease scaduti su tutti gli scope

Get-DhcpServerv4Scope | ForEach-Object {
  Get-DhcpServerv4Lease -ScopeId $_.ScopeId |
    Where-Object { $_.State -eq 'Expired' } |
    Remove-DhcpServerv4Lease -Confirm:$false
}
Restart-Service dhcpserver

Elenco rapido degli scope con % utilizzo

Get-DhcpServerv4Scope | ForEach-Object {
  $s = Get-DhcpServerv4ScopeStatistics -ScopeId $_.ScopeId
  [PSCustomObject]@{
    Scope     = $_.ScopeId
    Pool      = "$($.StartRange)-$($.EndRange)"
    InUse     = "$($s.AddressesInUse)/$($s.ScopeSize)"
    Percent   = [math]::Round(($s.AddressesInUse*100.0)/$s.ScopeSize,2)
  }
} | Sort-Object Percent -Descending | Format-Table -AutoSize

Configurare credenziali DDNS per DHCP

$cred = Get-Credential   # utente del tipo DOMINIO\svcdhcpdns
Set-DhcpServerDnsCredential -Credential $cred

Creare failover (Load Balance) su più scope

$partner = "DHCP2"
Get-DhcpServerv4Scope | ForEach-Object {
  Add-DhcpServerv4Failover -Name ("LB-" + $_.ScopeId) `
    -PartnerServer $partner -ScopeId $_.ScopeId `
    -LoadBalancePercent 50 -MaxClientLeadTime 01:00:00
}

Nota finale sulle versioni: l’esempio si focalizza su Windows Server 2019. In Windows Server 2022 alcune voci UI relative a DNS/aging possono apparire in posizioni differenti rispetto al 2019; in ogni caso, le operazioni CLI mostrate restano applicabili e affidabili.

Indice