Quando una zona DNS resta bloccata, le modifiche non si propagano e la risoluzione dei nomi diventa imprevedibile. Questa guida pratica spiega come riconoscere un zone lock su Windows DNS Server, individuarne la causa e rilasciarlo in sicurezza con procedure collaudate.
Che cos’è un zone lock nel DNS
Con zone lock si indica lo stato in cui una zona DNS è trattenuta in modalità di scrittura da un processo o da una condizione operativa (ad esempio, un trasferimento verso un secondario o la firma DNSSEC). Finché il lock rimane attivo, le modifiche non vengono commit‑tate nel file di zona o nello store Active Directory, né replicate ad altri server autoritativi. Il risultato sono ritardi nell’aggiornamento dei record, errori temporanei e, nei casi peggiori, inconsistenze tra server primari e secondari.
Segnali che indicano un zone lock
- Modifiche apportate in DNS Manager o via PowerShell che non compaiono nel file
.dns
o non si propagano agli altri server. - Messaggi nei log del servizio del tipo “Zone write lock held”, “I/O error writing zone file”, “transfer pending”.
- Trasferimenti di zona che restano in stato in progress o non partono verso i secondari autorizzati.
- Zone firmate DNSSEC con rigenerazione firme in corso che ritarda la scrittura.
- Eventuali timeout delle console di gestione o script che eseguono aggiornamenti dinamici concorrenti (DHCP, join di macchine, automazioni CI/CD).
Cause tipiche del blocco
- Trasferimenti di zona bloccati da filtri, da secondari non raggiungibili o policy troppo restrittive.
- Permessi insufficienti sul file di zona (
%systemroot%\System32\DNS\*.dns
) o, per le zone integrate in AD, ACL non corrette sul contenitoreCN=MicrosoftDNS
. - Proprietà della zona impostate a sola lettura o configurazione come Stub quando servirebbero aggiornamenti dinamici.
- Processi terzi (backup, antivirus, indicizzazione) che mantengono un handle aperto sul file di zona.
- DNSSEC con Just‑In‑Time write lock durante la rigenerazione delle firme.
- Record duplicati o in conflitto aggiornati simultaneamente, spesso originati da DHCP o da automazioni che non serializzano le modifiche.
- Corruzione del file di zona o metadati incoerenti nello store AD per la zona.
Procedura consigliata
La tabella seguente sintetizza i controlli chiave e il motivo per cui sono utili. Nei paragrafi successivi trovi i dettagli operativi e i comandi.
Passo | Cosa verificare/fare | Perché è utile |
---|---|---|
Consultare i log del servizio DNS | Event Viewer → Applications and Services Logs → Microsoft → Windows → DNS‑Server (oppure PowerShell Get‑WinEvent ). | Messaggi come “Zone write lock held” o errori di I/O rivelano quale processo o condizione mantiene il lock. |
Controllare le impostazioni di trasferimento di zona | In DNS Manager: Proprietà zona → Zone Transfers; in PowerShell: Get‑DnsServerZoneTransferPolicy . | Policy troppo restrittive o secondari irraggiungibili fanno rimanere la zona in lock finché il trasferimento non riesce. |
Esaminare le proprietà della zona | Get‑DnsServerZone -Name "contoso.com" ; controllare IsReadOnly , IsDsIntegrated , ZoneType , IsSigned . | Opzioni come sola lettura, tipo Stub o mancato supporto agli aggiornamenti dinamici impediscono le modifiche. |
Verificare permessi NTFS e ACL di sicurezza | Cartella %systemroot%\System32\DNS (file .dns ) o, per AD‑integrated, permessi sul contenitore CN=MicrosoftDNS . | Permessi senza Modify per l’account del servizio DNS impediscono la scrittura e tengono il lock aperto. |
Riavviare il servizio DNS | Restart‑Service DNS o via Services.msc. | Rilascia handle di file rimasti aperti o stati di lock non chiusi correttamente. |
Cercare record in conflitto o duplicati | In DNS Manager ordina per nome; con PowerShell usa Get‑DnsServerResourceRecord e raggruppa per HostName . | Aggiornamenti simultanei di record duplicati generano lock per concorrenza. |
Usare strumenti aggiuntivi | dnscmd /ZoneInfo , repadmin /showrepl , dcdiag /test:DNS . | Mostrano ZoneIsLocked, latenza di replica AD e altri indizi strutturali. |
Analisi dettagliata e comandi
Consultare i log del servizio DNS
La diagnosi parte sempre dai log. Oltre a System e Application, verifica il canale specifico del DNS:
$zone = "contoso.com"
Ricerca di eventi pertinenti nel canale DNS-Server
Get-WinEvent -LogName "Microsoft-Windows-DNS-Server/Operational" -MaxEvents 500 |
Where-Object { $.Message -match $zone -and $.Message -match "lock|write|transfer|I/O|sign" } |
Select-Object TimeCreated, Id, LevelDisplayName, Message
Se il canale Operational non è abilitato, attivalo da Event Viewer o tramite wevtutil
. Eventi che menzionano “write lock”, “signing”, “zone file write” o errori di I/O sono i migliori indicatori. Prendi nota di ID evento, orario e processo coinvolto (backup, antivirus, agenti EDR spesso compaiono nel messaggio o nei log di sistema).
Controllare le impostazioni di trasferimento di zona
Policy troppo rigide possono vincolare il server a completare un trasferimento prima di rilasciare la lock. Verifica IP dei secondari, firewall e finestra di invio AXFR/IXFR.
$zone = "contoso.com"
Proprietà di zona (incluso se è firmata o integrata in AD)
Get-DnsServerZone -Name $zone | Format-List Name, ZoneType, IsDsIntegrated, IsSigned, DynamicUpdate
Policy di trasferimento (server e zona)
Get-DnsServerZoneTransferPolicy
In alternativa (se disponibile per la tua versione):
Get-DnsServerZoneTransferPolicy -ZoneName $zone
Verifica dei secondari configurati
Get-DnsServerSecondaryZone | Where-Object { $_.MasterServers }
Se un secondario autorizzato è offline o irraggiungibile, il primario può restare in attesa prolungata (soprattutto con DNSSEC). Per test rapidi, riduci temporaneamente la restrizione o rimuovi l’host non raggiungibile, quindi ripristina la policy a fine intervento.
Esaminare le proprietà della zona
Controlla che la zona non sia Read‑only, non sia una Stub zone quando servono record locali e che accetti aggiornamenti dinamici se usi DHCP o strumenti di provisioning.
$zone = "contoso.com"
Get-DnsServerZone -Name $zone | Format-List *
Parametri da osservare: IsReadOnly, IsDsIntegrated, ZoneType, ReplicationScope, IsSigned, DynamicUpdate
Per una zona AD‑integrated, conferma che lo scope di replica (ForestDnsZones/DomainDnsZones) sia coerente con l’architettura dei tuoi controller di dominio. In ambienti con molti siti AD, latenza o conflitti di replica possono prolungare la finestra di lock.
Verificare permessi NTFS e ACL di sicurezza
Se la zona è file‑backed (non integrata in AD), il file .dns
deve essere scrivibile dal servizio DNS. Per le zone integrate in AD, verifica i permessi sul contenitore CN=MicrosoftDNS
nella partizione ForestDnsZones o DomainDnsZones.
# Esempio (zona file-backed)
$zoneFile = "$env:SystemRoot\System32\DNS\contoso.com.dns"
Get-Acl $zoneFile | Format-List
Esempio (AD-integrated) – richiede modulo ActiveDirectory
$searchBase = "CN=MicrosoftDNS,DC=ForestDnsZones,DC=contoso,DC=com"
Get-ADObject -LDAPFilter "(name=contoso.com)" -SearchBase $searchBase -Properties nTSecurityDescriptor |
Select-Object Name, DistinguishedName, nTSecurityDescriptor
Controlla anche che strumenti terzi (backup, agent EDR, antivirus) non abbiano un handle esclusivo sul file. Puoi usare Resource Monitor, Process Explorer o il comando openfiles
per individuare handle aperti. In molti ambienti, è consigliabile un’esclusione mirata dell’AV per la cartella DNS
dopo opportuna valutazione di sicurezza.
Riavviare il servizio DNS
Un semplice riavvio può rimuovere lock orfani lasciati da un’operazione incompleta. Procedi così:
Restart-Service -Name DNS -Force
In caso di manutenzione più profonda:
Stop-Service DNS
...eseguire verifiche su file/ACL/handle...
Start-Service DNS
Se dopo il riavvio la lock persiste e i file risultano ancora non scrivibili, è probabile un handle esterno o una corruzione del file di zona.
Cercare record in conflitto o duplicati
I conflitti tipici sono A/AAAA duplicati per lo stesso hostname con IP diversi, oppure RRset SOA/NS incoerenti. La ricerca di duplicati aiuta a far emergere lock da concorrenza.
$zone = "contoso.com"
Get-DnsServerResourceRecord -ZoneName $zone |
Group-Object -Property HostName |
Where-Object { $_.Count -gt 1 } |
Select-Object @{n="Host";e={$_.Name}}, Count
Se usi DHCP per aggiornamenti dinamici, verifica che il servizio DHCP aggiorni a nome di un account dedicato, con credenziali configurate nelle proprietà del server DHCP, così da evitare conflitti di proprietà sugli oggetti DNS.
Usare strumenti aggiuntivi
dnscmd /ZoneInfo contoso.com
repadmin /showrepl * /verbose
dcdiag /test:DNS /v
dnscmd /ZoneInfo
è utile per vedere rapidamente stato e metadati; repadmin
e dcdiag
aiutano a misurare la salute della replica AD, specialmente se la zona è AD‑integrated.
Indicazioni supplementari
Zone signing e JIT write‑lock con DNSSEC
Per le zone firmate, Windows DNS applica un Just‑In‑Time write‑lock durante la generazione/rotazione delle firme. È normale osservare un lock di durata limitata (tipicamente alcuni minuti). Se la finestra impatta i flussi di aggiornamento, valuta la riduzione della percentuale di lock:
# Esempio: riduzione della finestra (valutare attentamente in produzione)
Set-DnsServerDsSetting -ZoneWriteLockingPercent 10
Verifica:
Get-DnsServerDsSetting | Select-Object ZoneWriteLockingPercent
Usa questa leva con cautela: ridurre troppo la finestra può aumentare il rischio di firme parziali e coerenza sub‑ottimale durante il rinnovo.
Timeout di lock che non si libera
In rari casi, una corruzione del file di zona mantiene il flag di lock anche dopo il riavvio. Una procedura risolutiva tipica è:
- Mettere in manutenzione il server (interrompere aggiornamenti dinamici e cambiamenti sulla zona).
Stop-Service DNS
.- Copiare il file
.dns
in un percorso sicuro; rinominare o rimuovere l’originale. - Ricreare la zona e reimportare i record:
Add-DnsServerPrimaryZone -Name "contoso.com" -ZoneFile "contoso.com.dns" Oppure, se avevi esportato prima: dnscmd /ZoneExport contoso.com contoso.com.clean.dns e poi ripristino del file esportato
Start-Service DNS
e controlli funzionali.
Per le zone AD‑integrated, valuta l’esportazione con dnscmd /ZoneExport
, l’eliminazione e ricreazione della zona (attenzione allo scope di replica), quindi reimporta il file pulito.
Monitoraggio e prevenzione
- DNS debug logging: abilita log su porte, trasferimenti e aggiornamenti dinamici per individuare rapidamente stalli.
- Performance Monitor: imposta alert su contatori come Zone Writes/sec, Dynamic Update Received/sec, AXFR/IXFR Requests. Un plateau prolungato a zero o code in crescita è indicativo.
- Esclusioni AV mirate: previa valutazione con il team sicurezza, escludi l’accesso in tempo reale alla cartella
System32\DNS
o definisci policy che non acquisiscano lock esclusivi durante i backup. - Serializzazione degli update: se usi pipeline CI/CD o script massivi, esegui aggiornamenti in batch e con back-off per evitare picchi concorrenti.
- Replica AD sana: monitora ForestDnsZones e DomainDnsZones; ritardi eccessivi generano finestre lunghe di lock.
Runbook operativo completo
- Conferma del sintomo: una modifica non si propaga; annota la zona, l’orario e il server.
- Event Viewer: cerca eventi di lock, I/O, transfer, signing. Isola processi esterni coinvolti.
- Trasferimenti: verifica policy e raggiungibilità dei secondari; sospendi temporaneamente i secondari fuori servizio.
- Proprietà di zona: assicurati che Read‑only/Stub non blocchino gli update; conferma Dynamic Update.
- Permessi: controlla ACL su file o su
CN=MicrosoftDNS
. - Restart mirato: riavvia il servizio DNS; se necessario, ferma processi terzi con handle sul file.
- Conflitti: individua duplicati; coordina DHCP e automazioni.
- DNSSEC: se la zona è firmata, verifica che non sia in fase di re‑signing; adegua
ZoneWriteLockingPercent
con cautela. - Recovery: se la lock persiste, valuta export, ricreazione e import pulito.
- Verifica finale: test risoluzione, trasferimenti e replica AD; ripristina policy e secondari.
Script di diagnostica PowerShell
Lo script seguente riassume i controlli principali. Eseguilo da un server che ospita il ruolo DNS con privilegi amministrativi.
param(
[Parameter(Mandatory=$true)]
[string]$ZoneName
)
Write-Host "== Diagnostica zona: $ZoneName ==" -ForegroundColor Cyan
1) Eventi rilevanti
Write-Host "`n-- Eventi DNS recenti --" -ForegroundColor Yellow
try {
Get-WinEvent -LogName "Microsoft-Windows-DNS-Server/Operational" -MaxEvents 400 |
Where-Object { $.Message -match $ZoneName -and $.Message -match "lock|write|I/O|transfer|sign" } |
Select-Object TimeCreated, Id, LevelDisplayName, Message -First 20
} catch { Write-Warning "Impossibile leggere il canale Operational. Verifica che sia abilitato." }
2) Proprietà zona
Write-Host "`n-- Proprietà zona --" -ForegroundColor Yellow
$z = Get-DnsServerZone -Name $ZoneName -ErrorAction SilentlyContinue
if ($z) {
$z | Select-Object Name, ZoneType, IsDsIntegrated, IsReadOnly, IsSigned, DynamicUpdate, ReplicationScope | Format-List
} else { Write-Warning "Zona non trovata su questo server." }
3) Transfer settings
Write-Host "`n-- Policy di trasferimento (server) --" -ForegroundColor Yellow
Get-DnsServerZoneTransferPolicy | Select-Object Name, Action, ZoneScope, ClientSubnet, ServerInterface
4) Duplicati
Write-Host "`n-- Record potenzialmente duplicati --" -ForegroundColor Yellow
try {
Get-DnsServerResourceRecord -ZoneName $ZoneName |
Group-Object -Property HostName |
Where-Object { $*.Count -gt 1 } |
Select-Object @{n="Host";e={$*.Name}}, Count |
Sort-Object Count -Descending |
Select-Object -First 20
} catch { Write-Warning "Impossibile leggere i record della zona (permessi o zona non locale)." }
5) DNSSEC setting (se AD-integrated)
Write-Host "`n-- DNSSEC / Locking percent --" -ForegroundColor Yellow
try {
Get-DnsServerDsSetting | Select-Object ZoneWriteLockingPercent
} catch { Write-Verbose "Impostazioni DS non disponibili su questa macchina." }
Write-Host "`nDiagnostica completata." -ForegroundColor Green
Verifiche dopo la risoluzione
- Risoluzione interna:
nslookup host.contoso.com <IPdelserver_DNS>
, poi ripeti contro un altro server autoritativo per confermare la replica. - Trasferimenti: su un secondario, forza un Transfer from Master e verifica che l’SOA serial incrementi.
- Replica AD (se integrata):
repadmin /showrepl
per escludere code o errori. - Log puliti: assenza di nuovi eventi “write lock held” o errori I/O dopo intervento.
Buone pratiche per evitare futuri blocchi
- Finestra di manutenzione: pianifica bulk update in orari di bassa attività e limita l’accesso concorrente alla zona.
- Secondari solidi: mantieni l’elenco aggiornato e raggiungibile; rimuovi i vecchi IP dei secondari dismessi.
- DHCP ben configurato: usa un account dedicato per gli aggiornamenti DNS a nome dei client, con privilegi corretti.
- Controlli di salute periodici: automatizza lo script di diagnostica e genera un report settimanale.
- DNSSEC consapevole: quando la zona è firmata, allinea i job che scrivono in zona evitando la finestra di re‑signing.
Domande frequenti
Un secondario può causare un lock? In modo indiretto sì: se il primario tenta continuamente un trasferimento verso un secondario non raggiungibile o non autorizzato, alcune implementazioni mantengono la zona in stato di attesa, prolungando la finestra di lock.
È sicuro ridurre ZoneWriteLockingPercent
? È una leva legittima ma da usare solo se strettamente necessario e dopo test: valori troppo bassi durante la firma DNSSEC possono introdurre transitori in cui la zona non è interamente firmata.
Posso modificare una zona Stub per aggiungere record A? No. Una Stub zone replica solo SOA/NS/Glue dalla zona autoritativa e non accetta record locali; se serve aggiungere record, valuta una zona primaria o una Conditional Forwarder.
Perché dopo il riavvio il file è ancora bloccato? Se un processo esterno (backup/AV/EDR) mantiene l’handle sul file, la lock persiste. Identifica e pausa quel processo o applica un’esclusione mirata.
Checklist rapida
- Eventi “write lock”, “I/O”, “transfer”, “signing” identificati e correlati nel tempo.
- Secondari raggiungibili e policy di trasferimento corrette.
- Zona non Read‑only/Stub; aggiornamenti dinamici abilitati se necessari.
- ACL su file o su
CN=MicrosoftDNS
con permessi di Modify per il servizio. - Nessun handle di terze parti sul file di zona.
- Conflitti/duplicati eliminati; DHCP configurato con account dedicato.
- Se firmata, finestra DNSSEC considerata o
ZoneWriteLockingPercent
adeguato. - Test di risoluzione, trasferimento e replica AD superati.
Conclusioni
Un zone lock nel DNS è spesso il risultato di condizioni operative prevedibili: trasferimenti in stallo, ACL non corrette, proprietà della zona non allineate, firma DNSSEC in corso o conflitti nei record. Seguendo la sequenza di controlli proposta—log mirati, verifica delle policy di trasferimento, proprietà della zona, permessi, riavvio del servizio, analisi dei duplicati e strumenti di health check—si individua rapidamente la causa e si ripristina la propagazione regolare delle modifiche. Con monitoraggio proattivo e qualche accorgimento di configurazione, i lock diventano eventi rari e di breve durata.
Appendice: comandi utili a colpo d’occhio
# Eventi
Get-WinEvent -LogName "Microsoft-Windows-DNS-Server/Operational" -MaxEvents 200
Proprietà zona
Get-DnsServerZone -Name "contoso.com" | fl *
Transfer policy
Get-DnsServerZoneTransferPolicy
Duplicati
Get-DnsServerResourceRecord -ZoneName "contoso.com" | Group-Object HostName | ? {$_.Count -gt 1}
Permessi file-backed
Get-Acl "$env:SystemRoot\System32\DNS\contoso.com.dns"
DNSSEC lock window
Get-DnsServerDsSetting | Select ZoneWriteLockingPercent
Set-DnsServerDsSetting -ZoneWriteLockingPercent 10
Servizio
Restart-Service DNS
Strumenti
dnscmd /ZoneInfo contoso.com
repadmin /showrepl * /verbose
dcdiag /test:DNS /v
Applicando questi passaggi in modo sistematico, sarà possibile determinare se il blocco è causato da permessi, trasferimenti in stallo, conflitti di record, processi esterni o dalla firma DNSSEC, e risolverlo senza compromettere la stabilità del servizio.