Resolve-DnsName: Búsqueda maestra de registros DNS en PowerShell

Si estás administrando servidores web o de correo electrónico, sabes lo importante que son los registros DNS configurados adecuadamente. La falta de registros DNS puede causar todo tipo de problemas, incluyendo que los usuarios no puedan encontrar tu sitio web o que los correos electrónicos no se entreguen. Afortunadamente, existe el cmdlet Resolve-DnsName en PowerShell, con el cual se puede automatizar la monitorización de registros DNS mediante scripts.

El día de un administrador ya está bastante ocupado, y comprobar manualmente si los registros DNS se resuelven correctamente requiere más esfuerzo manual.

En este artículo, aprenderás qué es y cómo utilizar el cmdlet Resolve-DnsName para consultar registros DNS con PowerShell. Al final de este artículo, también habrás aprendido cómo crear un script básico para generar un informe de los registros DNS que deseas monitorizar.

Prerrequisitos

Este artículo es una guía paso a paso y si planeas seguir los ejemplos, necesitarás:

Resolve-DnsName: El resolutor DNS de PowerShell

Existen diferentes formas de realizar una consulta DNS. El cmdlet Resolve-DnsName es similar a la herramienta de línea de comandos nslookup que viene con Windows, o al comando dig si eres más un administrador de Linux.

Algunos sitios web ofrecen servicios de monitoreo/informes de registros DNS. Pero, estos servicios de terceros generalmente tienen un costo, por supuesto. Existe una alternativa gratuita, ¡que también te permite lucir tus habilidades de programación!

El cmdlet Resolve-DnsName, como su nombre lo indica, resuelve nombres DNS a direcciones IP y viceversa. Este cmdlet es parte del módulo dnsclient de PowerShell que, a fecha de esta escritura, se incluye con Windows 10, Windows Server 2012/R2, Windows Server 2016 y Windows Server 2019.

Debido a que Resolve-DnsName es un cmdlet de PowerShell, devuelve sus resultados como objetos que se pueden almacenar, manipular y exportar. Por ejemplo, al buscar el registro DNS de google.com usando el comando Resolve-DnsName google.com, obtendrás la siguiente salida.

DNS Record lookup result using Resolve-DnsName

El resultado se devolvió como un objeto que te permite exportar los resultados a un archivo CSV o manipular el formato para producir informes HTML.

El cmdlet Resolve-DnsName es diferente a la antigua utilidad nslookup. nslookup devuelve una cadena simple. Puedes ver un ejemplo en la siguiente captura de pantalla. Si necesitas analizar alguna de esta información, será complicado.

DNS record lookup result using nslookup

Consulta de Diferentes Tipos de Registros DNS

Por defecto, Resolve-DnsName realiza consultas a los registros DNS de tipo A y AAAA. Por ejemplo, si buscas el registro DNS para gmail.com utilizando el siguiente comando:

Resolve-DnsName -Name gmail.com

Como puedes ver a continuación, solo se devuelven los registros AAAA y A. Esto se debe a que no se especificó el tipo de registro DNS a buscar.

DNS record for gmail.com

Ahora bien, dado que todos sabemos que gmail.com es un dominio de correo electrónico utilizado por el servicio de correo electrónico de Google, ¿debe haber un registro MX asociado, verdad? Bueno, no es necesario suponer cuando puedes confirmarlo utilizando este comando:

Resolve-DnsName -Name gmail.com -Type MX

La salida mostrada en la captura de pantalla a continuación muestra la lista de registros MX para gmail.com.

MX Record list of gmail.com

Para obtener más información sobre los diferentes tipos de registros que se pueden utilizar con Resolve-DnsName, visita este enlace y busca la tabla del parámetro -Type. O simplemente consulta la ayuda de Resolve-DnsName utilizando el comando get-help Resolve-DnsName.

Uso de Servidores Específicos para la Búsqueda DNS

Resolve-DnsName utiliza los servidores DNS configurados en tu computadora por defecto. Sin embargo, también puedes hacer que Resolve-DnsName utilice un servidor DNS específico al realizar búsquedas.

Por ejemplo, si quieres utilizar Google Public DNS para buscar registros, puedes hacerlo agregando el parámetro -Server en tu comando, similar al siguiente ejemplo.

# Direcciones IP del servidor DNS de Google Public DNS
$dnsServer = @('8.8.8.8','8.8.4.4')
Resolve-DnsName adamtheautomator.com -Server $dnsServer

El resultado del comando anterior sería similar al que se muestra en la captura de pantalla a continuación.

DNS record lookup results using a specific DNS servers

En este punto, es posible que te estés preguntando: “¿por qué necesitaría utilizar un servidor DNS diferente?”. Esa es una pregunta válida. Si intentas buscar el mismo registro utilizando el servidor DNS predeterminado de tu máquina u otro servidor DNS, es probable que obtengas el mismo resultado.

Puede haber muchas razones para utilizar diferentes servidores DNS con Resolve-DnsName. Algunas de estas razones pueden incluir:

  • Velocidad: algunos servidores DNS pueden ser más rápidos que otros.
  • Seguridad: algunos servidores DNS pueden tener más medidas de seguridad que otros para prevenir secuestros y ataques.
  • Disponibilidad de registros – En la mayoría de los escenarios, las organizaciones tienen sus propios servidores DNS internos que contienen las zonas y registros para nombres que solo se resuelven internamente. En este caso, buscar un nombre interno usando un servidor DNS público fallará.
DNS record lookup failure
  • Los servidores DNS no están reenviando solicitudes – Algunas organizaciones no permiten el reenvío de DNS. Usarlos para buscar registros DNS públicos fallará.
  • Resolución de problemas y pruebas – Cuando tus servidores DNS favoritos no funcionan correctamente, es posible que desees probar tus búsquedas utilizando un servidor DNS diferente.

Informe de registros DNS utilizando un script de PowerShell

Ahora que has aprendido lo básico sobre cómo usar el cmdlet Resolve-DnsName, en esta sección aprenderás a crear un script de PowerShell para monitorear e informar sobre registros DNS. Deberías poder aplicar los conocimientos que has adquirido en las secciones anteriores hasta ahora en la construcción de este script.

Enciende tu editor de scripts favorito y crea un nuevo archivo llamado GetDnsRecord.ps1.

Definición de las variables

Primero, determina las variables a utilizar. Estas variables incluirán lo siguiente:

  • $NameList – Esta variable contendrá los nombres de los registros DNS que deseas que tu script consulte
  • $Serverlist – Utiliza esta variable para indicar los servidores DNS que serán utilizados por el script para las consultas.

Copia el código a continuación y pégalo al principio de tu script.

$NameList = @('adamtheautomator.com','powershell.org','xyz.local')
$ServerList = @('8.8.8.8','8.8.4.4')

Realizando búsquedas DNS

A continuación, el código debe ser capaz de buscar el registro DNS de cada uno de los nombres especificados. En este caso, el bucle foreach se utilizará para iterar la lista de registros y buscar cada nombre usando Resolve-DnsName.

La línea $FinalResult = @() crea un array vacío donde se almacenará el resultado final. Luego, utilizando el bucle foreach, PowerShell pasa cada elemento en la variable $NameList a una variable llamada $Name.

En cada iteración, la línea $tempObj = "" | Select-Object Name,IPAddress,Status,ErrorMessage crea un objeto temporal con cuatro propiedades para contener el resultado de la búsqueda de DNS exitosa.

A continuación, se utiliza la declaración try{} para ejecutar el comando Resolve-DnsName y buscar los registros DNS A y completar los valores de $tempObj. En caso de que la búsqueda de DNS falle, la declaración catch{} captura el error y el error se incluirá en el objeto $tempObj.

Al final de cada iteración, el valor del objeto $tempObj se agregará a $FinalResult. Y una vez que se procesa el último elemento en la matriz $NameList, el bucle se cerrará. Luego, se mostrará el valor de $FinalResult.

Copia el código a continuación y pégalo al final de tu script. No es necesario cambiar ningún valor.

$FinalResult = @()
foreach ($Name in $NameList) {
    $tempObj = "" | Select-Object Name, IPAddress, Status, ErrorMessage
    try {
        $dnsRecord = Resolve-DnsName $Name -Server $ServerList -ErrorAction Stop | Where-Object { $_.Type -eq 'A' }
        $tempObj.Name = $Name
        $tempObj.IPAddress = ($dnsRecord.IPAddress -join ',')
        $tempObj.Status = 'OK'
        $tempObj.ErrorMessage = ''
    }
    catch {
        $tempObj.Name = $Name
        $tempObj.IPAddress = ''
        $tempObj.Status = 'NOT_OK'
        $tempObj.ErrorMessage = $_.Exception.Message
    }
    $FinalResult += $tempObj
}
return $FinalResult

Después de guardar el script, ejecútalo en PowerShell llamándolo por su nombre GetDnsRecord.ps1. La demostración a continuación muestra la salida.

Script to lookup multiple DNS records using Resolve-DnsName

Como puedes ver en el resultado anterior, la salida es un objeto que es útil si deseas exportar los resultados a un archivo como CSV usando el comando a continuación.

.\GetDnsRecord.ps1 | Export-Csv DnsRecord.csv -NoTypeInformation

La salida CSV se vería similar a la siguiente.

DNS record lookup report exported to a CSV file

Conclusión

En este artículo, has aprendido los conceptos básicos de cómo usar el cmdlet Resolve-DnsName para realizar búsquedas de registros DNS en PowerShell. También has aprendido cómo Resolve-DnsName es diferente de otras herramientas como la utilidad nslookup.

Has visto cómo Resolve-DnsName puede ser utilizado en un script para automatizar la búsqueda de registros DNS. Esto sería útil como una herramienta de monitoreo para asegurarte de que estás al tanto del estado actual de los registros DNS que supervisas.

Usando tus habilidades de scripting en PowerShell, el script de informes puede ser mejorado aún más agregando código para enviar el informe por correo electrónico a destinatarios específicos. También se puede modificar para crear una salida HTML visualmente atractiva.

Al final, Resolve-DnsName es una excelente herramienta para la búsqueda de DNS, ya sea que la uses manualmente o para la automatización en scripts. Ahora tienes el conocimiento sobre cómo funciona, y depende de ti encontrar formas de usarlo como parte de tus tareas de administración.

Lectura adicional

Source:
https://adamtheautomator.com/resolve-dnsname/