Погодин Евгений — ИТ Заметки
🖥️Windows Server Обновлено 04.11.2026

Windows Server с нуля 04. DNS в домене: зоны, записи, пересылка и диагностика

Note

Материал сверен с официальной документацией (Microsoft Learn и др.; ссылки — в конце статьи). Примеры вывода — иллюстрации: на вашем сервере значения и формат могут отличаться. Перед работой на боевом сервере проверьте шаги на тестовой машине.

Когда в домене что-то ломается (не входят в систему, не открывается общая папка, не применяются политики), причина чаще всего в DNS. Active Directory не умеет находить контроллеры без него. В этой статье мы выясним, как контроллеры публикуют себя в DNS, какие зоны есть в домене и как добавлять в них записи, настроим пересылку запросов на внешний DNS, решим, куда направить клиентов и когда включать очистку устаревших записей, и соберём набор команд для диагностики. Теорию DNS (иерархию имён, рекурсию, TTL, типы записей) мы не повторяем: она в статье DNS: как имя превращается в адрес. Здесь только то, что относится к Windows Server и домену.

Что нужно знать заранее

  • Windows Server с нуля 03: работают контроллеры DC1 (192.168.10.11) и DC2 (192.168.10.12) домена lab.example.
  • DNS: как имя превращается в адрес: запись, зона, рекурсия, кэш.
  • Команды выполняйте в Windows PowerShell 5.1 от имени администратора на DC1. Модуль DnsServer появляется после установки роли DNS-сервера или компонента DNS Server Tools (RSAT-DNS-Server), поэтому на контроллере с DNS он уже есть.

Warning

Адреса серии учебные: сеть 192.168.10.0/24, внешний DNS 192.0.2.53. Блок 192.0.2.0/24 предназначен для документации, и в реальной сети по такому адресу DNS не ответит: подставьте адрес своего DNS-сервера. Шаги меняют DNS домена, поэтому проверяйте их на тестовых виртуальных машинах с контрольной точкой.

Как DNS связан с Active Directory

Компьютер не знает заранее, какие в домене есть контроллеры. При входе служба Netlogon клиента запрашивает у DNS SRV-записи (service record, запись о местонахождении службы) вида _ldap._tcp.lab.example, получает список контроллеров и проверяет их LDAP-запросом по UDP. Найденный контроллер запоминается в кэше. В записи SRV указаны приоритет (priority), вес (weight), порт (port) и имя сервера (target). Поиск по NetBIOS-имени (через WINS и mailslot) считается устаревшим: начиная с Windows Server 2025 на таких компьютерах он по умолчанию заблокирован политикой BlockNetBIOSDiscovery, а искать контроллеры рекомендуется по DNS.

Контроллер регистрирует эти записи сам: SRV и CNAME (canonical name, псевдоним) создаёт служба Netlogon, адрес (A-запись) — служба «DNS-клиент». Список записей контроллера лежит в файле %SystemRoot%\System32\Config\Netlogon.dns: его удобно читать, если домен обслуживает сторонний DNS-сервер.

Запись Тип Для чего
_ldap._tcp.dc._msdcs.lab.example SRV любой контроллер домена
_kerberos._tcp.dc._msdcs.lab.example SRV служба выдачи билетов Kerberos
_ldap._tcp.Default-First-Site-Name._sites.dc._msdcs.lab.example SRV контроллеры конкретного сайта
<GUID>._msdcs.lab.example CNAME имя контроллера по GUID (глобальному уникальному идентификатору) для репликации
dc1.lab.example A адрес контроллера

Куда они попадают. Роль DNS-сервера ставится вместе с AD DS (в Install-ADDSForest параметр -InstallDns по умолчанию включён). Повышение создаёт зону домена lab.example и отдельную зону _msdcs.lab.example с общими для леса записями; её реплицируют на все DNS-серверы леса. Из этого следует главное правило: контроллерам и клиентам нужны DNS-серверы, которые знают зону домена, то есть серверы на контроллерах.

Зоны

Зона — часть пространства имён, которую обслуживает сервер. Сервер, у которого есть зона, авторитетен для её имён.

Тип зоны Что это
Основная (primary) записи можно создавать и менять
Вторичная (secondary) копия основной зоны только для чтения, получается передачей зоны
Заглушка (stub) только NS-записи серверов, которые обслуживают зону
Обратная (reverse lookup) сопоставляет адрес имени (PTR-записи, pointer, в in-addr.arpa)

Зона домена на контроллерах AD-интегрированная: она хранится не в файле, а в каталоге и реплицируется репликацией AD, а не передачей зоны. Поэтому любой контроллер с DNS принимает изменения, а второй сервер не превращается в «вторичный». Для AD-интегрированных зон доступны безопасные динамические обновления: сервер принимает регистрацию только от аутентифицированных компьютеров. При создании зоны выбирают область репликации: DNS-серверы домена, DNS-серверы леса, все контроллеры домена (режим совместимости с Windows 2000) или раздел каталога.

Динамическое обновление (dynamic update) — регистрация записей самими компьютерами. У зоны три режима: None (запрещено), Secure (только безопасные) и NonsecureAndSecure. Зона, ставшая AD-интегрированной, по умолчанию принимает только Secure, и менять это не стоит: при небезопасных обновлениях любой компьютер сети может перезаписать существующую A-запись. Сам командлет Add-DnsServerPrimaryZone обновления по умолчанию не разрешает, поэтому -DynamicUpdate 'Secure' указывают явно.

Посмотреть зоны сервера:

Get-DnsServerZone -Name 'lab.example', '_msdcs.lab.example'

Пример вывода (часть столбцов опущена):

ZoneName            ZoneType IsAutoCreated IsDsIntegrated IsReverseLookupZone
--------            -------- ------------- -------------- -------------------
_msdcs.lab.example  Primary  False         True           False
lab.example         Primary  False         True           False

Обратная зона необязательна, но некоторые программы по ней проверяют адреса, а nslookup по ней показывает имя сервера. Создадим её для нашей сети. Параметр -NetworkId принимает сеть в обычном виде, имя 10.168.192.in-addr.arpa будет построено автоматически:

Add-DnsServerPrimaryZone -NetworkId '192.168.10.0/24' `
    -ReplicationScope 'Domain' -DynamicUpdate 'Secure'

Значение Domain означает раздел домена, Forest — раздел леса (ForestDnsZones), Legacy оставлено для совместимости. В мастере им соответствуют пункты про DNS-серверы в домене, DNS-серверы в лесу и все контроллеры домена (для совместимости с Windows 2000), но соответствие документация не расписывает, поэтому после создания проверьте область репликации в свойствах зоны. Проверка: Get-DnsServerZone -Name '10.168.192.in-addr.arpa'. Консоль для тех же действий — DNS Manager (dnsmgmt.msc; в Диспетчере серверов меню Tools, пункт DNS; в русском интерфейсе подписи могут отличаться).

Записи

Большинство записей появляется само: компьютеры при запуске, смене адреса и периодически регистрируют A-запись (и PTR, если есть обратная зона). Клиент Windows, получивший адрес по DHCP, сам создаёт A-запись, а создание PTR по умолчанию поручает DHCP-серверу. Контроллеры регистрируют ещё и SRV, а записи этих служб вручную не правят.

Если DHCP-сервер работает на контроллере, как у нас, он получает права контроллера на запись в защищённую зону, поэтому для обновлений DNS ему задают отдельную учётную запись (см. Windows Server с нуля 07).

Вручную нужны записи для устройств, которые сами не регистрируются (принтеры, NAS, сетевое оборудование), и псевдонимы CNAME. Пример для хранилища nas1 (192.168.10.40) и псевдонима files для сервера FS1:

Add-DnsServerResourceRecordA -ZoneName 'lab.example' `
    -Name 'nas1' -IPv4Address '192.168.10.40' -CreatePtr
Add-DnsServerResourceRecordCName -ZoneName 'lab.example' `
    -Name 'files' -HostNameAlias 'fs1.lab.example'
Get-DnsServerResourceRecord -ZoneName 'lab.example' -Name 'nas1'

Параметр -CreatePtr создаёт заодно PTR в обратной зоне, поэтому она должна существовать. Пример вывода последней команды (формат приблизительный):

HostName RecordType Type Timestamp TimeToLive RecordData
-------- ---------- ---- --------- ---------- ----------
nas1     A          1    0         01:00:00   192.168.10.40

Метка времени 0 означает статическую запись: её не затронет очистка (подробнее ниже). Удаляет запись командлет Remove-DnsServerResourceRecord. Осторожно: без -RecordData он удалит все записи заданного типа с этим именем.

Remove-DnsServerResourceRecord -ZoneName 'lab.example' `
    -RRType 'A' -Name 'nas1' -RecordData '192.168.10.40'

В DNS Manager запись создаёт щелчок правой кнопкой по зоне и пункт New Host (A or AAAA).

Куда должны смотреть компьютеры

DNS-серверы указывают на каждом адаптере. Правила такие.

  1. Только серверы, которые могут разрешить зону домена (у нас это контроллеры). Публичный DNS «на всякий случай» таким не является: он не знает lab.example и ответит «имени не существует», а клиент примет это как окончательный ответ (подробнее в статье про DNS).
  2. Контроллер не должен указывать только на себя, если контроллеров несколько: единственный адрес, даже 127.0.0.1, — точка отказа. Порядок «сначала партнёр, затем сам контроллер» снижает риск, но не исключает его: при одновременной перезагрузке всех контроллеров служба DNS может запускаться 15–25 минут, а в журнале появится событие 4013. Пока контроллер один, указание на себя допустимо: именно 127.0.0.1 мастер прописывает на DC1 при создании леса, а когда появился DC2, адреса меняют по таблице ниже.
  3. Рядовые серверы и клиенты: сначала DC1, потом DC2 (или наоборот).
  4. На FS1, WSUS1 и PC2 DNS задают так же, как на PC1: Set-DnsClientServerAddress с адресами DC1 и DC2. Позже эти адреса клиентам будет выдавать DHCP (Windows Server с нуля 07).
Компьютер Основной DNS Дополнительный
DC1 192.168.10.12 192.168.10.11
DC2 192.168.10.11 192.168.10.12
FS1, WSUS1, PC1, PC2 192.168.10.11 192.168.10.12

Настройка для DC1 (на DC2 порядок адресов обратный). Имя адаптера возьмите из Get-NetAdapter:

Set-DnsClientServerAddress -InterfaceAlias 'Ethernet' `
    -ServerAddresses '192.168.10.12', '192.168.10.11'
Get-DnsClientServerAddress -InterfaceAlias 'Ethernet' `
    -AddressFamily IPv4

Пример вывода второй команды (формат приблизительный):

InterfaceAlias   Interface Address ServerAddresses
                 Index     Family
--------------   --------- ------- ---------------
Ethernet                 6 IPv4    {192.168.10.12, 192.168.10.11}

Пересылка запросов

Сервер DC1 обслуживает зону lab.example, а для остальных имён (www.example.com) выполняет рекурсию. Есть два способа: корневые подсказки (root hints, список корневых серверов) или пересылка (forwarder) на другой DNS-сервер, например на DNS провайдера или на 192.0.2.53 в нашей сети. Пересылка собирает внешние запросы и кэш на одном сервере и упрощает контроль и мониторинг, поэтому её часто используют в офисных сетях. Рекурсия здесь означает, что сервер сам обходит цепочку серверов и возвращает клиенту готовый ответ.

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

  1. Локальные данные: хранящиеся зоны и кэш.
  2. Условная пересылка (если имя совпало с её доменом).
  3. Делегирование, если оно покрывает имя.
  4. Пересылка уровня сервера: адреса из списка по порядку, тайм-аут на каждый по умолчанию 5 секунд.
  5. Корневые подсказки: только если это разрешено (UseRootHint) и осталось время.

Если ничего не помогло, клиент получит SERVFAIL. Повышение контроллера могло уже настроить пересылку автоматически (параметр -SkipAutoConfigureDns такую настройку отключает), поэтому сначала посмотрите текущий список и не добавляйте адрес повторно. Настроим пересылку и проверим:

Get-DnsServerForwarder
Add-DnsServerForwarder -IPAddress '192.0.2.53' -PassThru
Resolve-DnsName -Name 'www.example.com' -Server '192.168.10.11' `
    -DnsOnly

Пример вывода Get-DnsServerForwarder | Format-List IPAddress, UseRootHint после настройки:

IPAddress   : {192.0.2.53}
UseRootHint : True

Add-DnsServerForwarder добавляет адреса, а Set-DnsServerForwarder -IPAddress заменяет весь список, не перепутайте. Серверный список пересылки — свойство каждого DNS-сервера: повторите проверку на DC2. Для строгой схемы «только через пересылку» задают -UseRootHint $false, но тогда при недоступном пересылателе внешние имена перестанут разрешаться. В Windows Server 2022 и новее, если не отвечает ни один пересылатель, сервер до перезапуска службы обращается только к первому из динамического списка; чтобы перебирались все, отключите переупорядочение: Set-DnsServerForwarder -EnableReordering $false.

Условная пересылка (conditional forwarder) отправляет запросы для одного домена на выбранные серверы. Она нужна, например, для домена партнёра или другого леса:

Add-DnsServerConditionalForwarderZone -Name 'partner.example' `
    -MasterServers '198.51.100.53' -ReplicationScope 'Forest'

Параметр -UseRecursion не указан намеренно: так при неответе целевых серверов запрос не уйдёт другими путями. DNS Manager, напротив, создаёт условную пересылку с разрешённым откатом. Условную пересылку нельзя создать на имя зоны, которая размещена на этом же сервере. Рекурсию разрешайте только доверенным клиентам и не публикуйте DNS контроллера в интернет.

Старение и очистка устаревших записей

Записи, которые компьютеры создали сами, остаются в зоне и тогда, когда компьютера уже нет или у него сменился адрес. Репликация AD их не удаляет. Устаревшая A-запись в зоне с безопасными обновлениями мешает другому компьютеру зарегистрировать то же имя. Для чистки есть два независимых механизма: старение (aging, зона хранит метку времени записи) и очистка (scavenging, сервер удаляет записи, у которых метка слишком старая).

Значения по умолчанию такие:

Параметр Значение
Очистка и старение выключены
Интервал без обновления (no-refresh) 7 дней
Интервал обновления (refresh) 7 дней
Период запуска очистки 7 дней

Запись удаляется, если метка времени плюс оба интервала раньше текущего времени сервера, то есть при настройках по умолчанию через 14 дней без обновления плюс до одного периода очистки. Записи, созданные вручную без параметра -AgeRecord, получают метку 0: они статические, и очистка их не трогает. После включения старения зона получает отсрочку в один интервал обновления.

Неверная настройка удаляет действующие записи, поэтому действуйте осторожно: сначала выгрузите зону для сверки (это не копия для восстановления), включайте очистку только на одном сервере зоны и не делайте интервал обновления короче, чем клиенты успевают перерегистрироваться.

Export-DnsServerZone -Name 'lab.example' -FileName 'lab.example.txt'
Set-DnsServerScavenging -ScavengingState $true `
    -ScavengingInterval 7.00:00:00
$aging = @{
    Name              = 'lab.example'
    Aging             = $true
    NoRefreshInterval = '7.00:00:00'
    RefreshInterval   = '7.00:00:00'
    ScavengeServers   = '192.168.10.11'
}
Set-DnsServerZoneAging @aging
Get-DnsServerScavenging
Get-DnsServerZoneAging -Name 'lab.example'

Выгрузка попадёт в C:\Windows\System32\dns. Параметр ScavengeServers ограничивает очистку зоны сервером DC1; общий переключатель очистки хранится на самом сервере и не реплицируется. Результаты проходов смотрите в журнале DNS-сервера: событие 2501 — удалённые записи, 2502 — удалять было нечего. Принудительный проход делает Start-DnsServerScavenging -Verbose, но лучше дождаться планового. В небольшой сети, где записи не накапливаются, очистку можно не включать вовсе.

Откат: отключите старение зоны и очистку на сервере (интервал 0 по описанию параметра отключает очистку; проверьте результат Get-DnsServerScavenging).

Set-DnsServerZoneAging -Name 'lab.example' -Aging $false
Set-DnsServerScavenging -ScavengingState $false `
    -ScavengingInterval 0.00:00:00

Зоны со старением, отключённым в параметрах, очистка пропускает. Уже удалённые записи возвращает перерегистрация: на клиентах ipconfig /registerdns, на контроллерах перезапуск Netlogon (раздел «Диагностика»). Записи серверов и принтеров, которые нельзя терять, создавайте без -AgeRecord.

Кэш и TTL

DNS-клиент и DNS-сервер кэшируют ответы на срок TTL. Записи, которые регистрирует Netlogon, получают TTL 10 минут, записи DHCP-клиента 15 минут, а собственные записи DNS-сервера 20 минут. После смены адреса клиенты могут видеть старый до окончания TTL. Кэш сервера очищает Clear-DnsServerCache -Force, кэш компьютера — Clear-DnsClientCache или ipconfig /flushdns. На зоны очистка кэша не влияет. Если вы поменяли запись, а клиент видит старый ответ, спросите сервер напрямую: nslookup <имя> 192.168.10.11. Что лежит в кэше клиента и как отвечать только из него, описано в статье про DNS.

Диагностика

Двигайтесь от клиента к серверу.

  1. Что видит клиент. ipconfig /all или Get-DnsClientServerAddress: нет ли чужих адресов.
  2. Что отвечает сервер. Спросите контроллер напрямую и сравните ответы DC1 и DC2:
nslookup -type=SRV _ldap._tcp.dc._msdcs.lab.example 192.168.10.12

Пример вывода (формат приблизительный; в строке Server nslookup показывает имя, найденное по адресу сервера):

Server:  dc2.lab.example
Address:  192.168.10.12

_ldap._tcp.dc._msdcs.lab.example  SRV service location:
          priority       = 0
          weight         = 100
          port           = 389
          svr hostname   = dc1.lab.example
_ldap._tcp.dc._msdcs.lab.example  SRV service location:
          priority       = 0
          weight         = 100
          port           = 389
          svr hostname   = dc2.lab.example
  1. Проверка DNS контроллера. dcdiag умеет проверять DNS отдельно (по умолчанию этот набор не запускается). Базовый тест проверяет связь, службы (DNS-клиент, Netlogon, центр Kerberos, DNS-сервер), настройки клиента, регистрацию A-записи и наличие зоны:
dcdiag /test:dns /v /s:DC1 /DnsBasic /f:C:\Temp\dns-basic.txt

Откройте файл и найдите в таблице Summary строки Warn и Fail (папка C:\Temp должна существовать). Другие проверки: /DnsForwarders, /DnsDelegation, /DnsRecordRegistration (A, CNAME и SRV-записи), /DnsDynamicUpdate (создаёт и удаляет тестовую запись _dcdiag_test_record), /DnsResolveExtName (разрешение внешнего имени), /DnsAll (всё, кроме внешнего имени). Параметр /e вместо /s проверит все контроллеры леса. Если IPv6 не включён, проверка записей AAAA ожидаемо не пройдёт.

  1. Журнал. В Event Viewer откройте журнал DNS Server (Get-WinEvent -LogName 'DNS Server' -MaxEvents 20): в нём предупреждения и ошибки службы, в том числе события 4013, 2501 и 2502.
  2. Перерегистрация. Если записей нет, перезапустите регистрацию на проблемном контроллере. Netlogon создаст SRV и CNAME заново, а A-запись обновит ipconfig:
net stop netlogon && net start netlogon
ipconfig /flushdns && ipconfig /registerdns

Для DHCP-клиентов вместо /registerdns используйте ipconfig /renew: ручная регистрация обходит DHCP-сервер.

Симптом Вероятная причина Что проверить
Не находится контроллер при входе в DNS клиента чужие адреса Get-DnsClientServerAddress
Нет SRV или CNAME контроллера не работает Netlogon или зона не принимает обновления dcdiag /test:dns /DnsDynamicUpdate, перезапуск Netlogon
Имя ведёт на старый адрес устаревшая запись или кэш Get-DnsServerResourceRecord, очистка кэша
Компьютер не может зарегистрировать имя в зоне с безопасными обновлениями осталась чужая запись удалить её, включить очистку
Внешние имена не разрешаются не работает пересылка Get-DnsServerForwarder, Resolve-DnsName -Server <пересылатель> -DnsOnly
После перезагрузки контроллер 15–25 минут не отвечает контроллер указывает только на себя или на недоступный DNS событие 4013, настройки адаптера

Практика: порядок действий

  1. На DC1 выполните Get-DnsServerZone -Name 'lab.example', '_msdcs.lab.example': обе зоны должны быть AD-интегрированными.
  2. Создайте обратную зону для 192.168.10.0/24 и проверьте её.
  3. Укажите DNS-серверы на DC1 и DC2 (партнёр первым, сам вторым), на клиентах — оба контроллера.
  4. Настройте пересылку на DC1 и DC2 и проверьте Resolve-DnsName www.example.com -Server <контроллер> -DnsOnly.
  5. Добавьте запись nas1 и псевдоним files, убедитесь, что Resolve-DnsName files.lab.example возвращает адрес.
  6. Запустите dcdiag /test:dns /v /s:DC1 /DnsBasic и затем то же для DC2; разберите все Warn и Fail.
  7. Решите про очистку: в небольшой сети начните без неё и вернитесь к вопросу, когда в зоне появятся устаревшие записи.

Типичные ошибки и недоразумения

  • Публичный DNS в настройках клиента или DHCP «на запас». Клиент может обратиться к нему первым и получить окончательное «имени не существует».
  • Правка файла hosts вместо записи в DNS. Имя меняется на одном компьютере, остальные ничего не знают.
  • Небезопасные динамические обновления «чтобы заработало». Любой компьютер может перезаписать запись. Ищите причину, а не ослабляйте защиту.
  • Очистка без подготовки. Включили на нескольких серверах, с короткими интервалами и без выгрузки зоны. Действующие записи исчезают.
  • Удаление «лишних» записей _msdcs, SRV и CNAME. Они нужны для входа и репликации: контроллеры находят друг друга по записям зоны _msdcs. Удаляйте записи конкретного исчезнувшего сервера, а не зону _msdcs; потерянные записи работающего контроллера восстанавливает перезапуск Netlogon.
  • Set-DnsServerForwarder -IPAddress вместо Add-DnsServerForwarder. Старые адреса пропадают.
  • Пересылка настроена только на одном контроллере. После его отказа внешние имена перестанут разрешаться.
  • Сменили адрес контроллера, но не обновили DNS-клиент и записи. Выполните перерегистрацию из раздела о диагностике и проверьте адреса партнёра.
  • Ожидание регистрации по VPN. По умолчанию клиент не обновляет DNS через VPN-подключение, это настраивается в параметрах соединения.

Проверьте себя

  1. Какие записи нужны клиенту, чтобы найти контроллер домена, и кто их создаёт? SRV-записи вроде _ldap._tcp.dc._msdcs.lab.example; SRV и CNAME регистрирует служба Netlogon контроллера, A-запись — DNS-клиент.
  2. Какие DNS-серверы указывают на DC1, DC2 и на клиентах? На DC1 — сначала DC2, затем себя; на DC2 — сначала DC1, затем себя; на клиентах — DC1 и DC2. Внешние DNS не указывают.
  3. Чем AD-интегрированная зона отличается от обычной файловой? Она хранится в каталоге и реплицируется репликацией AD; любой контроллер с DNS принимает изменения; доступны безопасные динамические обновления.
  4. Почему вручную созданная запись не удаляется очисткой и как это изменить? У неё метка времени 0, то есть она статическая; запись, созданная с параметром -AgeRecord, получает метку и подпадает под очистку.
  5. Какой командой проверить базовую работу DNS контроллера DC1? dcdiag /test:dns /v /s:DC1 /DnsBasic; для проверки регистрации записей добавьте /DnsRecordRegistration.

Что дальше

Источники

Ещё по теме «Windows Server»