I Root Hints di Windows Server non si aggiornano toccando il file cache.dns
. In un controller di dominio con DNS integrato in Active Directory vengono letti e replicati da oggetti AD. Qui trovi spiegazione, metodo corretto di aggiornamento e script PowerShell per allineare tutti i DC in sicurezza.
Scenario e sintomi
Un amministratore modifica a mano l’host b.root-servers.net
nella scheda Root Hints di DNS Manager, poi sostituisce %SystemRoot%\System32\DNS\cache.dns
con una versione aggiornata aspettandosi che l’elenco si sincronizzi su tutti i controller di dominio. Dopo il riavvio, però, emergono anomalie:
- I valori mostrati nella scheda Root Hints non coincidono con quelli del file
cache.dns
. - Le risposte di
nslookup
non corrispondono né al file né alla GUI. - I Root Hints sembrano propagarsi tra i DC anche se il file locale non cambia.
Questi comportamenti sono coerenti con il funzionamento del servizio DNS quando è AD‑integrated. Vediamo perché, e come intervenire correttamente.
Cosa sono i Root Hints e come vengono usati
I Root Hints sono l’elenco di name server autorevoli per la zona radice .
di Internet. Il resolver ricorsivo del DNS di Windows li usa come “ultima risorsa” per avviare la ricerca iterativa quando non esistono forwarder applicabili e non si ospita una radice locale. In pratica:
- Se è configurato un Conditional Forwarder o un Forwarder generale, le query esterne vanno lì e i Root Hints non entrano in gioco.
- Se non ci sono forwarder, o falliscono, il server parte dai Root Hints per scoprire i TLD e poi i domini successivi.
- Se esiste una zona radice
.
ospitata localmente, i Root Hints vengono ignorati (il server si considera autoritativo per la radice).
Dove stanno davvero i Root Hints in un dominio Active Directory
In un’installazione DNS integrata in Active Directory (tutte o parte delle zone “AD‑integrated”), i Root Hints non sono mantenuti primariamente nel file cache.dns
. Il ciclo reale è il seguente:
- All’avvio del servizio DNS, se il server è un DC con DNS AD‑integrated e può contattare Active Directory, i Root Hints vengono caricati dagli oggetti DNS conservati nelle application directory partitions (tipicamente
ForestDnsZones
e, per alcuni dati,DomainDnsZones
). - Le modifiche fatte via DNS Manager o via PowerShell vengono salvate in AD e quindi replicate ai DNS server enlisted in quelle partizioni.
- Il file
cache.dns
è solo un meccanismo di bootstrap usato quando AD non è disponibile all’avvio. Appena AD torna online, il contenuto effettivo dei Root Hints è quello conservato in AD, non quello del file.
Questo spiega perché, in ambienti multi‑DC, i Root Hints “si propagano” senza toccare i file locali: la replica è gestita da Active Directory sullo scope della partizione applicativa (in genere intera foresta per ForestDnsZones
). Non tutti i DC ricevono necessariamente l’oggetto: lo ricevono i DNS server iscritti alla partizione (enlisted). In pratica, però, tutti i DC che ospitano il ruolo DNS sono di norma enlistati e quindi allineati.
Perché GUI, file e nslookup non coincidono
- DNS Manager mostra ciò che è memorizzato in AD (o ciò che hai appena modificato attraverso la GUI, che è subito persistito in AD).
nslookup
interroga il server come un client; la risposta riflette lo stato runtime del resolver (inclusa eventuale cache), l’uso di forwarder e la rotazione round‑robin dei root‑server.cache.dns
riflette solo una copia su disco che può essere stata letta al bootstrap o anche non usata, se AD era disponibile: per questo può apparire “sfasata”.
Riconoscere l’ambiente e il percorso decisionale
Prima di intervenire, verifica in che scenario ti trovi e quale logica seguirà il resolver:
- Verifica se il DNS è AD‑integrated: in DNS Manager, apri le Proprietà di una zona interna; se il tipo è “Active Directory‑Integrated”, sei nel caso descritto. Da PowerShell:
Get-DnsServerZone | Select-Object ZoneName,ZoneType,IsDsIntegrated
- Verifica se esistono forwarder:
Get-DnsServerForwarder
Se presenti e funzionali, i Root Hints saranno raramente usati.
Soluzione e spiegazione dettagliata
Aspetto | Dettagli operativi |
---|---|
Dove sono memorizzati i Root Hints | In un ambiente DNS integrato in Active Directory, non risiedono nel file cache.dns : dopo l’avvio del servizio vengono caricati da oggetti DNS in AD (application partitions) e poi replicati ai DNS server enlisted. |
Ruolo del file cache.dns | Serve solo come bootstrap se AD non è contattabile all’avvio. Una volta online, qualunque modifica manuale al file viene ignorata. |
Perché GUI, file e nslookup differiscono | GUI e nslookup mostrano dati attivi (AD + cache runtime); cache.dns è una istantanea potenzialmente obsoleta. |
Metodo corretto di aggiornamento | Usare DNS Manager: Proprietà del server → scheda Root Hints → Add / Edit / Remove oppure Copy from server per importare l’elenco ufficiale. Oppure PowerShell: Get-DnsServerRootHint , Remove-DnsServerRootHint , Add-DnsServerRootHint -NameServer ... -IPAddress ... . Le modifiche sono salvate in AD e replicate automaticamente. Non toccare cache.dns . |
Verifiche consigliate | Get-DnsServerRootHint su ciascun DC per verificare che l’elenco coincida. Clear-DnsServerCache per svuotare la cache e testare le nuove voci. Resolve-DnsName -Type NS . -Server <DC> o nslookup -type=ns . <DC> per vedere i root server effettivi. |
Procedura con DNS Manager
Se preferisci l’interfaccia grafica:
- Apri DNS Manager sul DC.
- Fai clic destro sul nome del server → Properties → scheda Root Hints.
- Per ricostruire da zero:
- Seleziona tutte le voci → Remove.
- Clic su Copy from server, inserisci l’indirizzo IP (IPv4 e/o IPv6) di un root server affidabile o di un resolver che restituisce fedelmente la delega della radice, quindi conferma. La finestra si popolerà con i record NS/A/AAAA ufficiali.
- Applica e chiudi. Nessun riavvio del servizio DNS è necessario; svuota la cache se vuoi test immediati.
Procedura con PowerShell
La via più trasparente (e scriptabile) è PowerShell, modulo DnsServer
:
Ispezionare l’elenco attuale
# Sul DC locale
Get-DnsServerRootHint | Sort-Object -Property NameServer,IPAddress | Format-Table -Auto
Su un DC remoto
Get-DnsServerRootHint -ComputerName DC02
Rimuovere e ricostruire
# Rimuove tutte le voci esistenti
Get-DnsServerRootHint | Remove-DnsServerRootHint -Force
Aggiunge alcune voci di esempio (sostituisci con IPv4/IPv6 correnti)
Add-DnsServerRootHint -NameServer "a.root-servers.net" -IPAddress "198.41.0.4"
Add-DnsServerRootHint -NameServer "a.root-servers.net" -IPAddress "2001:503:ba3e::2:30"
Add-DnsServerRootHint -NameServer "b.root-servers.net" -IPAddress "199.9.14.201"
Add-DnsServerRootHint -NameServer "b.root-servers.net" -IPAddress "2001:500:200::b"
Verifica
Get-DnsServerRootHint
Suggerimento: aggiungi sia IPv4 sia IPv6 ove possibile, così il resolver potrà preferire il protocollo disponibile più efficiente nella tua rete.
Allineare tutti i DC della foresta
Se hai il modulo Active Directory disponibile, puoi testare e correggere in blocco:
Import-Module ActiveDirectory
Recupera i DC che eseguono il servizio DNS
$dcList = Get-ADDomainController -Filter | Where-Object {$.Enabled -and $*.HostName -ne $null}
Crea il set "golden" leggendo da un DC di riferimento
$ref = ($dcList | Select-Object -First 1).HostName
$gold = Get-DnsServerRootHint -ComputerName $ref | Select-Object NameServer,IPAddress
Funzione per confrontare e allineare
function Sync-RootHints {
param([string]$ComputerName, $GoldenSet)
```
$current = Get-DnsServerRootHint -ComputerName $ComputerName |
Select-Object NameServer,IPAddress
$diffAdd = Compare-Object -ReferenceObject $GoldenSet -DifferenceObject $current -Property NameServer,IPAddress -PassThru |
Where-Object {$_.SideIndicator -eq "<="}
$diffDel = Compare-Object -ReferenceObject $GoldenSet -DifferenceObject $current -Property NameServer,IPAddress -PassThru |
Where-Object {$_.SideIndicator -eq "->"}
foreach ($item in $diffDel) {
Remove-DnsServerRootHint -ComputerName $ComputerName -NameServer $item.NameServer -IPAddress $item.IPAddress -Force
}
foreach ($item in $diffAdd) {
Add-DnsServerRootHint -ComputerName $ComputerName -NameServer $item.NameServer -IPAddress $item.IPAddress
}
# Pulisci cache per test immediati
Clear-DnsServerCache -ComputerName $ComputerName -Force
```
}
foreach ($dc in $dcList) {
Sync-RootHints -ComputerName $dc.HostName -GoldenSet $gold
}
Verifiche tecniche dopo l’aggiornamento
- Convalida la lista effettiva su ogni DC:
Get-DnsServerRootHint -ComputerName DC01 | Sort-Object NameServer,IPAddress
- Esegui una query NS sulla radice contro ciascun DC:
Resolve-DnsName -Type NS . -Server DC01 Resolve-DnsName -Type NS . -Server DC02
In alternativa:nslookup -type=ns . server DC02 ls -d . # se abilitato; altrimenti solo la risposta NS
- Svuota le cache per evitare effetti di risultati precedenti:
Clear-DnsServerCache -Force # lato server ipconfig /flushdns # lato client
Replica, partizioni e ambito
Le modifiche ai Root Hints memorizzate in AD si propagano per replica tramite le application directory partitions. I punti chiave da ricordare:
- Scope: in ambienti tipici, lo scope è la partizione
ForestDnsZones
(replica a tutti i DNS server della foresta). Esistono ancheDomainDnsZones
per dati a perimetro di dominio. - Enlistment: ricevono la replica i DNS server enlisted nella partizione. Puoi elencare le partizioni dal server:
Get-DnsServerDirectoryPartition
e verificarne i server iscritti (comando variabile per versione; in genere è visibile da DNS Manager → Advanced → Change replication scope). - Forzare la replica quando serve:
repadmin /syncall /AdeP
Usalo se vuoi anticipare la propagazione tra siti AD diversi.
Errori comuni e come evitarli
- Modificare
cache.dns
pensando che si replichi: non succede in ambienti AD‑integrated; il file è ignorato a regime. - Lasciare voci non valide (IP obsoleti o duplicati): il resolver può degradare in tempi di timeout. Mantieni solo i root server ufficiali, IPv4/IPv6 corretti.
- Dimenticare i forwarder: se usi forwarder verso resolver upstream affidabili, i Root Hints verranno usati raramente; mantenerli corretti è comunque buona norma, ma non aspettarti di vederli in ogni traceroute.
- Ospitare una zona radice
.
per errore: questo spegne l’uso dei Root Hints. Controlla nelle Forward Lookup Zones che non esista la zona.
a meno che non sia una scelta intenzionale (ad esempio per ambienti isolati). - Dimenticare la cache: dopo modifiche sostanziali, svuota la cache del server per test coerenti.
- Conflitti di replica: se un DC non riceve gli aggiornamenti, verifica che sia enlistato nelle partizioni DNS e che la replica AD tra siti sia sana.
Domande frequenti
Serve riavviare il servizio DNS dopo l’aggiornamento dei Root Hints?
No. Le modifiche fatte dalla GUI o da PowerShell hanno effetto immediato. Puoi svuotare la cache per evitare risultati influenzati da risposte precedenti.
Posso importare direttamente un file “root.hints” testuale?
Windows DNS non ha un cmdlet di import diretto del formato testuale “root.hints”. Il modo supportato è Copy from server (GUI) o aggiungere con Add-DnsServerRootHint
. In scenari automatizzati usa un tuo file CSV/JSON interno con name server e indirizzi e alimenta Add-DnsServerRootHint
.
Qual è il numero “giusto” di voci da mantenere?
Mantieni tutte le voci ufficiali disponibili (sia IPv4 sia IPv6). Evita duplicati e indirizzi non più in uso. Più voci significano maggiore resilienza.
Uso i forwarder. Devo comunque curare i Root Hints?
Sì: sono un paracadute se i forwarder non rispondono o non coprono tutte le query. Tenerli sani evita interruzioni silenziose.
DNSSEC dipende dai Root Hints?
No, i Root Hints servono a raggiungere i server della radice. La convalida DNSSEC richiede configurazione a parte (trust anchor, policy). Aggiornare i Root Hints non abilita, né disabilita, DNSSEC.
Appendice pratica: script completi
Script per ricostruire i Root Hints su un singolo DC
# Ricostruisce la lista da un root server noto
param(
[string]$ComputerName = $env:COMPUTERNAME,
[string[]]$Seed = @("198.41.0.4","2001:503:ba3e::2:30") # Sostituisci/integra con seed affidabili
)
Write-Host "Rimozione voci esistenti su $ComputerName..."
Get-DnsServerRootHint -ComputerName $ComputerName | Remove-DnsServerRootHint -ComputerName $ComputerName -Force
Usa la GUI? In PowerShell non esiste 'Copy from server', quindi si ricostruisce aggiungendo coppie NS/IP note.
Aggiungi almeno A/AAAA per ciascun root server
$map = @(
@{NS="a.root-servers.net"; IPs=@("198.41.0.4","2001:503:ba3e::2:30")},
@{NS="b.root-servers.net"; IPs=@("199.9.14.201","2001:500:200::b")}
...completa con gli altri root server secondo la tua baseline
)
foreach ($entry in $map) {
foreach ($ip in $entry.IPs) {
Add-DnsServerRootHint -ComputerName $ComputerName -NameServer $entry.NS -IPAddress $ip | Out-Null
}
}
Clear-DnsServerCache -ComputerName $ComputerName -Force
Resolve-DnsName -Type NS . -Server $ComputerName
Script di confronto tra DC e report differenze
Import-Module ActiveDirectory
$dc = Get-ADDomainController -Filter * | Where-Object {$_.Enabled}
$ref = ($dc | Select-Object -First 1).HostName
$baseline = Get-DnsServerRootHint -ComputerName $ref | Select-Object NameServer,IPAddress
$report = foreach ($d in $dc) {
$list = Get-DnsServerRootHint -ComputerName $d.HostName | Select-Object NameServer,IPAddress
$diff = Compare-Object -ReferenceObject $baseline -DifferenceObject $list -Property NameServer,IPAddress
[PSCustomObject]@{
DC = $d.HostName
Differences = if ($diff) { ($diff | ForEach-Object {"$($.SideIndicator) $($.NameServer) $($_.IPAddress)"}) -join "; " } else {"OK"}
}
}
$report | Format-Table -Auto
Riepilogo operativo
- In un DC con DNS AD‑integrated, i Root Hints non si gestiscono via
cache.dns
. - Aggiorna i Root Hints tramite DNS Manager o PowerShell (
Add/Remove/Get-DnsServerRootHint
). - Le modifiche sono salvate in Active Directory e replicate ai DNS server enlistati nella partizione applicativa.
- Verifica con
Resolve-DnsName -Type NS .
eGet-DnsServerRootHint
; pulisci la cache server e, se necessario, forza la replica AD. - Evita la zona radice
.
salvo casi d’uso specifici; mantieni l’elenco completo IPv4/IPv6.
In sintesi
Nel contesto di un controller di dominio con DNS integrato in Active Directory, l’unico approccio affidabile è modificare i Root Hints tramite DNS Manager o i cmdlet PowerShell. Il file cache.dns
è un bootstrap e non deve essere usato per la manutenzione ordinaria. Una volta aggiornati i Root Hints su un DC, Active Directory provvede a distribuirli agli altri server DNS del dominio/foresta secondo lo scope di replica.