Непростой протокол. Автоматизируем настройку адресов в IPv6

IPv6 печально знаменит своей сложностью, во многом — оправданно. Взамен наследия IPv4 появились новые концепции и варианты настройки. Авторы стека протоколов IPv6 хотели сделать его более дружественным к конечным пользователям и самонастраивающимся сетям. Увы, простота для пользователя нередко оборачивается сложностями для админа.

В IPv4 есть всего два варианта: статическая настройка адреса и шлюза по умолчанию или DHCP. Сегодня мы рассмотрим в деталях, что же пришло на смену классическому DHCP из IPv4, как оно работает и как с этим жить.

Нужно помнить, что в IPv6 наконец исчез целый ряд устаревших технологий. В частности, в нем больше нет широковещательной рассылки (broadcast), во всех протоколах ее заменила многоадресная рассылка (multicast) и стандартизованные групповые адреса: например, ff02::1 — все хосты в сегменте, ff02::2 — все маршрутизаторы.

Кроме того, не все механизмы автоматической настройки требуют участия сервера или маршрутизатора.

Адреса link-local

Начнем с концепции адресов типа link-local. Они выделяются из сети ff00::/8 и присваиваются каждой сетевой карте при загрузке системы. В отличие от IPv4, в IPv6 их использование обязательно. Это позволяет каждому устройству иметь адрес и взаимодействовать с другими устройствами той же сети, независимо от того, успешно ли отработали другие механизмы настройки и включены ли они вообще.

Для рассылки пакетов через multicast нужен адрес источника, а broadcast в IPv6, как мы помним, нет. Именно поэтому наличие адреса на самом раннем этапе загрузки особенно важно. В IPv4 с его массовым применением широковещательной рассылки эту проблему «решали», используя адрес 0.0.0.0 вместо адреса источника или назначения.

Изолированная сеть теоретически может работать на одних адресах link-local, с точки зрения хостов они неотличимы от любых других. Различие существует только для маршрутизаторов, которые по стандарту обязаны не пересылать пакеты с link-local в адресе назначения в другие сети.

На практике, конечно, от сети мало пользы без соединения с интернетом или другими частными сетями, поэтому перейдем к механизмам настройки публичных адресов.

Эта идея не нова: в IPv4 они уже существовали и выделялись из сети 169.254.0.0/16, но широкого распространения не приобрели. Одна из причин этого — сложно предотвратить конфликты адресов. Успешная реализация этой идеи требует достаточно надежных и практичных способов обеспечить адресам хостов уникальность. Посмотрим, как эта проблема решается в IPv6.

Уникальные адреса хостов

Стандартный размер сети для одного сегмента канального уровня в IPv6 — /64. Это очень много — 2^64 адресов! Казалось бы, абсурдная идея, но для нее есть основания. В 64 бита можно поместить существующий глобально уникальный идентификатор или сгенерировать случайный с очень низкой вероятностью конфликтов.

Каждый заводской MAC-адрес гарантированно уникален, поэтому можно избежать потенциальных конфликтов адресов навсегда, просто использовав MAC-адрес сетевой карты как часть ее адреса IPv6. Этот механизм называется EUI-64 (Extended Unique Identifier). В деталях про него можно прочитать в приложении к RFC 2373.

Размер MAC-адреса — 48 бит (шесть байт), а нам нужно 64, поэтому он делится на две части по три байта и в середину вставляется магическое число 0xFFFE. Кроме того, инвертируется седьмой бит MAC-адреса — у глобально уникальных он по умолчанию установлен в ноль.

Поскольку адреса типа link-local не маршрутизируются, никаких проблем с приватностью такой подход не создает. Для присвоения публичных адресов он, очевидно, проблематичен — злоумышленник с доступом к дампам трафика или логам сервера легко может отождествить адреса из разных сетей — например, из дома, с работы или публичной точки доступа Wi-Fi в гостинице — с одним устройством и отследить перемещения пользователя.

В современном мире это далеко не самая большая угроза приватности, так что мы не будем рассматривать механизмы борьбы с ней в деталях, но они существуют. Один вариант, IPv6 privacy extensions, описан в RFC 3041. Важнее то, что в IPv6, вернее в NDP — эквивалент ARP, встроен механизм выявления коллизий адресов. Узлы сначала присваивают адресу состояние tentative и ждут, не придет ли пакет NDP с этим адресом в источнике. Если такой пакет приходит, адрес не активируется.

Таким образом, идея автоматически сгенерированных адресов применима и к локальным адресам, и к публичным. Для настройки нужен только адрес сети.

Маршрутизаторы при настройке сетевых карт нередко позволяют указать вручную только адрес сети, но оставить систему генерировать идентификатор хоста самостоятельно: например, interface Gi0; ipv6 address 2001:db8::/64 eui-64 в Cisco IOS, set interfaces ethernet eth0 ipv6 address eui64 2001:db8::/64 в VyOS. Хосты адрес своей сети обычно не знают, поэтому его нужно получить из внешнего источника. Тут и вступает в действие SLAAC (StateLess Address AutoConfiguration) через router advertisement.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Даниил Батурин: Координатор проекта VyOS (https://vyos.io), «языковед», функциональщик, иногда сетевой администратор