Hola, mi nombre es Pierre RICCA, soy un Ingeniero de Campo de Premier (PFE) especializado en Active Directory y scripting de PowerShell. Inicié como PFE en Microsoft Francia en noviembre de 2010. Una parte importante de mi trabajo consiste en realizar revisiones de salud, análisis de riesgos y transferir conocimiento sobre tecnologías Microsoft para nuestros clientes en Francia.
Introducción
En el trabajo de campo, los clientes constantemente solicitan consejos y practicas recomendadas sobre cómo optimizar la resolución de nombres de DNS y, aun cuando la topología de DNS de cada cliente es única, existen algunas recomendaciones generales.
Probablemente sepan que es posible almacenar las zonas de DNS en una instancia de Active Directory si instalan el servidor de DNS en un Controlador de Dominio. Almacenar las zonas de DNS en Active Directory tiene múltiples beneficios: puede tomarse ventaja de la replicación de Active Directory y también permite tener múltiples servidores DNS “maestros” (SOA) para la misma zona de DNS.
Con algunos clientes he visto ambientes en los cuales una sola zona de DNS almacena todos los registros de DNS del forest. El ambiente del cliente está compuesto por un dominio raíz llamado “contoso.com” y algunos dominios hijo llamados “child1.contoso.com”, “child2.contoso.com”, “child3.contoso.com” y “child4.contoso.com”.
Esta imagen muestra como se ve este ambiente en la consola de administración de DNS:
Como pueden ver en el ejemplo, solo existe una zona “forward lookup” (contoso.com), en la cual, cada dominio hijo tiene su sub espacio de nombres para esa zona. Este tipo de configuración típicamente aparecerá si no se instala el rol de “DNS server” antes de ejecutar el DCPROMO para la creación de un nuevo dominio hijo. Notarán que el sub espacio de nombres “_MSDCS” también está almacenado en la zona de DNS padre.
Esta configuración tiene una desventaja principal: Si se instala un DNS server en un dominio hijo, no es posible seleccionar que se almacenen solo los registros específicos para ese dominio hijo, solo será posible almacenar la zona “contoso.com” completa, afectando el desempeño de la replicación de Directorio Activo así como el tamaño de la base de datos.
Para este tipo de ambientes, la mayoría de las veces recomendamos dividir los registros de DNS para cada dominio hijo en zonas de DNS separadas y usar una delegación en la zona de DNS del dominio raíz para cada una de las zonas hijo. La siguiente imagen muestra un ejemplo de la configuración recomendada.
Este artículo presentará una solución para dividir la gran zona del dominio “contoso.com” un sub zonas de DNS específicas para cada dominio hijo.
Historia de la división de zonas de DNS
A partir de Windows Server 2003, cuando se inicia la instalación de un nuevo bosque de Directorio Activo, DCPROMO creara dos zonas de DNS separadas, una llamada "_MSDCS.tudominio.com" y otra llamada "tudominio.com". Aquí hay un ejemplo de mi dominio “dom2k3.com”:
Este comportamiento permite tener diferentes ámbitos de replicación para las diferentes zonas de DNS. Por default, la zona “_MSDCS” del dominio raíz debe ser replicada a “All DNS servers in the Active Directory forest”, mientras que la zona de DNS del dominio debe ser replicada solo a “All DNS servers in the Active Directory domain”. Se pueden revisar y modificar estas opciones en el tab “General” de las propiedades de la zona:
Cuando el bosque se crea en Windows 2000 Server, DCPROMO no separa la zona “_MSDCS” de la zona del dominio raíz y esta zona se almacena directamente en la zona del dominio raíz. Para separar la zona “_MSDCS” y emular el comportamiento por default de “Windows Server 2003”, se debe realizar la división de las zonas de forma manual. El proceso de separación se detalla en el artículo técnico: “How to reconfigure a _MSDCS subdomain to a forest-wide DNS application directory partition when you upgrade from Windows 2000 to Windows Server 2003” http://support.microsoft.com/kb/817470/en-us.
La migración de los registros de DNS del dominio hijo
El artículo técnico mencionado anteriormente (KB 817470) sugiere dividir la zona “_MSDCS” mediante la creación de una nueva zona de DNS “_MSDCS” vacía, después de lo cual se debe forzar a cada controlador de dominio a registrarse en DNS dentro de la nueva zona.
Desafortunadamente, dicho procedimiento no puede ser utilizado en el escenario que hemos planteado, debido a que necesitamos migrar todos los registros existentes de los dominios hijo (incluyendo los registros estáticos), a una nueva zona de DNS dedicada al dominio hijo. En nuestro escenario, cada dominio hijo ha estado corriendo en producción por unos cuantos años y cuenta con unos cuantos miles de registros de DNS para cada dominio hijo. Una recreación manual de estos registros de DNS sería muy complicada y se llevaría mucho tiempo. La única solución que nos queda es utilizar un script!
He aquí el método que utilizamos.
Por favor tomen en cuenta que los scripts presentados en este artículo se proveen como ejemplo y no tienen soporte de parte de Microsoft. Antes de aplicar esta solución, asegúrense de respaldar sus zonas de DNS y estar preparados para hacer una recuperación de las zonas en caso de que suceda algo inesperado. En mi experiencia, esta solución puede tomar unas cuantas horas de principio a fin. Recomiendo encarecidamente aplicar esta solución fuera de horario de trabajo. El proceso automático de registros en DNS no estará disponible durante el tiempo que tome la migración de zonas.
Paso 1: Exportar la zona de DNS.
En primer lugar, necesitamos exportar la zona de DNS actual hacia un archivo. Afortunadamente, el comando “DNSCMD” permite realizar esta tarea. A continuación hay un ejemplo de cómo hacerlo:
Dnscmd /zoneexport contoso.com export.dns
Este commando va a crear un archive llamado “export.dns” debajo de la ruta “%SYSTEMROOT%\DNS\” (por ejemplo: “C:\Windows\system32\dns\export.dns”).
Paso 2: Crear un archivo de DNS específico para cada dominio hijo.
Ahora necesitamos dividir nuestro archivo plano “export.dns” en archivos específicos para cada dominio hijo, también es necesario exportar los registros de DNS de los dominios hijo hacia el archivo correspondiente.
Aquí hay un ejemplo del contenido del archivo “export.dns”:
…
MyComputer1234.child1 [AGE:3606209] 1200 A 172.2.3.4
MyComputer5678 [AGE:1782367] 1200 A 172.5.6.7
MyComputer90AB.child2 [AGE:2457912] 1200 A 172.9.0.1
MyComputerCDEF.child2 [AGE:1982627] 1200 A 172.10.11.12
…
Debemos analizar el archivo “export.dns” a fin de filtrar los registros de DNS correspondientes a los dominios hijo y crear un nuevo archivo de DNS específico para cada dominio hijo.
En el ejemplo anterior, deberíamos extraer la siguiente información para el dominio “child1.dns”:
…
MyComputer1234 [AGE:3606209] 1200 A 172.2.3.4
…
Deberíamos extraer la siguiente información para el dominio “child2.dns”:
…
MyComputer90AB [AGE:2457912] 1200 A 172.9.0.1
MyComputerCDEF [AGE:1982627] 1200 A 172.10.11.12
…
Noten que el registro “MyComputer1234.child1” del archivo “export.dns” debe ser convertido a “MyComputer” (sin “.child1”) cuando sea copiado hacia el archivo “child1.dns” (y lo mismo se debe tener en cuenta para los registros en child2). Noten también que el registro “MyComputer5678” del archivo “export.dns” es un registro presente directamente en el dominio raíz “contoso.com” y no debe ser copiado hacia ningún archivo de DNS de los dominios hijo.
He creado un script de ejemplo que puede extraer y convertir automáticamente dichos registros de DNS y exportar el resultado en los archivos “child.dns”. Por favor tomen en cuenta que este script es provisto como ejemplo y no tiene soporte de parte de Microsoft. Aquí hay un ejemplo de cómo usarlo:
.\Extract-DNSZone.PS1 -inputFile “C:\Scripts\export.dns” -outputFile “C:\Scripts\child1.contoso.com.ns” -extractZoneName "child1"
Pueden repetir esta operación para cada dominio hijo.
Paso 3: Importar las zonas de DNS de los dominios hijo
Ahora deberíamos tener un archivo de DNS específico para cada zona de cada dominio hijo (generada en el paso previo).
Es necesario importar estos archivos de los dominios “hijo” al servidor DNS. Primero hay que copiar dichos archivos al folder “%SYSTEMROOT%\DNS\” (por ejemplo: “C:\Windows\system32\dns\”).
Entonces hay que abrir la consola de administración de DNS. Dar clic derecho en “Forward Lookup Zones” y seleccionar “New Zone…”.
Dar clic en “Next”, después seleccionar “Primary zone” y asegurarse de que la opción “Store the zone in Active Directory” no este seleccionada (porque queremos cargar la zona desde un archivo) y dar clic en “Next”.
Introducir el nombre de la zona correspondiente al dominio hijo que vamos a importar (por ejemplo: child1.contoso.com) y dar clic en “Next”.
Seleccionar la opción “Use this existing file” y verificar que el nombre corresponda al nombre del archive de DNS del dominio hijo que vamos a importar, después de lo cual, dar clic en “Next”.
Seleccionar “Do not allow dynamic updates” (no queremos permitir las actualizaciones dinámicas mientras nuestro proceso de migración no haya terminado) después dar clic en “Next” y luego dar clic en “Finish”. Las actualizaciones dinámicas pueden habilitarse al final del proceso de migración de nuestras zonas de DNS.
Es necesario repetir esta operación para cada uno de los dominios hijo. Ahora, desde la consola de administración de DNS, deberían verse el dominio raíz y los dominios hijo con zonas de DNS independientes.
Paso 4: Replicar las zonas de DNS de los dominios hijo hacia todos los servidores de DNS en el bosque
En este paso, vamos a habilitar la replicación de las zonas de DNS de los dominios hijo hacia todos los servidores de DNS en el bosque. El alcance de replicación de cada zona se puede cambiar a “domain wide” al final del proceso de migración de nuestras zonas de DNS.
Desde la consola de administración de DNS, dar clic derecho en una de las zonas de DNS de un dominio hijo y abrir las propiedades de la zona.
Dar clic en el botón “Change” que esta junto al texto “Type: Primary”. Habilitar la opción “Store the zone in Active Directory” y dar clic en “OK”. Dar clic en “Yes” cuando solicite confirmación para integrar la zona a Directorio Activo.
A continuación, dar clic en el botón “Change” que aparece junto al texto “Replication: All DNS servers in this domain”. Seleccionar la opción “To all DNS servers running on domain controllers in the forest” y dar clic en “OK”.
He aquí un resumen de la configuración que deberían tener:
Dar clic en “OK” y repetir este mismo procedimiento para cada una de las zonas de los dominios hijo.
Paso 5: Restaurar las ACL (listas de control de acceso) de los registros de DNS
Ahora necesitamos restablecer los permisos (ACL) de los registros de DNS. Esto es especialmente importante si quieren configurar las actualizaciones dinámicas de DNS de forma segura. Cuando las actualizaciones dinámicas de DNS son configuradas como “seguras”, el servidor de DNS revisará las ACL de los registros de DNS para verificar si el servidor miembro del dominio tiene los permisos para modificar un registro de DNS en particular.
Desafortunadamente, el comando “DNSCMD /zoneexport” no exporta la información de las ACLs. Por eso es necesario que copiemos las ACLs de los registros desde la “vieja” zona del dominio raíz hacia el registro DNS correspondiente en la nueva zona de DNS del dominio hijo. Una vez más, he creado un script de ejemplo para realizar esto. Este script require del modulo de PowerShell para Directorio Activo, el cual puede ser instalado como una característica opcional de Windows Server (Optional Features) o puede ser instalado en un cliente Windows como parte de las herramientas de administración remota (Remote Server Administration Tools). Por favor tomen en cuenta que este script es provisto como ejemplo y no tiene soporte de parte de Microsoft. Aquí hay un ejemplo de cómo utilizarlo:
.\Copy-DNSACL.ps1 -SourceZoneDN "DC=contoso.com,CN=MicrosoftDNS,DC=ForestDnsZones,DC=contoso,DC=com" -TargetZoneDN "DC=child1.contoso.com,CN=MicrosoftDNS,DC=ForestDnsZones,DC=contoso,DC=com" -TargetDNSZoneShortName "child1"
Aquí hay un ejemplo del resultado del script:
Hay que repetir este paso para cada una de las zonas de los dominios hijo. Ahora, si observan en el tab de “Security” de las propiedades de un registro de DNS, podrán ver que el servidor miembro del dominio tiene control total (full control) sobre sus registros.
Paso 6: Habilitar nuevamente las actualizaciones dinámicas
Su el ambiente en que están trabajando utiliza actualizaciones dinámicas es momento de volver a habilitarlas. Para lo anterior hay que ir al tab “General” de las propiedades de la zona de DNS del dominio hijo y seleccionar “Secure only” o “Nonsecure and secure” del combo que esta junto al texto “Dynamic Updates” (si no estan seguros, pueden usar la misma configuración que tiene la zona de DNS raíz).
Paso 7: Limpiar los registros de DNS “viejos” y delegar las zonas de DNS de los dominios hijo
Antes de limpiar los registros de DNS viejos, deben asegurarse de:
- Tener un respaldo de la “vieja” zona de DNS y ser capaces de recuperarla.
- Que la resolución de DNS este trabajando apropiadamente tanto para los registros de la zona raíz, como para los registros de las zonas de DNS de los dominios hijo.
- Que las actualizaciones dinámicas esten trabajando adecuadamente.
- Que no se haya identificado ningún problema hasta ahora.
Para limpiar los registros viejos, hay que abrir la consola de administración de DNS y expandir la “vieja” zona de DNS del dominio raíz. (¡Asegúrense de que no vayan a borrar la nueva zona de DNS del dominio hijo!) Dar clic derecho en la sub zona “child1” bajo la zona raíz y seleccionar “Delete”.
Ahora la sub zona “Child1” ha desaparecido de las “sub zonas” debajo de “contoso.com”, pero la nueva zona “child1.contoso.com” aún está presente como una zona de DNS independiente.
Para que los servidores de DNS que hospedan la zona “contoso.com” pero que no hospedan la zona “child1.contoso.com” sean capaces de resolver esta última, es necesario crear una delegación para la zona “child1” desde la zona “contoso.com”. Para lo anterior, dar clic derecho sobre la zona “contoso.com” y seleccionar “New delegation…”.
Dar clic en “next” y digitar el nombre del dominio hijo (por ejemplo: child1) y dar clic en “Next”.
De la lista que aparece en la pantalla “Name Servers”, agregar todos los servidores que están hospedando la zona “child1.contoso.com” (esta podría ser una lista larga, dependiendo del tamaño del ambiente en el que estén trabajando), después dar clic en “Next” y dar clic en “Finish”.
Ahora se puede ver “child1 como una delegación de “contoso.com” en la consola de administración de DNS.
Es necesario repetir esta operación para cada uno de los dominios hijo. Al final, en la consola de administración de DNS se debe ver algo como esto:
¡Buen trabajo! ¡el proceso de migración ha finalizado! Ahora ya se puede cambiar el alcance de replicación para las zonas de los dominios hijo si lo desean. Como ultima tarea deben revisar que la lista de los registros NS sea coherente para todas las zonas de DNS. También pueden considerar volver a habilitar las opciones de “Aging” y “Scavenging” para estas nuevas zonas si así lo desean.
12-6-13- Puedes encontrar los scripts en el repositorio de TechNet.
http://gallery.technet.microsoft.com/scriptcenter/Copy-ACL-of-DNS-records-97837128
http://gallery.technet.microsoft.com/scriptcenter/Extract-a-specific-DNS-dc633d77
-Pierre Ricca