Непростой протокол. Автоматизируем настройку адресов в 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.

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

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

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

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