DNS в сети Windows - не просто служба имён. На нём держится Active Directory: компьютеры находят контроллеры домена через записи DNS, и почти любая проблема с доменом начинается с неправильной настройки DNS. Ниже - как установить роль, создать зоны и записи, настроить передачу зон, пересылку и найти причину неполадок.

Инструкция подходит для Windows Server 2016, 2019, 2022 и 2025.

Установка

powershell
Install-WindowsFeature DNS -IncludeManagementTools

Или через «Диспетчер серверов» → «Добавить роли и компоненты» → «DNS-сервер». При повышении сервера до контроллера домена мастер сам предлагает установить DNS, и обычно так и делают: каждый контроллер домена одновременно DNS-сервер.

Управление - в консоли dnsmgmt.msc или модулем PowerShell DnsServer. Через «Действие» → «Подключение к DNS-серверу» консоль работает и с удалёнными серверами.

Служба называется DNS:

powershell
Restart-Service DNS

В консоли запуск, остановка и перезапуск - в контекстном меню сервера → «Все задачи».

DNS и Active Directory

Контроллеры домена регистрируют в DNS записи SRV, по которым клиенты находят службы домена: _ldap._tcp.dc._msdcs.corp.example, _kerberos._tcp.corp.example и другие. За регистрацию отвечает служба Netlogon. Если записи пропали, их можно зарегистрировать заново на контроллере домена:

batch
nltest /dsregdns
ipconfig /registerdns

Отсюда главное правило: компьютеры домена должны использовать в качестве DNS-серверов только внутренние DNS-серверы, знающие зону домена. Публичный DNS-сервер в настройках клиента или контроллера домена - частая причина медленного входа, неприменения групповых политик и ошибок присоединения к домену. Выход в интернет обеспечивается пересылкой на самих DNS-серверах (о ней ниже).

Интегрированные зоны

Зону на контроллере домена можно хранить в Active Directory. У такой зоны:

  • нет одного главного сервера: изменения вносятся на любом контроллере домена и реплицируются вместе с Active Directory;
  • доступны безопасные динамические обновления - менять запись может только тот, кто её создал;
  • область репликации выбирается: все DNS-серверы домена, все DNS-серверы леса или все контроллеры домена.

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

Зоны

Две папки зоны со стрелками копирования туда и обратно

Зона прямого просмотра сопоставляет имена с адресами. Зона обратного просмотра - адреса с именами (записи PTR).

Типы зон:

  • основная - доступна для изменения;
  • дополнительная - копия основной, только для чтения, получает данные передачей зоны;
  • зона-заглушка - хранит только записи NS и SOA другой зоны, чтобы знать её серверы.

Создание интегрированной основной зоны прямого просмотра:

powershell
Add-DnsServerPrimaryZone -Name "corp.example" -ReplicationScope Domain -DynamicUpdate Secure

Обратная зона для подсети:

powershell
Add-DnsServerPrimaryZone -NetworkId "192.168.10.0/24" -ReplicationScope Domain

Будет создана зона 10.168.192.in-addr.arpa. Без обратной зоны всё работает, но nslookup при запуске пишет, что не может найти имя сервера, а в журналах и инструментах диагностики вместо имён будут адреса.

Зона вне Active Directory хранится в файле в папке %SystemRoot%\System32\dns:

powershell
Add-DnsServerPrimaryZone -Name "lab.example" -ZoneFile "lab.example.dns"

Дополнительный DNS-сервер

Дополнительная зона нужна, когда второй сервер не является контроллером домена или зона не интегрирована в AD. На втором сервере:

powershell
Add-DnsServerSecondaryZone -Name "lab.example" -ZoneFile "lab.example.dns" -MasterServers 192.168.10.5

На основном сервере нужно разрешить передачу зоны. В консоли: свойства зоны → вкладка «Передачи зон» → «Разрешить передачи зон» → «Только на серверы из этого списка» (или «Только на серверы, перечисленные на вкладке «Серверы имён»»). В PowerShell:

powershell
Set-DnsServerPrimaryZone -Name "lab.example" -SecureSecondaries TransferToSecureServers -SecondaryServers 192.168.10.6

Не разрешайте передачу зоны на любой сервер: это раздаёт всем желающим полный список ваших имён и адресов. Кнопка «Уведомить» на той же вкладке настраивает, каким серверам сообщать об изменениях, чтобы они забирали обновления сразу, а не по расписанию.

Добавьте второй сервер и на вкладку «Серверы имён»: так он появится в записях NS зоны.

Поддомены и делегирование

Поддомен можно сделать двумя способами:

  • внутри той же зоны - контекстное меню зоны → «Создать домен». Записи поддомена хранятся в родительской зоне и обслуживаются теми же серверами;
  • отдельной зоной с делегированием - создаёте зону branch.corp.example, а в родительской зоне - делегирование (контекстное меню → «Создать делегирование»), указывающее на её серверы. Так управление поддоменом можно передать другим администраторам или другим серверам.
powershell
Add-DnsServerZoneDelegation -Name "corp.example" -ChildZoneName "branch" `
    -NameServer "dns01.branch.corp.example" -IPAddress 192.168.30.5

Удаляется домен или зона командой «Удалить» в контекстном меню. Удаление интегрированной зоны удаляет её со всех DNS-серверов, куда она реплицировалась.

Записи

Вертикальный список карточек записей с разными значками

Основные типы:

  • A (и AAAA для IPv6) - имя → адрес;
  • PTR - адрес → имя, в обратной зоне;
  • CNAME - псевдоним, указывающий на другое имя;
  • MX - почтовый сервер домена с приоритетом (меньшее число - выше приоритет);
  • SRV - расположение службы, их создают в основном сами службы;
  • TXT - произвольный текст, например записи проверки домена и почтовые политики.

В консоли записи создаются в контекстном меню зоны: «Создать узел (A или AAAA)», «Создать псевдоним (CNAME)», «Создать почтовый обменник (MX)». При создании записи A отметьте «Создать соответствующую PTR-запись», если есть обратная зона.

PowerShell:

powershell
Add-DnsServerResourceRecordA -ZoneName "corp.example" -Name "web01" -IPv4Address 192.168.10.30 -CreatePtr
Add-DnsServerResourceRecordCName -ZoneName "corp.example" -Name "intranet" -HostNameAlias "web01.corp.example"
Add-DnsServerResourceRecordMX -ZoneName "corp.example" -Name "." -MailExchange "mail.corp.example" -Preference 10

Просмотр и удаление:

powershell
Get-DnsServerResourceRecord -ZoneName "corp.example" -Name "web01"
Get-DnsServerResourceRecord -ZoneName "corp.example" -RRType MX
Remove-DnsServerResourceRecord -ZoneName "corp.example" -Name "web01" -RRType A -Force

Запись в консоли может обновиться не сразу. Нажмите «Обновить» (F5), а если запись не меняется на другом сервере - дождитесь репликации или передачи зоны.

Запись SOA

Начальная запись зоны (SOA) хранит её служебные параметры: основной сервер, ответственное лицо, серийный номер и интервалы для дополнительных серверов (как часто проверять обновления, через сколько повторить попытку, когда считать копию устаревшей) и TTL для отрицательных ответов. Редактируется на вкладке «Начальная запись зоны (SOA)» в свойствах зоны.

Серийный номер увеличивается сам при каждом изменении. Вручную его повышают (кнопка «Увеличить»), когда нужно заставить дополнительные серверы забрать зону заново.

Динамические обновления

Тип обновлений задаётся на вкладке «Общие» свойств зоны:

  • Только безопасные - для интегрированных зон, рекомендуемый вариант;
  • Небезопасные и безопасные - обновить запись может кто угодно. Допустимо только в изолированных сетях;
  • Нет - все записи вносятся вручную.
powershell
Set-DnsServerPrimaryZone -Name "corp.example" -DynamicUpdate Secure

Очистка устаревших записей

При динамических обновлениях записи ушедших компьютеров остаются в зоне. Механизм старения и очистки удаляет их автоматически. Включать его нужно в двух местах: в свойствах зоны («Общие» → «Старение» → «Удалять устаревшие записи ресурсов») и на сервере (контекстное меню сервера → «Установить старение и очистку для всех зон», затем в свойствах сервера на вкладке «Дополнительно» - «Включить автоматическую очистку устаревших записей»). Очистку достаточно включить на одном сервере.

powershell
Set-DnsServerZoneAging -Name "corp.example" -Aging $true
Set-DnsServerScavenging -ScavengingState $true -ScavengingInterval 7.00:00:00

Статические записи, созданные вручную, очистке не подлежат.

Настройки сервера

Интерфейсы

Если у сервера несколько адресов, на вкладке «Интерфейсы» свойств сервера можно выбрать, на каких из них отвечать на запросы. Например, не отвечать на адресе в сети резервного копирования.

powershell
Set-DnsServerSetting -ListeningIPAddress 192.168.10.5

Пересылка

Запросы к внешним именам сервер по умолчанию разрешает сам, начиная с корневых серверов интернета (корневые ссылки). Обычно удобнее пересылать их на DNS-серверы провайдера или вышестоящие серверы организации:

powershell
Set-DnsServerForwarder -IPAddress 192.0.2.53,192.0.2.54

В консоли - вкладка «Пересылка» в свойствах сервера. Флажок «Использовать корневые ссылки, если нет доступных серверов пересылки» оставляет запасной путь.

Сервер только с пересылкой - если снять этот флажок, сервер будет пересылать запросы и никогда не обращаться к корневым серверам. Так делают, когда прямой выход к интернет-DNS закрыт файрволом.

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

powershell
Set-DnsServerRecursion -Enable $false

В консоли - «Дополнительно» → «Отключить рекурсию (также отключает серверы пересылки)».

Условная пересылка

Условная пересылка отправляет запросы к определённому домену на указанные серверы. Типичный случай - доверие с доменом партнёра или дочерней компании, у которой свой DNS:

powershell
Add-DnsServerConditionalForwarderZone -Name "partner.example" -MasterServers 10.20.0.5,10.20.0.6 -ReplicationScope Forest

С -ReplicationScope условная пересылка хранится в Active Directory и появляется на всех DNS-серверах леса. В консоли - узел «Условные пересылки» → «Создать условную пересылку».

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

Диагностика

Сервер, лупа со списком отметок и линия сигнала

Проверка разрешения имён

powershell
Resolve-DnsName web01.corp.example -Server 192.168.10.5
Resolve-DnsName corp.example -Type SOA
nslookup -type=SRV _ldap._tcp.dc._msdcs.corp.example

Подробнее о nslookup - в отдельной статье. Сбросить кэш сервера, если он хранит устаревший ответ:

powershell
Clear-DnsServerCache

На клиенте кэш очищается командой ipconfig /flushdns.

Проверка DNS для Active Directory

batch
dcdiag /test:dns /v

Команда проверяет на контроллере домена настройки клиента DNS, регистрацию записей, делегирование, пересылку и динамические обновления.

Мониторинг и журналы

На вкладке «Наблюдение» свойств сервера есть простые тесты: простой запрос к самому себе и рекурсивный запрос к другим серверам. Их можно запускать по расписанию.

Ошибки службы - в журнале событий «Журналы приложений и служб» → «DNS Server». Подробная история запросов:

  • Отладочное протоколирование - вкладка «Ведение журнала отладки» в свойствах сервера. Выберите направление пакетов, протокол, типы и фильтр по IP-адресам, укажите файл и максимальный размер. Протоколирование заметно нагружает сервер и быстро растёт, включайте его на время поиска проблемы.
  • Аналитический журнал - «Microsoft» → «Windows» → «DNS-Server» → «Analytical» (включается через «Вид» → «Показать аналитический и отладочный журналы»). Меньше влияет на производительность и удобнее для фильтрации.
powershell
Set-DnsServerDiagnostics -All $true    # включить всё отладочное протоколирование
Set-DnsServerDiagnostics -All $false   # выключить

Статистику сервера (сколько запросов, рекурсий, ошибок, передач зон) показывает Get-DnsServerStatistics.