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-адреса. Возьмём двоичное представление адреса. Нам важен первый байт, а точнее – младший и следующий за ним биты. Поскольку по сети они будут передаваться задом-наперед, их с одинаковым успехом можно называть «первый» и «второй», либо «седьмой» и «восьмой».

    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.
    • +29
    • 26,5k
    • 9
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 9
    • +2
      Спасибо, некоторых деталей я не знал. Мотивация понятна и разумна.

      А вот почему такой странный алгоритм EUI-48 -> EUI-64? За ним какая мотивация?
      • +3
        У IEEE уже были идентификаторы EUI-48, которые состоят из 24 бит OUI (ID фирмы) ии ещё 24 бит, которые фирма сама придумывает, как хочет. EUI-64 — это тоже 24 бит OUI + 40 бит на полёт фантазии производителя.

        Простой пример: ваш завод выпускает космолёты X-1, X-2 и так далее. Примерно на X-7 приходит понимание, что нумерацию нужно расширить и сделать двузначной. Для «обратной совместимости» старые модели тоже получат такую нумерацию и будут обозначаться, например Х-01, Х-02 и так далее. Единственное отличие, что IEEE решила, что не Х-01, а Х-91 (т.е. под это выделили не начало, а конец нового диапазона).
        • +3
          Из забавного: изначально MAC-48 и EUI-48 обозначали разные вещи и даже считались разными адресными пространствами. Позднее в IEEE передумали и сказали, что это все неправильно произносят EUI-48 как MAC, и вообще это одно и то же.

          Ещё забавнее, что IPv6 делали до того, как IEEE приравняла MAC-48 и EUI-48. И вообще-то в стандарте записано, что MAC-48 -> EUI-64 делается с помощью вставки FF FF, а EUI-48 -> EUI-64 использует FF FE.

          То есть разработчики IPv6 «накосячили», перепутав один вариант с другим. А потом IEEE их приравняла, и ошибка перестала быть ошибкой.
      • +1
        Спасибо. Буду надеется, что продолжение следует.
        • 0
          На здоровье! По мере сил буду добавлять ещё статьи, благо интересных, но непонятных тем в IPv6 много.
        • +2
          Продолжайте)) IPv6 — актуальная, новая и интересная тема.
          • 0
            Китайские аннотации к фиг. 1 символизируют некий умысел?
            • +1
              МАС-адрес
              Двоичное представление
              Вставка FFFE
              (?)
              EUI-64 адрес

              Видимо никакого умысла, картинка H3C
              • 0
                А вы не заметили, что рынок домашних и начальных soho-маршрутизаторов на over99% захвачен китайцами? И то же самое с втыкаемыми в эти маршрутизаторы юзерскими девайсами (мат.платами, смартфонами, планшетами, ноутбуками и прочими пылесосами)?
                Так что пора, пора осваивать иероглифы…

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