Root Hints vs cache.dns en Windows Server DNS (AD): guía completa para actualizar sin errores

¿Actualizaste los root hints en un controlador de dominio (DC) y ahora la pestaña de “Root Hints”, el archivo cache.dns y las respuestas de nslookup no coinciden? Tranquilo: no es un bug, es cómo funciona DNS en Windows Server con Active Directory.

Índice

Resumen del problema

Tras editar los root hints (por ejemplo, b.root-servers.net) desde DNS Manager en un DC con zonas integradas en Active Directory (AD), observas que:

  • La lista de la pestaña Root Hints muestra unas IPs,
  • el archivo C:\Windows\System32\dns\cache.dns contiene otras,
  • y nslookup devuelve respuestas diferentes (a veces IPv6, otras IPv4, o direcciones antiguas),

Incluso reiniciando el servicio DNS o el servidor, las discrepancias persisten. ¿Por qué sucede y cómo se actualizan correctamente los root hints en entornos con AD?

La idea clave

En servidores DNS Windows, el archivo cache.dns no es el “almacén vivo” de los root hints; sirve como semilla inicial. La configuración activa de root hints es un ajuste a nivel de servidor y no se replica automáticamente vía AD.

Por qué no coinciden “Root Hints”, cache.dns y nslookup

cache.dns: semilla, no almacén activo

El fichero cache.dns proporciona una lista de servidores raíz para iniciar la recursión cuando el servicio DNS carece de configuración previa. Una vez que el servidor tiene root hints definidos, cache.dns deja de ser la fuente activa. Por eso, editar cache.dns no actualiza lo que el servidor realmente usa.

Los root hints activos son un ajuste del servidor (no de la zona)

Los root hints no forman parte de una zona DNS; son una propiedad del servidor DNS. En entornos con zonas integradas en AD, esta diferencia es crítica:

  • Las zonas (integradas en AD) se replican mediante AD a otros DCs con el rol DNS.
  • Los ajustes de servidor (entre ellos, root hints y forwarders) no se replican automáticamente mediante AD.

Resultado: si actualizas los root hints en un DC, no verás el cambio en los demás a menos que los actualices también allí (manual o automáticamente vía script).

Lo que devuelve nslookup

nslookup interroga al servidor DNS en tiempo real. Las diferencias pueden deberse a:

  • Respuestas servidas desde caché con TTL aún vigente.
  • Selección de familia IP: puede resolver registros A (IPv4) o AAAA (IPv6) según orden de preferencia y disponibilidad.
  • Rutas y latencia: en consultas a servidores raíz, diferentes réplicas o IPs anunciadas por anycast pueden responder.

Por eso, comparar literalmente lo que “ves” en la pestaña con lo que responde nslookup rara vez es 1:1.

Cómo actualizar correctamente los root hints en un entorno AD-integrado

  1. Usa DNS Manager (GUI) en cada servidor DNS:
    • Abrir DNS Manager → clic derecho en el servidor → Properties → pestaña Root Hints.
    • Usa Copy from server… para importar la lista desde un servidor raíz conocido (por ejemplo, a.root-servers.net) o su IP.
    • O bien, Add/Remove para gestionar entradas manualmente.
  2. Repite la actualización en todos los DNS que deban compartir la misma lista.
    Importante: los root hints no se replican por AD. Para alinear varios DCs, usa PowerShell o dnscmd (ejemplos más abajo).
  3. Limpia la caché del servidor DNS tras el cambio:
    • En la consola: clic derecho en el servidor → Clear Cache.
    • PowerShell: Clear-DnsServerCache -Force.
  4. Reinicia el servicio DNS solo si es necesario:
    • PowerShell: Restart-Service DNS
    • CMD: net stop dns & net start dns

Verificación rápida

  • En DNS Manager (pestaña Root Hints), confirma que las IPs son las esperadas.
  • Prueba controlada con nslookup: nslookup server <IPonombredetuDNSlocal> set type=A b.root-servers.net Repite con set type=AAAA para ver IPv6, si aplica.

Tabla comparativa: qué es qué

ElementoQué representaDónde se almacenaCómo se actualiza¿Se replica por AD?
cache.dnsSemilla de root hints al arrancar sin configuración previaArchivo local (System32\dns)Editar archivo (no recomendado en AD-integrado)No
Pestaña Root HintsLista activa que usa el servidorConfiguración del servidor (persistente a nivel local)GUI / PowerShell / dnscmdNo
nslookupRespuesta en tiempo real (A/AAAA, caché, anycast)No aplica (consulta)No aplicaNo

Procedimiento detallado con GUI

  1. Abrir DNS Manager en el DC.
  2. Clic derecho sobre el servidor → Properties → pestaña Root Hints.
  3. Haz clic en Copy from server…, introduce a.root-servers.net (o su IP) y confirma. Windows consultará la lista vigente de servidores raíz y poblará las entradas automáticamente.
  4. Revisa la columna de direcciones: deberías ver tanto IPv4 como IPv6 si están disponibles.
  5. Aplica y cierra. Luego, botón derecho en el servidor → Clear Cache.
  6. Repite el proceso en cada servidor DNS que deba compartir la misma configuración.

Automatización con PowerShell

Para flotas de DCs, automatiza la actualización. Ejemplos:

Listar los root hints actuales

# En el servidor local
Get-DnsServerRootHint

En un servidor remoto

Get-DnsServerRootHint -ComputerName DNS01 

Limpiar y establecer root hints mínimos (ejemplo didáctico)

# Elimina todos los root hints (¡cuidado!)
Get-DnsServerRootHint | Remove-DnsServerRootHint -Force

Agrega uno de referencia (ejemplo IPv4; ajusta según necesites)

Add-DnsServerRootHint -NameServer "a.root-servers.net" -IPAddress "198.41.0.4"

Opcional: agrega IPv6 si procede

Add-DnsServerRootHint -NameServer "a.root-servers.net" -IPAddress "2001:503\:ba3e::2:30" 

Nota: estos valores son ilustrativos. En producción, es mejor “copiar desde servidor” o resolver dinámicamente los registros A/AAAA del root que elijas.

Actualizar desde otro servidor raíz de forma programática

# Rellena root hints a partir de lo que resuelve un servidor raíz dado
$seed = "a.root-servers.net"
$ips4 = (Resolve-DnsName $seed -Type A   -ErrorAction Stop).IPAddress
$ips6 = (Resolve-DnsName $seed -Type AAAA -ErrorAction SilentlyContinue).IPAddress

Limpia y vuelve a crear

Get-DnsServerRootHint | Remove-DnsServerRootHint -Force
\$ips4 | ForEach-Object { Add-DnsServerRootHint -NameServer \$seed -IPAddress $\_ }
\$ips6 | ForEach-Object { Add-DnsServerRootHint -NameServer \$seed -IPAddress $\_ } 

Aplicar la misma configuración a varios DCs

# Requiere módulo ActiveDirectory y WinRM habilitado
$servers = (Get-ADDomainController -Filter *).HostName
foreach ($s in $servers) {
  Invoke-Command -ComputerName $s -ScriptBlock {
    param($seed)
    $ips4 = (Resolve-DnsName $seed -Type A   -ErrorAction Stop).IPAddress
    $ips6 = (Resolve-DnsName $seed -Type AAAA -ErrorAction SilentlyContinue).IPAddress
    Get-DnsServerRootHint | Remove-DnsServerRootHint -Force
    $ips4 | ForEach-Object { Add-DnsServerRootHint -NameServer $seed -IPAddress $_ }
    $ips6 | ForEach-Object { Add-DnsServerRootHint -NameServer $seed -IPAddress $_ }
    Clear-DnsServerCache -Force
  } -ArgumentList "a.root-servers.net"
}

Cuándo tocar (o no) cache.dns

  • en servidores no integrados en AD o DNS autónomos donde el archivo actúa como fuente principal al inicio.
  • No en DCs con DNS AD-integrado: modificar cache.dns no sincronizará los root hints activos ni replicará a otros servidores.

Consideraciones adicionales y matices importantes

  • Forwarders: si tienes reenviadores configurados, el servidor puede no usar los root hints (según la casilla Use root hints if no forwarders are available). Revisa DNS Manager → Properties → Forwarders.
  • Zona “.” (root) hospedada localmente: si existe una zona raíz “.” en tu DNS, el servidor no usa root hints para la recursión estándar.
  • IPv6: si tu pila IPv6 está habilitada, verás registros AAAA y tráfico por IPv6 hacia servidores raíz que lo soporten. Esto no es inconsistencia; es preferencia de familia IP.
  • Caché y TTL: un Clear Cache evita comparar información antigua con configuración nueva. Recuerda que clientes y resolvers intermedios también cachean.
  • Registro y auditoría: usa Get-DnsServerRootHint para inventariar; conserva scripts como fuente de verdad. Evita “clickops” repetitivos en muchas máquinas.
  • Seguridad y control: no sustituyas los servidores raíz por hosts no autoritativos. Si tu política exige salida controlada, normalmente se emplean forwarders internos, no root hints modificados.

Diagnóstico paso a paso cuando “no coincide nada”

  1. Confirma si usas forwarders: Get-DnsServerForwarder Si están activos y la opción “usar root hints si no hay forwarders” está deshabilitada, tus cambios en root hints no entrarán en juego.
  2. Inspecciona la lista activa en el servidor que estás probando: Get-DnsServerRootHint | Sort-Object NameServer,IPAddress
  3. Limpia caché y repite: Clear-DnsServerCache -Force
  4. Comprueba A y AAAA por separado con nslookup: nslookup server <tuDNS> set type=A b.root-servers.net set type=AAAA b.root-servers.net
  5. Valida en otro DC: si difiere, recuerda que no hay replicación AD de estos ajustes. Aplícalos también allí.

Errores frecuentes (y cómo evitarlos)

  • Editar cache.dns pensando que cambia la lista en uso: no lo hace (en AD-integrado).
  • Esperar que AD replique los root hints: no se replican. Planifica su despliegue por script.
  • Concluir que hay fallo porque nslookup devuelve IPs distintas:
    • Pueden ser registros AAAA frente a A.
    • Puede estar respondiendo otra réplica anycast.
    • Puede ser caché con TTL no expirado.
  • Olvidar limpiar la caché del servidor tras el cambio.
  • Modificar root hints sin un motivo claro: en general, los valores por defecto de Windows son válidos y se pueden “sembrar” desde un servidor raíz conocido cuando sea necesario.

Buenas prácticas operativas

  • Infra como código: conserva un script de referencia que establezca root hints y ejecútalo en cada DNS cuando sea preciso.
  • Homogeneidad: alinea todos los DCs con el mismo conjunto (salvo excepciones justificadas por topología de red).
  • Monitorización: registra cambios y audita periódicamente con Get-DnsServerRootHint.
  • Verificación post-cambio: siempre Clear Cache y valida con nslookup o Resolve-DnsName.

FAQ

¿Puedo “forzar replicación” con AD para distribuir los root hints?
No. La replicación AD aplica a objetos de zona (datos DNS), no a la configuración server-level como root hints o forwarders. Usa PowerShell/automatización para aplicarlos en varios servidores.

¿Cuándo es adecuado tocar cache.dns?
En DNS no integrados en AD o en escenarios de recuperación donde el servidor arranca sin configuración de root hints. En DCs con DNS AD-integrado, usa la GUI o cmdlets y olvida el archivo.

¿Necesito reiniciar el servicio tras cambiar los root hints?
Normalmente no. Basta con limpiar la caché. Reinicia solo si lo requiere tu procedimiento de cambio.

¿Y si tengo reenviadores a un recursor corporativo?
Entonces tus root hints quizá nunca se usen. Confirma la casilla de “usar root hints si no hay forwarders” y ajusta según tu política.

Ejemplo de “estado deseado” (plantilla mínima)

# Definir estado deseado para root hints en el servidor local
$RootName = "a.root-servers.net"
$A    = (Resolve-DnsName $RootName -Type A).IPAddress
$AAAA = (Resolve-DnsName $RootName -Type AAAA -ErrorAction SilentlyContinue).IPAddress

Get-DnsServerRootHint | Remove-DnsServerRootHint -Force
\$A    | % { Add-DnsServerRootHint -NameServer \$RootName -IPAddress $\_ }
\$AAAA | % { Add-DnsServerRootHint -NameServer \$RootName -IPAddress $\_ }

Clear-DnsServerCache -Force 

“En una línea”

En DNS AD-integrado, actualiza siempre los root hints desde DNS Manager o PowerShell en cada servidor, limpia la caché, y no confíes en cache.dns como fuente activa — nslookup puede mostrar diferencias normales por caché e IPv4/IPv6.

Checklist final

  • ¿Has actualizado Root Hints en todos los DNS implicados?
  • ¿Has ejecutado Clear Cache después del cambio?
  • ¿Has verificado A y AAAA por separado?
  • ¿Forwarders deshabilitan el uso de root hints en tu escenario?
  • ¿Tienes un script que documente el estado deseado?

Conclusión: Las aparentes “inconsistencias” entre la pestaña Root Hints, cache.dns y nslookup se explican por el rol de cache.dns como semilla, por la naturaleza local (no replicada por AD) de los root hints y por la dinámica normal de caché/familia IP en consultas. La vía correcta es gestionar los root hints con DNS Manager o PowerShell en cada servidor, limpiar la caché y, si usas forwarders, tener claro cuándo los root hints entran en juego.

Índice