Menu

Manejando servidores DNS de Windows como un campeón!! (o cómo realizar múltiples cambios de manera fácil en DNS de Windows Server)

22/02/2010 - Management

El Problema
Actualmente estoy rediseñando la ubicación de unos servicios en varios servidores y me encontré con la necesidad de mover algunos servidores DNS de Microsoft que estaban en un Windows Server a otro – Adicionalmente tenía la necesidad de reconfigurar los Time To Live de los registros SOA y MX, agregar un MX adicional a todos los dominios (para tener failover con otro SMTP en otra ubicación Física) y reemplazar o corregir los registros SOA configurando los campos como corresponde.

Realmente la cantidad de zonas no era enorme (unas 15 zonas primarias, y más cuatro zonas secundarian que replicaban del servidor primario) pero realmente me daba fiaca ir sitio por sitio para hacer las modificaciones.

La herramienta
Cada vez que se agrega el rol de Servidor DNS se instala un comando llamado DNSCMD. Dicho comando permite administrar tanto el servidor en sí como hacer manteminiento y alta de zonas o ABMs de registros dentro de la zonas DNS creadas.

La sintaxis regular de dnscmd es la siguiente
dnscmd.exe <servername> </Command> <CommandParameters>

Este comando permite realizar modificaciones o cambios inclusive a servidores DNS remotos, sin necesidad de estar logueado en la consola de cada servidor. Esto acelera mucho la tarea, en especial cuando hay que distribuir replicación de zonas entre diferentes servidores, cambiar el registro SOA, agregar un registro MX o A, o cambiar los name servers de nuestras zonas.

DNSCmd Parameters

DNSCmd Parameters

La Solución
Lo primero que hice fue crear un archivo de texto con los nombres de las zonas de dominio con las que tenía que trabajar. Para ello abrí el notepad, escribí las siguientes líneas
domain1.com
domain2.com
domain3.com
y lo guardé como un archivo de texto en una ubicación fácil de ubicar como es la raíz del perfil (ej. c:). Al archivo lo nombré como zonas.txt.
zonas.txt

El batch multipropósito
Con el archivo de texto creado me faltaba crear un archivo batch multipropósito que me permitiese ejecutar el mismo comando tantas veces como zonas aparezcan en el archivo de texto. Para elló abrí otro notepad y escribí el siguiente comando
FOR /F %%P IN (c:zonas.txt) DO dnscmd ..%%P.. que pasó a explicar a continuación:
FOR /F realizará una iteración del comando ingresado despues de DO. El parámetro /F especifíca que se busquen los parámetros %%P dentro del archivo IN (c:zonas.txt). Por último por cada línea que exista en el archivo se ejecutará DO dnscmd ..%%P.. reemplazando %%P por lo que exista en cada línea del archivo.

Configurando para que la zona primaria acepte transferencias desde los servidores secundarios
Por default, cuando se crea una zona primaria en un servidor DNS corriendo en Windows 2003 o 2008, no está habilitada la transferencia de zona. El objetivo es que el nuevo servidor realice una copia de la zona configurando una zona secundaria. Para ello debemos permitir que la zona primaria acepte la transferencia.
El batch quedaría así:
FOR /F %%P IN (c:zonas.txt) DO dnscmd darthmaul /ZoneResetSecondaries %%P /SecureList 192.168.1.150Al comando dnscmd le es indicado el nombre del servidor (que es DarthMaul) y es ejecutado con el parámetro /ZoneResetSecondaries. Este parámetro requiere que se le indique la seguridad (en este ejemplo le doy una lista de direcciones ip internas con /SecureList y luego le autorizo la dirección ip 192.168.1.150 para que pueda realizar desde esta IP la transferencia de zona.
allowzonetransfer

Agregando las zonas Secundarias al servidor
Una vez que permití la transferencia tengo que crear en el nuevo servidor la zona secundaria para que transfiera los registros para luego convertirla en primaria.
Para esta oportunidad mi batch quedó así:
FOR /F %%P IN (c:zonas.txt) DO dnscmd dc /ZoneAdd %%P /Secondary 192.168.1.246 /file %%P.dns El comando dnscmd se ejecuta en el servidor dc y corre el parámetro /ZoneAdd. Este parámetro requiere el nombre de la zona (reemplazado por las zonas en el archivo de texto con %%P) y el tipo de zona, en donde se especifica /Secondary. Partícularmente /Secondary requiere que se le indique una dirección IP desde donde podrá obtener la información de transferencia (en este caso, la dirección IP 192.168.1.246 corresponde al servidor DarthMaul. El parámetro /file %%P.dns permite crearme un archivo con el nombre de la zona y la extensión .dns. (hay que tener en cuenta que los servidores DNS de Windows guardan la información de zona en archivos de texto, como hace BIND. Aquellos servidores DNS que son controladores de dominio pueden guardar la zona en active directory).
addsecondaries

Cambiando las zonas de secundarias a primarias
Dado que estaba migrando el servidor DNS necesitaba que el nuevo sea el primario para poder seguir administrando las zonas y poder desafectar el anterior. Por este motivo modifiqué mi batch file para que corriese sobre DC:
FOR /F %%P IN (c:zonas.txt) DO dnscmd dc /ZoneResetType %%P /Primary /file %%P.dns El parámetro /ZoneResetType permite cambiar el tipo de zona. En este caso la cambié a /Primary y le vuelvo a indicar el archivo en donde se guardará la información de la zona con /file %%P.dns
ResetType

Modificando el registro SOA
El Registro SOA, entre otras cosas, permite manejar el versionado para la transferencia de zonas, el Time To Live por default y la información de Update, Retry y Timeout de las zonas secundarias que replican esta zona. Uno de los problemas de cambiar el tipo de zona de Primario a Secundario es que pierde el Primary Name Server y lo reemplaza por el FQDN del servidor (un problema si el servidor está expuesto y aparece en este campo el FQDN con el nombre interno del servidor).
EL batch quedó un poco mas largo que en los ejemplos anteriores:
FOR /F %%P IN (c:zonas.txt) DO dnscmd dc /RecordAdd %%P @ 86400 SOA ns1.demo.com hostmaster.demo.com 22022010 3600 600 172800 86400 El parámetro /RecordAdd permite agregar registros o modificar registros existentes. Luego de la zona se debe indicar el nombre del registro que se creará. En este caso el @ hace referencia al dominio en sí mismo. Luego se indica el time to live en segundos para el registro (86400 es 1 día).
ns1.demo.com y hostmaster.demo.com hacen referencia al campo primary name server y al contacto responsable.
El resto de los parámetros (22022010 3600 600 172800 86400) completan el registro SOA: Número de Serie, Intervalo de actualización en segundos, Intervalo de Reintento en segundos, expiración de la zona y Time to Live por default en segundos para registros nuevos.
RecordAdd
RecordAddSOA

Otros Ejemplos
Acá hay otros ejemplos de mi batch file que pueden llegar a ser de utilidad
FOR /F %%P IN (c:zonas.txt) DO dnscmd dc /RecordAdd %%P @ 86400 MX 10 mail.demo.com.
FOR /F %%P IN (c:zonas.txt) DO dnscmd dc /RecordAdd %%P www 86400 A 200.100.10.100
FOR /F %%P IN (c:zonas.txt) DO dnscmd dc /RecordAdd %%P smtp 86400 CNAME mail1.demo.com.

Leave a Reply

Your email address will not be published. Required fields are marked *