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

SLAAC (автоконфигурация адресов IPv6)

Плата на ESP32 включилась в сеть IPv6 и через секунду-две уже имеет link-local адрес, а после первого Router Advertisement — и глобальный. Ни одного запроса к серверу: адрес она составила сама. Это SLAAC, и из-за него в сетях IPv6 часто не нужен DHCP.

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

SLAAC (Stateless Address Autoconfiguration, автоконфигурация адресов IPv6 без сохранения состояния) — механизм RFC 4862, по которому узел IPv6 формирует адреса сам: сначала link-local адрес из известного префикса и идентификатора интерфейса, затем глобальные адреса из префиксов, которые маршрутизатор объявляет в Router Advertisement. Никто не ведёт базу выданных адресов — отсюда слово «stateless». Сообщения RS, RA, NS и NA, которыми всё это делается, относятся к Neighbor Discovery.

Как узел получает адрес

ШагЧто происходитИсточник
1Интерфейс включён; узел собирает link-local адрес: префикс FE80::0 + идентификатор интерфейсаRFC 4862 разд. 5.3
2DAD: Neighbor Solicitation с адресом в поле Target, источник — неопределённый адрес, назначение — solicited-node multicast; перед отправкой случайная пауза 0…1 сразд. 5.4.2, RFC 4861 разд. 10
3Ответа нет за RetransTimer (1000 мс по умолчанию) — адрес назначен; пришёл Neighbor Advertisement — адрес дубликат, его назначать нельзяразд. 5.1, 5.4.5
4Хост шлёт Router Solicitation (до 3 штук с интервалом 4 с) и ждёт Router AdvertisementRFC 4861 разд. 6.3.7, 10
5Из каждой опции Prefix Information с флагом A: префикс + идентификатор интерфейса = новый адрес, тоже через DADRFC 4862 разд. 5.5.3

Шаги 1–3 выполняют и хосты, и маршрутизаторы; шаги 4–5 — только хосты (разд. 4 и 5). Автоконфигурация работает лишь на интерфейсах с поддержкой multicast, потому что и DAD, и RS/RA опираются на групповые адреса IPv6. Чтобы не ждать последовательно, узел может делать DAD для link-local адреса параллельно с ожиданием RA (разд. 4). Идентификатор интерфейса на Ethernet обычно строится из MAC-адреса, и если link-local адрес оказался дубликатом, RFC 4862 (разд. 5.4.5) предписывает отключить IPv6 на интерфейсе: скорее всего, в сети два устройства с одинаковым MAC, и другим адресом это не лечится.

Времена жизни

У каждого адреса два таймера из опции Prefix Information (RFC 4861 разд. 4.6.2): preferred lifetime и valid lifetime, оба 32-битные в секундах, 0xffffffff — бесконечность. Пока идёт preferred, адрес годится для новых соединений. После его истечения адрес становится deprecated: существующие соединения продолжаются, новые должны выбирать другой адрес (RFC 4862 разд. 5.5.4). По истечении valid адрес удаляется. Link-local адрес живёт бесконечно (разд. 5.3). Против атаки «подделанный RA с коротким временем жизни» действует правило двух часов (разд. 5.5.3): неаутентифицированный RA не может сократить оставшийся valid lifetime ниже 2 часов, а preferred — может.

Где настраивается на микроконтроллере

В ESP-IDF стек lwIP поддерживает только автоконфигурацию без сохранения состояния, и по умолчанию она выключена: без CONFIG_LWIP_IPV6_AUTOCONFIG плата на ESP32 имеет только link-local или статический адрес. Опция включает SLAAC на всех интерфейсах сразу (в upstream lwIP её ставят на каждом netif). Адреса DNS в сети IPv6 приходят либо опцией RDNSS в RA, либо через stateless DHCPv6 — полноценный DHCPv6 с выдачей адресов в lwIP отсутствует, в отличие от DHCP для IPv4. Для проводного подключения всё то же относится к стеку, который описан в статье «Ethernet для микроконтроллеров».

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

Чем SLAAC отличается от DHCPv6?

При SLAAC адрес собирает сам узел: префикс берёт из Router Advertisement маршрутизатора, идентификатор интерфейса — свой, и никакой сервер не хранит, кому какой адрес выдан. DHCPv6 — отдельный сервер с базой выданных адресов. RFC 4862 (разд. 4) допускает оба механизма одновременно, а флаги M и O в RA говорят хосту, что доступно через DHCPv6. В ESP-IDF lwIP поддерживает только SLAAC и stateless DHCPv6 для параметров вроде DNS.

Что такое DAD и сколько он длится?

Duplicate Address Detection — проверка, что адрес никто не занял: узел шлёт Neighbor Solicitation с проверяемым адресом в поле Target на его solicited-node multicast-адрес и ждёт. По умолчанию DupAddrDetectTransmits = 1 и RetransTimer = 1000 мс (RFC 4862 разд. 5.1, RFC 4861 разд. 10), перед отправкой — случайная задержка до 1 с. Итого до 2 с на один адрес (наш расчёт). Если пришёл Neighbor Advertisement с этим адресом, адрес назначать нельзя.

Почему устройство на ESP32 получило только link-local адрес fe80::?

По документации ESP-IDF ни SLAAC, ни DHCPv6 не включены по умолчанию — lwIP формирует только link-local адрес или использует статический. Для автоконфигурации по Router Advertisement нужно включить CONFIG_LWIP_IPV6_AUTOCONFIG, и тогда опция действует на все сетевые интерфейсы. Глобальный адрес появится только после RA с опцией префикса, у которой установлен флаг A.

Источники

  1. IETF. S. Thomson, T. Narten, T. Jinmei. IPv6 Stateless Address Autoconfiguration. RFC 4862, September 2007 — разд. 4: автоконфигурация только на интерфейсах с поддержкой multicast; сначала link-local адрес из известного префикса и идентификатора интерфейса, затем проверка «предварительного» (tentative) адреса через Neighbor Solicitation; при дубликате автоконфигурация останавливается и нужна ручная настройка; дальнейшие шаги выполняют только хосты; Router Solicitation к группе всех маршрутизаторов; в RA — опции Prefix Information с флагом autonomous, префиксом и временами preferred/valid; хост может использовать SLAAC и DHCPv6 одновременно; DAD по умолчанию для всех адресов (ручных, SLAAC, DHCPv6), отключается флагом интерфейса; link-local можно формировать параллельно с ожиданием RA; разд. 5.1: DupAddrDetectTransmits по умолчанию 1, RetransTimer из RFC 4861 — пауза между NS и ожидание после последнего; разд. 5.3: link-local = префикс FE80::0 + идентификатор интерфейса, бесконечные preferred и valid lifetime; разд. 5.4.2: NS с Target = проверяемый адрес, источник — неопределённый адрес, назначение — solicited-node multicast, перед этим случайная задержка 0…MAX_RTR_SOLICITATION_DELAY; разд. 5.4.5: дубликат нельзя назначать; если link-local построен из аппаратного адреса (EUI-64), работу IP на интерфейсе следует отключить; разд. 5.5.3: опция префикса игнорируется без флага A, для link-local префикса и при preferred > valid; сумма длины префикса и идентификатора должна быть 128 бит; valid lifetime из неаутентифицированного RA не укорачивается ниже 2 часов; разд. 5.5.4: по истечении preferred адрес становится deprecated — для старых соединений годится, для новых нет
  2. IETF. T. Narten, E. Nordmark, W. Simpson, H. Soliman. Neighbor Discovery for IP version 6 (IPv6). RFC 4861, September 2007 — разд. 4.6.2: опция Prefix Information — флаг L (on-link), флаг A (autonomous), Valid Lifetime и Preferred Lifetime — 32 бита в секундах, 0xffffffff — бесконечность; разд. 6.3.7: хост шлёт до MAX_RTR_SOLICITATIONS запросов RS с интервалом RTR_SOLICITATION_INTERVAL; разд. 10: MAX_RTR_SOLICITATION_DELAY 1 с, RTR_SOLICITATION_INTERVAL 4 с, MAX_RTR_SOLICITATIONS 3, RETRANS_TIMER 1000 мс
  3. Espressif. ESP-IDF Programming Guide v6.1, ESP32: lwIP — разд. IPv6 Support: поддержка IPv6 ограничена автоконфигурацией без сохранения состояния, stateful нет ни в ESP-IDF, ни в upstream lwIP; ни SLAAC, ни DHCPv6 по умолчанию не включены — устройство использует только link-local или статические адреса; CONFIG_LWIP_IPV6_AUTOCONFIG включает автоконфигурацию по RA для всех интерфейсов (в upstream lwIP — netif->ip6_autoconfig_enabled = 1 на каждом); адреса DNS — через RDNSS (CONFIG_LWIP_IPV6_RDNSS_MAX_DNS_SERVERS, по умолчанию 0) или stateless DHCPv6
Страница помогла?

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