Windows Server для самых маленьких. Часть 9: DHCPv6

Все части серии «Windows Server для самых маленьких»

В IPv4 клиент без DHCP не знает ничего: ни адреса, ни шлюза, ни DNS. В IPv6 — наоборот: адрес и шлюз машина получает от роутера по Neighbor Discovery без всякого сервера, и это описано в частях 14 и 15 сетевой серии. Сам протокол DHCPv6 — сообщения Solicit, Advertise, Request, Reply, идентификаторы DUID, многоадресная рассылка ff02::1:2 — разобран в части 16. Здесь — о том, какое место остаётся для DHCPv6 рядом с SLAAC, как это место занимает сервер Windows, и чем IPv6-область отличается от IPv4-области из прошлой части.

Короткая версия для тех, кто решает, нужна ли эта часть: в домене из Windows-машин с одним роутером DHCPv6 можно не поднимать вовсе. Длинная версия — почему, и когда всё-таки нужно.


Кто что выдаёт

Три источника настроек у IPv6-хоста, и они не взаимозаменяемы:

                    Адрес      Шлюз    DNS-серверы   Суффикс   Другие опции
                                                               (NTP, PXE, …)
 RA от роутера      SLAAC      да      RDNSS         DNSSL     нет
 DHCPv6 stateless   нет        нет     да            да        да
 DHCPv6 stateful    да         нет     да            да        да

Шлюз всегда приходит из Router Advertisement — в DHCPv6 нет опции маршрутизатора, и это сделано намеренно: роутер, объявляющий себя, и есть лучший источник информации о себе. Поэтому без RA IPv6-хост не заработает, даже если DHCPv6 выдаст ему адрес и всё остальное, а значит, DHCPv6 — всегда дополнение к RA, а не замена.

Адрес приходит либо из SLAAC (флаг A у префикса в RA: хост сам составляет адрес из префикса и своего идентификатора интерфейса), либо от DHCPv6 (stateful), либо и то, и другое: у хоста тогда два адреса из одного префикса. Какой режим использовать, хосту говорит роутер двумя флагами в заголовке RA:

  • M (Managed address configuration) — «получи адрес по DHCPv6»;
  • O (Other configuration) — «получи остальные настройки по DHCPv6».

Сочетания: M=0, O=0 — только RA, DNS берётся из RDNSS; M=0, O=1 — адрес из SLAAC, DNS и прочее из DHCPv6 (stateless); M=1 — адрес из DHCPv6, и O при этом подразумевается. Флаги выставляет роутер, и DHCPv6-сервер на них никак не влияет: самая частая причина, по которой «DHCPv6 настроен, а клиенты к нему не идут» — флаги в RA не подняты. На Cisco это ipv6 nd managed-config-flag и ipv6 nd other-config-flag на интерфейсе, у radvd на Linux — AdvManagedFlag on и AdvOtherConfigFlag on, у MikroTik — параметры managed-address-configuration и other-configuration в ND. Если роутером работает Windows Server с ролью маршрутизации, флаги задаются на интерфейсе:

Set-NetIPInterface -InterfaceAlias Ethernet -AddressFamily IPv6 -Advertising Enabled -AdvertiseDefaultRoute Enabled -ManagedAddressConfiguration Enabled -OtherStatefulConfiguration Enabled

DNS-серверы в чистом SLAAC приходят опцией RDNSS в том же RA, суффиксы поиска — опцией DNSSL. Windows понимает RDNSS начиная с Windows 10 1703 и Windows Server 2019, Linux и macOS — давно, Android — только так: адрес и DNS по DHCPv6 он не запрашивает (DHCPv6-клиент появился в нём в 2025 году, но только для делегирования префиксов), и сеть, где DNS раздаётся исключительно по DHCPv6, оставляет телефоны без IPv6-резолвера.


DUID и IAID

В IPv4 клиент опознаётся MAC-адресом. В DHCPv6 — DUID (DHCP Unique Identifier), один на машину, а не на интерфейс, и IAID (Identity Association Identifier) — номер интерфейса внутри машины. Резервирование привязывается к паре DUID + IAID.

DUID бывает четырёх типов; Windows использует DUID-LLT: тип 1, тип канала, время создания и MAC-адрес первого адаптера на момент создания. Он генерируется один раз при первой загрузке, хранится в реестре и дальше не меняется, даже если адаптер заменили:

PS C:\> ipconfig /all | Select-String 'DUID|IAID'
   DHCPv6 IAID . . . . . . . . . . . : 101193053
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-2E-5A-7B-1C-00-15-5D-01-02-10

PS C:\> [BitConverter]::ToString((Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters').Dhcpv6DUID)
00-01-00-01-2E-5A-7B-1C-00-15-5D-01-02-10

00-01 — тип DUID-LLT, 00-01 — Ethernet, 2E-5A-7B-1C — секунды с 1 января 2000, дальше MAC. Следствие для резервирований: переустановленная машина получает новый DUID (новое время), и резервирование по старому DUID перестаёт срабатывать, хотя MAC тот же. Поэтому для принтеров и подобного оборудования в IPv6 чаще делают статические адреса или полагаются на SLAAC с идентификатором из MAC (EUI-64), который у устройства постоянен.


Область IPv6

Та же роль DHCP Server из прошлой части, тот же набор командлетов с v6 в имени. Область задаётся префиксом, и префикс всегда /64:

PS C:\> Add-DhcpServerv6Scope -Prefix 2001:db8:1:: -Name 'Office v6' -Preference 0 -State Active
PS C:\> Get-DhcpServerv6Scope

Prefix                  Name        State    Preference  PrefLifetime  ValidLifetime  T1          T2
------                  ----        -----    ----------  ------------  -------------  --          --
2001:db8:1::            Office v6   Active   0           8.00:00:00    12.00:00:00    4.00:00:00  6.09:36:00

Четыре времени вместо одного срока аренды: preferred lifetime — пока адрес можно использовать для новых соединений (8 дней), valid lifetime — пока существующие соединения с него ещё работают (12 дней), T1 и T2 — когда клиент идёт продлевать к тому же серверу (Renew) и к любому (Rebind). Это те же понятия, что у адресов из RA, и клиент управляет адресом от DHCPv6 так же, как адресом из SLAAC: устаревший (deprecated) адрес после preferred lifetime не исчезает, а перестаёт выбираться для новых соединений.

Диапазона внутри области нет. В /64 восемнадцать квинтиллионов адресов, и сервер Windows выдаёт их случайно из всего префикса, а не по порядку. Адреса, которые нельзя выдавать, задаются исключениями: Add-DhcpServerv6ExclusionRange -Prefix 2001:db8:1:: -StartRange 2001:db8:1:: -EndRange 2001:db8:1::ffff закроет первые 65 536 адресов под серверы и оборудование, хотя вероятность, что случайный адрес попадёт в этот диапазон, и так ничтожна.

Preference — опция 7 протокола: клиент, получивший Advertise от нескольких серверов, выбирает того, у кого значение выше, а при 255 — берёт сразу, не дожидаясь остальных. Это и есть замена failover, к которой мы вернёмся.

Опции задаются на уровне сервера и области; шлюза среди них нет, и это не ошибка:

PS C:\> Set-DhcpServerv6OptionValue -DnsServer 2001:db8:1::10 -DomainSearchList corp.example.com
PS C:\> Get-DhcpServerv6OptionValue -Prefix 2001:db8:1:: -All | Format-Table OptionId, Name, Value -AutoSize

OptionId Name                        Value
-------- ----                        -----
      23 DNS Recursive Name Server   {2001:db8:1::10}
      24 Domain Search List          {corp.example.com}
Опция Имя Зачем
23 DNS Recursive Name Server DNS-серверы; аналог опции 6 IPv4 и RDNSS
24 Domain Search List суффиксы поиска; аналог 15 и 119
31 SNTP Servers время по SNTP
56 NTP Server время по NTP (разные опции для двух протоколов)
39 Client FQDN имя клиента для регистрации в DNS; аналог 81
59 Boot File URL загрузка по сети: URL загрузчика вместо пары 66/67
16 Vendor Class класс производителя; Windows шлёт MSFT 5.0

Адрес DNS-сервера в опции 23 должен быть IPv6-адресом контроллера: dc1 для этого нужен статический IPv6-адрес (New-NetIPAddress -IPAddress 2001:db8:1::10 -PrefixLength 64), и он должен быть зарегистрирован в зоне как AAAA. Клиент Windows, у которого есть и IPv4-, и IPv6-адрес DNS-сервера, спрашивает по IPv6 первым, так что ошибка в этой опции замедляет разрешение имён у всех: запрос сначала уходит на адрес, где DNS-сервера нет, и ждёт таймаута.

Резервирование — по DUID и IAID из ipconfig /all клиента:

PS C:\> Add-DhcpServerv6Reservation -Prefix 2001:db8:1:: -IPAddress 2001:db8:1::31 -ClientDuid '00-01-00-01-2A-11-22-33-00-11-22-33-44-55' -Iaid 50331682 -Name 'printer-3'

Stateless

Если роутер поднял только флаг O, клиенты не просят адрес: они шлют Information-Request с нужными опциями и получают Reply без адреса. Серверу Windows для этого ничего отдельно включать не нужно: опции уровня сервера он отдаёт по Information-Request всем, область нужна лишь затем, чтобы по адресу ретранслятора или интерфейса подобрать опции конкретного сегмента. Арендой такой обмен не считается и в Get-DhcpServerv6Lease не попадает: сервер не хранит состояние, отсюда и название. Если stateless-клиентов всё же нужно учитывать, сервер умеет вести их отдельный список: Set-DhcpServerv6StatelessStore -Prefix 2001:db8:1:: -Enabled $true -PurgeInterval 1.00:00:00 включает его для области, а Get-DhcpServerv6StatelessStatistics показывает, сколько таких клиентов в каждом префиксе.

Stateless — компромисс для сетей, где адреса пусть делает SLAAC, а DNS нужно раздавать клиентам, не понимающим RDNSS (Windows до 1703, часть сетевого оборудования), или где нужны опции, которых в RA не бывает: NTP, загрузка по сети. Если таких клиентов нет, флаг O можно не поднимать, и клиенты обойдутся RA.


Регистрация в DNS

Клиент Windows регистрирует свои AAAA-записи сам, тем же безопасным обновлением, что и A-записи: для адреса из SLAAC, для адреса из DHCPv6, для статического. Временные адреса (privacy extensions — случайный идентификатор, меняющийся раз в сутки, по умолчанию включённый у клиентов Windows) он не регистрирует, и это правильно: иначе зона заполнялась бы мусором. Но временный адрес — тот, с которого клиент устанавливает исходящие соединения, и в журналах серверов он будет виден именно таким. На серверах временные адреса отключают командой Set-NetIPv6Protocol -UseTemporaryAddresses Disabled из части 2: сервер должен отвечать и ходить в сеть с адреса, который есть в DNS.

За клиентов, которые не регистрируются сами, это делает сервер — по опции 39, с теми же настройками, что в IPv4, но отдельным командлетом:

PS C:\> Set-DhcpServerv6DnsSetting -DynamicUpdates OnClientRequest -DeleteDnsRROnLeaseExpiry $true -NameProtection $false

Учётная запись для обновлений (Set-DhcpServerDnsCredential) общая для IPv4 и IPv6. Обратная зона 0.0.0.0.1.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa из части про DNS принимает PTR-записи от сервера и от клиентов точно так же, как 1.168.192.in-addr.arpa.


Два сервера без failover

Failover в Windows DHCP работает только для IPv4. Для IPv6 его не сделали, и причина в устройстве адресации: два сервера, выдающие случайные адреса из одного /64, за всё время существования сети не выдадут один адрес дважды с вероятностью, которой можно пренебречь, а если выдадут — клиент обнаружит дубликат проверкой DAD по Neighbor Discovery и попросит другой. Синхронизировать аренды незачем.

Поэтому отказоустойчивость для IPv6 — просто два сервера с одинаковой областью. Когда в части 10 появится dc2 с установленной ролью, на нём создают ту же область, а список DNS-серверов на обоих серверах дополняют вторым контроллером:

PS C:\> Add-DhcpServerv6Scope -ComputerName dc2.corp.example.com -Prefix 2001:db8:1:: -Name 'Office v6' -Preference 0 -State Active
PS C:\> Set-DhcpServerv6OptionValue -ComputerName dc2.corp.example.com -DnsServer 2001:db8:1::10, 2001:db8:1::11 -DomainSearchList corp.example.com
PS C:\> Set-DhcpServerv6OptionValue -ComputerName dc1.corp.example.com -DnsServer 2001:db8:1::10, 2001:db8:1::11 -DomainSearchList corp.example.com

Клиент посылает Solicit на ff02::1:2, получает Advertise от обоих, выбирает по preference (при равных — первый ответивший) и продлевает аренду у того, кто её выдал: Renew уходит на тот же ff02::1:2, но с идентификатором выбранного сервера, и отвечает только он. Если он молчит до T2, клиент шлёт Rebind без идентификатора сервера, на него отвечает любой, и второй сервер выдаст ему новый адрес. Клиент какое-то время живёт с двумя адресами, затем первый устаревает. Для клиента это неотличимо от смены адреса при переезде в другую сеть, и IPv6 к такому готов по построению. Резервирования и исключения на двух серверах нужно держать одинаковыми руками: Export-DhcpServer с Import-DhcpServer переносят и IPv6-конфигурацию.

Ретрансляция из других подсетей работает как в IPv4: ретранслятор на роутере (ipv6 dhcp relay destination, dhcrelay -6) заворачивает Solicit в сообщение Relay-Forward с адресом канала клиента, по которому сервер выбирает область.


Нужен ли DHCPv6

В домене из современных Windows, Linux и macOS, с одним или двумя роутерами, которые объявляют префикс с RDNSS и DNSSL, DHCPv6 не нужен: все получат адрес, шлюз и DNS из RA (суффикс у членов домена и так есть — это имя домена), зарегистрируют AAAA сами, и единственная настройка — отключить временные адреса на серверах. Контроллер находится через AAAA и SRV так же, как через A.

DHCPv6 stateful нужен, когда:

  • требуется учёт: кто и когда имел какой адрес, в одном журнале, а не в таблицах соседей всех роутеров;
  • нужны предсказуемые адреса у клиентов без статики — резервирования;
  • есть клиенты без поддержки RDNSS или нужны опции, которых нет в RA (NTP, PXE);
  • политика безопасности требует, чтобы адреса выдавал контролируемый сервер, а не придумывал хост.

Чего DHCPv6-сервер Windows не умеет: делегирования префиксов (DHCPv6-PD, когда роутеру филиала выдают /56 для раздачи по его сетям) — для этого нужен ISC Kea или оборудование провайдера.


Смотрим руками

Откуда у клиента взялся каждый адрес:

PS C:\> Get-NetIPAddress -AddressFamily IPv6 -InterfaceAlias Ethernet | Format-Table IPAddress, PrefixOrigin, SuffixOrigin, AddressState, ValidLifetime -AutoSize

IPAddress                               PrefixOrigin        SuffixOrigin AddressState ValidLifetime
---------                               ------------        ------------ ------------ -------------
2001:db8:1:0:a1b2:c3d4:e5f6:1234        RouterAdvertisement Link         Preferred    29.23:59:50
2001:db8:1:0:7c1e:9a2b:3d4f:5e60        RouterAdvertisement Random       Preferred    6.23:59:50
2001:db8:1:0:f8a3:2c17:9e04:6b5d        Dhcp                Dhcp         Preferred    11.23:58:10
fe80::a1b2:c3d4:e5f6:1234%4             WellKnown           Link         Preferred    Infinite

Четыре адреса на одном интерфейсе: постоянный из SLAAC (Link; идентификатор интерфейса Windows по умолчанию один раз выбирает случайно, а не строит из MAC, как это поменять — в части 2), временный (Random: для новых соединений его берут сутки, живёт он неделю), от DHCPv6 (Dhcp) и link-local. Так выглядит сеть, где роутер поднял и A у префикса, и M: клиент получил адрес обоими способами. Если нужен только DHCPv6, у префикса в RA снимают флаг A.

Что говорит роутер — сам RA в захвате pktmon (фильтр по ICMPv6 — pktmon filter add -t ICMPv6):

Internet Control Message Protocol v6
    Type: Router Advertisement (134)
    Cur hop limit: 64
    Flags: 0xc0, Managed address configuration, Other configuration
    Router lifetime (s): 1800
    ICMPv6 Option (Prefix information : 2001:db8:1::/64)
        Flag: 0xc0, On-link flag(L), Autonomous address-configuration flag(A)
        Valid Lifetime: 2592000
        Preferred Lifetime: 604800
    ICMPv6 Option (Recursive DNS Server 2001:db8:1::10)
    ICMPv6 Option (DNS Search List Option corp.example.com)
    ICMPv6 Option (Source link-layer address : 00:15:5d:01:02:01)

Флаги M и O подняты, у префикса A и L, RDNSS и DNSSL присутствуют: эта сеть раздаёт DNS обоими способами. Шлюз — отправитель этого пакета, его link-local-адрес, и в таблице маршрутов клиента он будет именно таким: Get-NetRoute -AddressFamily IPv6 -DestinationPrefix ::/0 покажет fe80::… в NextHop.

Сам обмен DHCPv6, фильтр pktmon filter add -p 546 -p 547, ipconfig /renew6 на клиенте:

No.  Source                     Destination  Protocol  Info
1    fe80::a1b2:c3d4:e5f6:1234  ff02::1:2    DHCPv6    Solicit XID: 0x8a1f3c CID: 000100012e5a7b1c00155d010210
2    fe80::215:5dff:fe01:20a    fe80::a1b2…  DHCPv6    Advertise XID: 0x8a1f3c CID: 000100012e5a7b1c00155d010210 IAA: 2001:db8:1:0:f8a3:2c17:9e04:6b5d
3    fe80::a1b2:c3d4:e5f6:1234  ff02::1:2    DHCPv6    Request XID: 0x8a1f3c CID: 000100012e5a7b1c00155d010210 IAA: 2001:db8:1:0:f8a3:2c17:9e04:6b5d
4    fe80::215:5dff:fe01:20a    fe80::a1b2…  DHCPv6    Reply XID: 0x8a1f3c CID: 000100012e5a7b1c00155d010210 IAA: 2001:db8:1:0:f8a3:2c17:9e04:6b5d

Весь обмен идёт между link-local-адресами: клиенту ещё нечем больше говорить, а серверу достаточно того же канала. Link-local-адрес dc1 построен из MAC-адреса (EUI-64, ff:fe в середине), потому что на сервере случайные идентификаторы отключены, как советовала часть 2. CID — DUID клиента из реестра. В Solicit клиент Windows прикладывает опцию 3 (IA_NA с IAID), 8 (Elapsed time), 6 (Option Request: 23, 24, 39), 16 (Vendor class MSFT 5.0), 39 (FQDN ws1.corp.example.com). В Reply — адрес с preferred и valid lifetime, опции 23 и 24, и опция 39 с подтверждением, что PTR зарегистрирует сервер.

Аренды и статистика на сервере:

PS C:\> Get-DhcpServerv6Lease -Prefix 2001:db8:1:: | Format-Table IPAddress, ClientDuid, Iaid, HostName, LeaseExpiryTime -AutoSize

IPAddress                         ClientDuid                                  Iaid      HostName              LeaseExpiryTime
---------                         ----------                                  ----      --------              ---------------
2001:db8:1:0:f8a3:2c17:9e04:6b5d  00-01-00-01-2E-5A-7B-1C-00-15-5D-01-02-10   101193053 ws1.corp.example.com  27.10.2026 9:03:12

PS C:\> Get-DhcpServerv6ScopeStatistics -Prefix 2001:db8:1::

Prefix          AddressesFree          AddressesInUse  PendingAdvertises  ReservedAddress  PercentageInUse
------          -------------          --------------  -----------------  ---------------  ---------------
2001:db8:1::    18446744073709551614   1               0                  1                0

AddressesFree — восемнадцать квинтиллионов без двух (выданного и зарезервированного): та самая причина, по которой failover не нужен. PendingAdvertises — адреса, предложенные в Advertise, за которыми клиент ещё не пришёл с Request; если их много, клиенты выбирают другой сервер или не завершают обмен.

Журнал аудита IPv6 — отдельные файлы %SystemRoot%\System32\dhcp\DhcpV6SrvLog-Thu.log с кодами от 11000: 11000 Solicit, 11001 Advertise, 11002 Request, 11003 Confirm, 11004 Renew, 11005 Rebind, 11006 Decline, 11007 Release, 11008 Information Request, 11009 область заполнена, 11022–11024 — запрос, неудача и успех обновления DNS. Отдельного кода для Reply нет: выданный адрес виден по строке Request или Renew. Stateless-клиенты видны по кодам 11008 и 11032 (Information Request от stateless-клиента).


Домен получил полный набор служб адресации, и все они живут на одном сервере. Пора это исправить — не добавлением ещё одной роли, а вторым контроллером, и заодно посмотреть, как два контроллера договариваются о том, у кого правильная копия каталога.

Дальше — часть 10: второй контроллер и репликация. Install-ADDSDomainController, глобальный каталог, как KCC строит топологию, сайты, подсети и связи сайтов, repadmin и чтение его вывода, репликация SYSVOL через DFS-R, и почему DNS-клиент контроллера должен смотреть сначала на партнёра и только потом на себя.

Оставить комментарий могут только зарегистрированные пользователи.

Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.