IPv6-адреса через EUI-64: Точки над i
В этой небольшой статье (ещё раз) объясняется, зачем в 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-адреса. Возьмём двоичное представление адреса. Нам важен первый байт, а точнее — младший и следующий за ним биты. Поскольку по сети они будут передаваться задом-наперед, их с одинаковым успехом можно называть «первый» и «второй», либо «седьмой» и «восьмой».
За картинку спасибо 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.