IPv6-адреса через EUI-64: Точки над i

В этой небольшой статье (ещё раз) объясняется, зачем в IPv6 адреса генерируются таким странным, на первый взгляд, образом.73ed739e4d034653bc158db94f836593.png

Тех, кто понимает смысл процедуры EUI-48 → EUI-64 → Modified EUI-64, статья вряд ли обогатит новыми знаниями. Остальные — добро пожаловать под кат.По роду деятельности часто приходится слышать комментарий «ЗАЧЕМ?!» по поводу механизма генерации IPv6-адресов с использованием EUI-64. Новичкам в IPv6 кажется, что он назначается так: берём MAC-адрес, добавляем день изготовления устройства, почтовый индекс Уругвая и температуру за бортом, кидаем всё в миксер и получаем уникальный IPv6. Но на самом деле все процедуры имеют вполне простое и понятное объяснение.

Начнём с добавления FFFE.MAC-адреса. Используются во многих протоколах (почти все IEEE 802-точка), в том числе в 802.3 (aka Ethernet) и 802.11 (aka WiFi). 48 бит, шестнадцатеричный формат, все дела.

IEEE считает, что название MAC-48 уже не отражает сути, поэтому правильно говорить «EUI-48».

Кроме 48-битных идентификаторов используются и 64-битные, т.н. EUI-64. Примеры протоколов: FireWire, ZigBee, 802.15.4, 6LoWPAN и, ожидаемо, IPv6.

Плюсы? Например, больше адресов (48 бит кончатся к 2100, бида-бида), а ещё можно включить EUI-48 как подмножество.

Собственно, первый шаг не имеет к IPv6 никакого отношения. IEEE заранее зарезервировал EUI-64 вида [24 бит] FF FE [24 бит] под адреса, полученные из EUI-48. Отсюда и механизм генерации: распилить MAC пополам и между половинками записать FFFE.

Таким образом, на шаге 1 мы просто делаем из EUI-48 (читай, MAC) более длинный EUI-64, который и используется в IPv6.

Шаг 2 — инверсия бита И снова экскурсия в MAC-адреса. Возьмём двоичное представление адреса. Нам важен первый байт, а точнее — младший и следующий за ним биты. Поскольку по сети они будут передаваться задом-наперед, их с одинаковым успехом можно называть «первый» и «второй», либо «седьмой» и «восьмой».

imageЗа картинку спасибо Wikipedia

Самый младший бит зовётся Individual/Group, он же Multicast. Если он равен 0, то адресат — узел. Если 1 — то кадр с таким адресом назначения по умолчанию флудится на все порты.

Пример:

Адреса 01:00:00:00:00:01 и 03:12:34:56:78:90 — multicast. На узлы их назначать нельзя.

Соседний бит — Unique/Local. Определяет, считается ли этот адрес уникальным или локальным (читай: его придумал местный админ). Если бит равен 0, то адрес по идее соответствует какой-либо организации (список, например). Если 1 — скорее всего, сами придумали.

Пример:

Адрес 02:00:00: AB: CD: EF мы придумали сами (U/L бит равен 1), а вот адрес 04: DA: D2: AB: CD: EF, наиболее вероятно, принадлежит какой-то железке от Cisco.

Следствие:

Почти все уникальные MAC-адреса будут иметь первый байт, кратный 4 (04, 08, 0С, 10, 14 и т.д.). У придуманных адресов, соответственно, чётный, но не кратный 4, то есть 02, 06, 0A и так далее.

Классно, но зачем инвертировать бит U/L?

А это как раз для удобства.

Возьмём два роутера. Один постираем обычным порошком будет использовать уникальный MAC, который ему достался в наследство от дедушки-Xerox, а на другой мы назначим свой «блатной» MAC-адрес согласно воле левой пятки админа.

R1-unique#show interfaces Fa0/0 FastEthernet0/0 is administratively down, line protocol is down Hardware is Gt96k FE, address is 0000.0000.0001 (bia 0018.1845.f0e2)

! U/L бит равен 0, значит адрес уникальный (из адресов Xerox) R2-local#show interfaces Fa0/0 FastEthernet0/0 is administratively down, line protocol is down Hardware is Gt96k FE, address is 0200.0000.0001 (bia 0018.1845.f0e2)

! U/L бит равен 1, значит адрес локально назначен Включаем IPv6 на интерфейсе и чувствуем разницу:

R1-unique#sh ipv6 interface brief FastEthernet0/0 [administratively down/down] FE80::200: FF: FE00:1 R2-local#show ipv6 interface brief FastEthernet0/0 [administratively down/down] FE80:: FF: FE00:1 Из-за лишнего хекстета админ первого роутера всё время матерился набирал руками больше символов и вынужден был выйти на пенсию по состоянию здоровья из-за истирания кончиков пальцев об клавиатуру, а второй админ жил долго и счастливо.

Как видим, благодаря инвертированию бита на втором роутере в адресе «сокращается» дополнительный хекстет. Уникальным адресам от инверсии обычно ни жарко, ни холодно, потому что они крайне редко бывают «красивыми». А вот локально назначаемые MAC-адреса позволят таким образом генерировать более удобные IPv6-адреса.

Резюмируя, в IPv6 для получения идентификатора интерфейса MAC-адрес сначала преобразуется к EUI-64 (распил пополам, между половинками вставляется FFFE), а затем для нашего же удобства инвертируется U/L-бит. И теперь понятно, зачем.

Ложка дёгтя: Механизм получения адреса по EUI-64 можно ещё назвать «NSAкина радость»: в любой сети независимо от префикса он будет давать один и тот же достаточно уникальный идентификатор, по которому легко будет проследить перемещение устройства. Поэтому, приватности ради и безопасности для, современные ОС на конечных устройствах генерируют адреса случайным образом.

IPv6 хоть и кажется на первый взгляд пришельцем из космоса, на самом деле является достаточно логичным и даже, о чудо, удобным. Надеюсь, изложенная информация была полезной. И если звёзды сойдутся нужным образом, а лень самопобедится, я постараюсь написать ещё статей на тему IPv6.

© Habrahabr.ru