Resolve-DnsName: Поиск основной записи DNS в PowerShell

Если вы управляете веб- или почтовыми серверами, вы знаете, насколько сильно эти серверы зависят от правильно настроенных DNS-записей. Отсутствие DNS-записей может вызвать различные проблемы, включая невозможность пользователями найти ваш веб-сайт или недоставку электронных писем. Хорошо, что существует cmdlet PowerShell Resolve-DnsName, и с его помощью мониторинг DNS-записей можно автоматизировать с помощью сценариев.

День администратора уже достаточно наполнен, и ручная проверка того, можно ли правильно разрешить DNS-записи, требует дополнительных усилий.

В этой статье вы узнаете, что такое и как использовать cmdlet Resolve-DnsName для запроса DNS-записей с использованием PowerShell. К концу этой статьи вы также узнаете, как создать базовый сценарий для создания отчета о ваших назначенных DNS-записях для мониторинга.

Предварительные требования

Эта статья является пошаговым руководством, и если вы собираетесь следовать примерам, вам понадобится:

Resolve-DnsName: Разрешение DNS в PowerShell

Есть более одного способа выполнить DNS-запрос. Cmdlet Resolve-DnsName аналогичен nslookup командной строковой утилите, поставляемой с Windows, или dig команде, если вы склонны больше к администрированию Linux.

Некоторые веб-сайты предлагают услуги мониторинга/отчетности записей DNS. Но, эти услуги от третьих сторон в основном предоставляются за плату, конечно. Есть бесплатная альтернатива, которая также позволяет вам продемонстрировать свои навыки написания сценариев!

Командлет Resolve-DnsName, как следует из его названия, разрешает имена DNS в IP-адреса и наоборот. Этот командлет является частью модуля PowerShell dnsclient, который на момент написания этого текста поставляется вместе с Windows 10, Windows Server 2012/R2, Windows Server 2016 и Windows Server 2019.

Поскольку Resolve-DnsName является командлетом PowerShell, он возвращает результаты в виде объектов, которые можно сохранять, обрабатывать и экспортировать. Например, запрос записи DNS google.com с использованием команды Resolve-DnsName google.com даст вам выходные данные, показанные ниже.

DNS Record lookup result using Resolve-DnsName

Результат возвращается как объект, который позволяет экспортировать результаты в файл CSV или изменять формат для создания отчетов в формате HTML.

Командлет Resolve-DnsName отличается от старомодной утилиты nslookup. nslookup возвращает простую строку. Пример можно увидеть на следующем скриншоте. Если вам нужно извлечь какую-либо из этой информации, это будет непросто.

DNS record lookup result using nslookup

Запрашивание различных типов DNS-записей

По умолчанию, Resolve-DnsName запрашивает типы DNS-записей A и AAAA. Например, если вы ищете DNS-запись для gmail.com, используя команду ниже:

Resolve-DnsName -Name gmail.com

Как вы можете видеть ниже, возвращаются только записи AAAA и A. Это потому, что тип DNS-записи для поиска не был указан.

DNS record for gmail.com

Теперь, учитывая, что мы все знаем, что gmail.com является почтовым доменом, используемым почтовым сервисом Google, должна быть связана с ним запись MX, верно? Ну, нет необходимости предполагать, когда вы можете подтвердить это, используя эту команду:

Resolve-DnsName -Name gmail.com -Type MX

Вывод, показанный на скриншоте ниже, демонстрирует список записей MX для gmail.com.

MX Record list of gmail.com

Чтобы узнать больше о различных типах записей, которые можно использовать с Resolve-DnsName, посетите эту ссылку и найдите таблицу для параметра -Type. Или вы можете просто обратиться к помощи Resolve-DnsName, используя команду get-help Resolve-DnsName.

Использование конкретных серверов для DNS-запроса

Resolve-DnsName использует адреса DNS-серверов, настроенные на вашем компьютере по умолчанию. Однако вы также можете указать Resolve-DnsName использовать определенный DNS-сервер при выполнении поиска.

Например, если вы хотите использовать Google Public DNS для поиска записей, вы можете сделать это, добавив параметр -Server в вашу команду, аналогично приведенному ниже примеру.

# IP-адреса DNS-серверов Google Public DNS
$dnsServer = @('8.8.8.8','8.8.4.4')
Resolve-DnsName adamtheautomator.com -Server $dnsServer

Результат выполнения команды будет аналогичен показанному на скриншоте ниже.

DNS record lookup results using a specific DNS servers

В этот момент вы могли бы задаться вопросом: “зачем мне нужно использовать другой DNS-сервер?”. Это вполне обоснованный вопрос. Если вы попытаетесь найти ту же запись, используя DNS-сервер по умолчанию вашего компьютера или другой DNS-сервер, вероятно, вы получите тот же результат.

Существует много причин использовать различные DNS-серверы с Resolve-DnsName. Некоторые из этих причин могут включать:

  • Скорость – Некоторые DNS-серверы могут работать быстрее других.
  • Безопасность – Некоторые DNS-серверы могут иметь больше мер безопасности, чем другие, что предотвращает захваты и атаки.
  • Доступность записей – В большинстве случаев организации имеют свои собственные внутренние серверы DNS, которые содержат зоны и записи для имен, которые разрешаются только внутри сети. В этом случае запрос внутреннего имени через общедоступный сервер DNS завершится неудачей.
DNS record lookup failure
  • Серверы DNS не пересылают запросы – Некоторые организации не разрешают пересылку DNS. Попытка использовать их для запроса записей общедоступного DNS завершится неудачей.
  • Устранение неполадок и тестирование – Если ваши любимые серверы DNS работают некорректно, вам может захотеться протестировать свои запросы с использованием другого сервера DNS.

Сообщения о записях DNS с использованием сценария PowerShell

Теперь, когда вы освоили основы использования командлета Resolve-DnsName, в этом разделе вы научитесь создавать сценарий PowerShell для отслеживания и отчетности о записях DNS. Вы должны сможете применить полученные знания из предыдущих разделов при создании этого сценария.

Запустите ваш редактор сценариев по выбору и создайте новый файл с именем GetDnsRecord.ps1.

Определение переменных

Сначала определите переменные для использования. Эти переменные будут включать в себя следующее:

  • $NameList – Эта переменная будет содержать имена записей DNS, которые вы хотите, чтобы ваш сценарий запрашивал
  • $Serverlist – Используйте эту переменную, чтобы указать серверы DNS, которые будут использоваться сценарием для запросов.

Скопируйте приведенный ниже код и вставьте его в начало вашего сценария.

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

Выполнение DNS-запросов

Затем код должен иметь возможность проверить запись DNS для каждого указанного имени. В этом случае будет использоваться цикл foreach для перебора списка записей и проверки каждого имени с помощью Resolve-DnsName.

Строка $FinalResult = @() создает пустой массив, в котором будет сохранен конечный результат. Затем, используя цикл foreach, PowerShell передает каждый элемент переменной $NameList в переменную с именем $Name.

На каждой итерации строка $tempObj = "" | Select-Object Name,IPAddress,Status,ErrorMessage создает временный объект с четырьмя свойствами для хранения результата успешного поиска DNS.

Затем используется оператор try{} для выполнения команды Resolve-DnsName для поиска записей A DNS и заполнения значений $tempObj. В случае сбоя поиска DNS оператор catch{} перехватывает ошибку, и ошибка будет включена в объект $tempObj.

По завершении каждой итерации значение объекта $tempObj будет добавлено к $FinalResult. И как только обработан последний элемент в массиве $NameList, цикл завершится. Затем будет отображено значение $FinalResult.

Скопируйте приведенный ниже код и вставьте его в конец своего скрипта. Не нужно изменять значения.

$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

После сохранения скрипта запустите его в PowerShell, вызвав его имя GetDnsRecord.ps1. Приведенная ниже демонстрация показывает вывод.

Script to lookup multiple DNS records using Resolve-DnsName

Как видите из приведенного выше результата, вывод представляет собой объект, который полезен, если вы хотите экспортировать результаты в файл, например CSV, с использованием следующей команды.

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

Выход CSV будет выглядеть примерно так.

DNS record lookup report exported to a CSV file

Заключение

В этой статье вы узнали основы использования командлета Resolve-DnsName для выполнения поиска записей DNS в PowerShell. Вы также узнали, как Resolve-DnsName отличается от других инструментов, таких как утилита nslookup.

Вы видели, как Resolve-DnsName может использоваться в скрипте для автоматизации поиска записей DNS. Это будет полезным инструментом мониторинга, чтобы вы всегда знали текущее состояние DNS-записей, за которыми следите.

Используя ваши навыки написания сценариев PowerShell, отчетный сценарий может быть дополнительно усовершенствован путем добавления кода для автоматической отправки отчета по электронной почте на указанные адресаты. Его также можно модифицировать для создания визуально привлекательного HTML-вывода.

В конце концов, Resolve-DnsName – отличный инструмент для поиска DNS, независимо от того, используете ли вы его вручную или для автоматизации в сценариях. Теперь у вас есть знания о том, как он работает, и зависит от вас найти способы использовать его в рамках ваших административных задач.

Дальнейшее чтение

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