Перейти к содержанию

DHCPv6

В IPv6 адрес можно собрать самому через SLAAC, но администратору часто нужно знать, кому какой адрес выдан, раздать DNS-серверы или отдать роутеру целый префикс. Для этого есть DHCPv6 — отдельный протокол, не совместимый с DHCP для IPv4 по формату сообщений.

Обновлено Редакция GAW

DHCPv6 (Dynamic Host Configuration Protocol for IPv6) — протокол RFC 8415, по которому сервер выдаёт узлам IPv6 адреса, делегирует префиксы и сообщает параметры вроде DNS-серверов. С DHCP для IPv4 он совпадает по идее, но не по формату: RFC 8415 (разд. 1.2) прямо говорит, что для параметров IPv4 применяют DHCPv4, а объединение двух служб не описано. Альтернатива и дополнение DHCPv6 — SLAAC, при котором адрес собирает сам узел; какой механизм использовать, маршрутизатор подсказывает флагами M и O в Router Advertisement (Neighbor Discovery).

Транспорт и адреса

ПараметрЗначениеИсточник
ТранспортUDPразд. 5
Порт клиента546разд. 7.2
Порт сервера и ретранслятора547разд. 7.2
Адрес для запросов клиентаff02::1:2 — все серверы и ретрансляторы каналаразд. 7.1
Адрес ретранслятор → серверыff05::1:3 — все серверы сайтаразд. 7.1
Адрес источника у клиентаlink-localразд. 5

Клиент не знает, где сервер, и шлёт сообщения на групповой адрес канала; если сервер в другом сегменте, его подменяет ретранслятор, прозрачный для клиента (разд. 5).

Обмены сообщениями

  • Четыре сообщения (разд. 5.2): Solicit → Advertise → Request → Reply. Клиент ищет серверы, получает предложения, выбирает одно и просит подтвердить выдачу.
  • Два сообщения (разд. 5.1): Solicit с опцией Rapid Commit → Reply, если сервер согласен выдать адрес сразу; Information-request → Reply, когда нужны только параметры без адреса; Renew → Reply для продления.
  • Stateless DHCPv6 (разд. 6.1) — сервер не ведёт выдачу адресов и отвечает только на Information-request. Это единственный режим, который есть в lwIP.

Первый Solicit уходит со случайной задержкой до 1 с и повторяется с экспоненциальным ростом интервала до SOL_MAX_RT = 3600 с (табл. 1, разд. 7.6); столько же ждать повторами может и Information-request.

DUID, IA_NA, IA_PD

Клиента и сервер идентифицирует DUID — 2 байта типа и 1…128 байт значения; его сравнивают только на равенство и не разбирают на части, потому что он не обязан содержать текущий MAC-адрес (разд. 11, 11.1). Адреса и префиксы группируются в Identity Association с номером IAID, который выбирает клиент и должен сохранять между перезапусками (разд. 12):

  • IA_NA — постоянные адреса, привязаны ровно к одному интерфейсу, с T1 и T2;
  • IA_PD — делегированные префиксы, к интерфейсу могут не привязываться.

У каждого адреса или префикса есть preferred и valid lifetime из RFC 4862, по T1 клиент идёт продлевать к выдавшему серверу (Renew), по T2 — к любому (Rebind); все времена — 32-битные в секундах, 0xffffffff означает «навсегда» (разд. 4.2, 7.7). Делегирование префикса (разд. 6.3) придумано, чтобы провайдер отдал абоненту целый префикс, а тот нарезал его на свои каналы; самому клиенту при этом не обязательно быть маршрутизатором.

На микроконтроллере

lwIP в ESP-IDF реализует только stateless-режим: опция CONFIG_LWIP_IPV6_DHCP6 плюс обязательный CONFIG_LWIP_IPV6_AUTOCONFIG и вызов dhcp6_enable_stateless(netif), а адрес ESP32 получает по SLAAC. Zephyr, напротив, содержит и клиент, и сервер с делегированием префикса: клиент запрашивает IA_NA и при необходимости IA_PD, а из полученного префикса раздаёт по /64 на нисходящие интерфейсы — префикс длиной L хватает на 2^(64 − L) каналов, так что /64 обслуживает один канал, а более длинный не делится вовсе.

Частые вопросы

Какие порты у DHCPv6?

UDP 546 у клиента и UDP 547 у сервера и ретранслятора (RFC 8415 разд. 7.2). Клиент не знает адреса сервера и шлёт Solicit на групповой адрес ff02::1:2 (все серверы и ретрансляторы канала) с link-local адреса источника. Это не те порты, что у DHCP для IPv4 (67/68), и протоколы друг с другом не совместимы.

Что такое DUID и чем он отличается от MAC-адреса?

DHCP Unique Identifier — идентификатор клиента или сервера: 2 байта типа и от 1 до 128 байт значения (разд. 11.1). Четыре типа: из канального адреса и времени (DUID-LLT), от производителя по Enterprise Number (DUID-EN), из канального адреса (DUID-LL) и UUID. Сервер сравнивает DUID только на равенство и не должен пытаться извлечь из него MAC: DUID не меняется при замене сетевой карты, поэтому для устройства с несколькими интерфейсами он один.

Что такое stateless DHCPv6 и зачем он на ESP32?

Режим из разд. 6.1 RFC 8415: клиент не просит адрес, а одним Information-request получает Reply с параметрами — обычно адресами DNS. Адрес при этом строится по SLAAC. Именно этот режим реализован в lwIP: в ESP-IDF его включают опцией CONFIG_LWIP_IPV6_DHCP6 вместе с CONFIG_LWIP_IPV6_AUTOCONFIG и вызовом dhcp6_enable_stateless(netif); маршрутизатор должен ставить в RA флаг O = 1 при M = 0.

Источники

  1. IETF. T. Mrugalski, M. Siodelski, B. Volz, A. Yourtchenko, M. Richardson, S. Jiang, T. Lemon, T. Winters. Dynamic Host Configuration Protocol for IPv6 (DHCPv6). RFC 8415, November 2018 — разд. 1.2: модели DHCPv4 и DHCPv6 различаются настолько, что объединение не описано, для IPv4-параметров используют DHCPv4; разд. 5: обмен по UDP, клиент использует link-local адрес, большинство сообщений — на link-scoped multicast, ретранслятор (relay agent) прозрачен для клиента; разд. 5.1: двухшаговый обмен Information-request — Reply для параметров без адреса; Solicit с опцией Rapid Commit — сразу Reply; Renew — Reply для продления, 0 в lifetime — продление отклонено; разд. 5.2: четыре сообщения Solicit, Advertise, Request, Reply; разд. 6.1: stateless DHCP — только Information-request и Reply; разд. 6.3: делегирование префикса от delegating router к requesting router, клиенту не обязательно быть маршрутизатором; разд. 7.1: All_DHCP_Relay_Agents_and_Servers ff02::1:2 (link-scoped), All_DHCP_Servers ff05::1:3 (site-scoped); разд. 7.2: клиенты слушают UDP 546, серверы и ретрансляторы — UDP 547; разд. 7.3: SOLICIT 1, ADVERTISE 2, REQUEST 3, CONFIRM 4, RENEW 5; разд. 7.6 табл. 1: SOL_MAX_DELAY 1 с, SOL_TIMEOUT 1 с, SOL_MAX_RT 3600 с, REQ_MAX_RC 10, INF_MAX_RT 3600 с, IRT_DEFAULT 86 400 с, HOP_COUNT_LIMIT 8; разд. 7.7: времена — 32-битные беззнаковые в секундах, 0xffffffff — бесконечность; разд. 11: DUID есть у каждого клиента и сервера, сравнивается только на равенство, не должен меняться при смене сетевого оборудования; разд. 11.1: 2 байта типа + 1…128 байт идентификатора, типы 1 DUID-LLT, 2 DUID-EN, 3 DUID-LL, 4 DUID-UUID; разд. 12: IAID выбирает клиент, он должен сохраняться между перезапусками; разд. 12.1: IA_NA — адреса плюс T1 и T2, ровно один интерфейс; разд. 12.2: IA_PD — префиксы плюс T1 и T2, может не привязываться к интерфейсу; разд. 4.2: T1 — когда обращаться к выдавшему серверу (Renew), T2 — к любому серверу (Rebind)
  2. Espressif. ESP-IDF Programming Guide v6.1, ESP32: lwIP — разд. IPv6 Support: DHCPv6 в lwIP поддерживает только stateless-режим, включается CONFIG_LWIP_IPV6_DHCP6 при включённом CONFIG_LWIP_IPV6_AUTOCONFIG и вызовом dhcp6_enable_stateless(netif); для DNS через stateless DHCPv6 ожидаются флаги RA M = 0, O = 1
  3. Zephyr Project. Zephyr Project Documentation (latest): Networking APIs — DHCPv6 — клиент и сервер, включая делегирование префикса IA_PD; клиент запрашивает IA_NA и может запросить IA_PD (net_dhcpv6_params.request_prefix); нисходящим интерфейсам выдаются отдельные /64 из делегированного префикса и объявляются в RA, нужны CONFIG_NET_IPV6_ND_RA_TX и CONFIG_NET_IPV6_FORWARDING; префикс длиной L обслуживает не более 2^(64 − L) каналов; сервер — CONFIG_NET_DHCPV6_SERVER; Release при остановке отправляется один раз, без повторов REL_MAX_RC
Страница помогла?

Нашли ошибку? ·