Pull to refresh

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

Reading time 3 min
Views 44K
В этой небольшой статье (ещё раз) объясняется, зачем в IPv6 адреса генерируются таким странным, на первый взгляд, образом.



Тех, кто понимает смысл процедуры 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.
Tags:
Hubs:
+29
Comments 10
Comments Comments 10

Articles