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-клиент контроллера должен смотреть сначала на партнёра и только потом на себя.
Оставить комментарий могут только зарегистрированные пользователи.
Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.