Статья Автор: Деникина Н.В., Деникин А.В.

Алгоритм EUI-64: генерация IPv6 из MAC-адреса

Зачем нужен EUI-64?

IPv6-адрес состоит из 128 бит. Обычно он делится на две части:

  • Префикс сети (64 бита) — назначается провайдером или администратором
  • Идентификатор интерфейса (64 бита) — уникальный адрес устройства в сети

EUI-64 (Extended Unique Identifier — расширенный уникальный идентификатор) — это алгоритм, который позволяет автоматически сгенерировать вторую часть IPv6-адреса из MAC-адреса сетевой карты.

Структура IPv6-адреса
|←──────────── 128 бит ────────────→|

|←── 64 бита ──→|←──── 64 бита ────→|
┌───────────────┬───────────────────┐
│  Префикс сети │   Идентификатор   │
│  (от провайд.)│    интерфейса     │
└───────────────┴───────────────────┘
                      ↑
                 Генерируется
                 из MAC-адреса
                 по EUI-64
      
💡 Преимущество EUI-64

Устройство может само сформировать свой IPv6-адрес без DHCP-сервера! Достаточно знать префикс сети и свой MAC-адрес.

Структура MAC-адреса

Прежде чем разбирать алгоритм, вспомним, что такое MAC-адрес.

📚 MAC-адрес

MAC-адрес (Media Access Control) — это уникальный аппаратный адрес сетевого устройства, «прошитый» производителем.

  • Размер: 48 бит (6 байт)
  • Формат: AA:BB:CC:DD:EE:FF
  • Пример: 00:1A:2B:3C:4D:5E
Структура MAC-адреса (48 бит)
|←─────────────── 48 бит ───────────────→|

|←─── 24 бита ───→|←──── 24 бита ────→|
┌─────────────────┬─────────────────────┐
│       OUI       │   Уникальный номер  │
│  (код произв.)  │     устройства      │
└─────────────────┴─────────────────────┘
    AA:BB:CC            DD:EE:FF
    
OUI = Organizationally Unique Identifier
      (идентификатор производителя)
      

Проблема: MAC = 48 бит, а нужно 64 бита

MAC-адрес содержит 48 бит, а для идентификатора интерфейса в IPv6 нужно 64 бита. Где взять недостающие 16 бит?

Решение: вставить фиксированную последовательность FF:FE (16 бит) в середину MAC-адреса.

MAC (48 бит):     AA:BB:CC  :  DD:EE:FF
                     ↓    вставляем    ↓
EUI-64 (64 бита): AA:BB:CC : FF:FE : DD:EE:FF
    

Алгоритм EUI-64: пошаговая инструкция

📝 Исходные данные для примера

MAC-адрес: 00:1A:2B:3C:4D:5E

1 Разделяем MAC-адрес на две половины
MAC: 00:1A:2B:3C:4D:5E

Первая половина:  00:1A:2B  (OUI — код производителя)
Вторая половина:  3C:4D:5E  (уникальный номер)
      
2 Вставляем FF:FE между половинами
00:1A:2B  +  FF:FE  +  3C:4D:5E

Результат: 00:1A:2B:FF:FE:3C:4D:5E
      

Теперь у нас 64 бита (8 байт) вместо 48 бит (6 байт).

3 Инвертируем 7-й бит первого байта

Это самый сложный шаг. Нужно изменить один конкретный бит в первом байте.

Первый байт: 00 (в шестнадцатеричной системе)

Переводим в двоичную:

Бит 7 6 5 4 3 2 1 0
До 0 0 0 0 0 0 0 0
После 0 1 0 0 0 0 0 0

0000000000000010 = 02 (hex)

Было:  00:1A:2B:FF:FE:3C:4D:5E
Стало: 02:1A:2B:FF:FE:3C:4D:5E
      
4 Записываем в формате IPv6

Группируем байты по два и добавляем двоеточия в стиле IPv6:

EUI-64: 02:1A:2B:FF:FE:3C:4D:5E

Группируем: 02:1A | 2B:FF | FE:3C | 4D:5E

IPv6 формат: 021A:2BFF:FE3C:4D5E
      
✓ Итоговый результат

MAC: 00:1A:2B:3C:4D:5E
EUI-64: 021A:2BFF:FE3C:4D5E

Если префикс сети 2001:db8:1:2, то полный IPv6-адрес:
2001:db8:1:2:021A:2BFF:FE3C:4D5E

Что такое 7-й бит и зачем его инвертировать?

7-й бит первого байта MAC-адреса называется U/L бит (Universal/Local — универсальный/локальный).

Структура первого байта MAC-адреса
Первый байт MAC-адреса:

Бит:    7    6    5    4    3    2    1    0
        │    │    │    │    │    │    │    │
        │   U/L  │    │    │    │    │    │
        │    │    │    │    │    │    │    │
       I/G  ───  остальные биты ─────────────

I/G = Individual/Group (одиночный/групповой)
U/L = Universal/Local (универсальный/локальный)
      
Значение 7-го бита (U/L) Тип адреса Что означает
0 Universal (глобальный) Адрес назначен производителем, уникален во всём мире
1 Local (локальный) Адрес изменён администратором вручную
💡 Почему инвертируем?

В MAC-адресах большинство карт имеют U/L = 0 (заводской адрес).
В IPv6 решили инвертировать этот бит, чтобы:

  • Адреса, созданные из настоящих MAC, имели бит = 1
  • Адреса, назначенные вручную, имели бит = 0

Это упрощает идентификацию: если видите 02, 06, 0A, 0E и т.д. в начале — скорее всего, адрес создан из MAC.

Быстрый способ инвертировать 7-й бит

Чтобы инвертировать 7-й бит, нужно выполнить XOR с числом 2 (в hex: 02).

Первый байт XOR 02 = Новый первый байт

Примеры:
00 XOR 02 = 02
02 XOR 02 = 00
0A XOR 02 = 08
C0 XOR 02 = C2
    
💡 Ещё проще: таблица изменений второй hex-цифры

7-й бит влияет на вторую цифру первого байта (при записи в hex):

Было 0 1 2 3 4 5 6 7 8 9 A B C D E F
Стало 2 3 0 1 6 7 4 5 A B 8 9 E F C D

Например: 0002, 0C0E, 1A18

Ещё примеры

MAC-адрес Шаг 1-2: вставили FF:FE Шаг 3: инверсия бита EUI-64 (IPv6 формат)
00:1A:2B:3C:4D:5E 00:1A:2B:FF:FE:3C:4D:5E 02:1A:2B:FF:FE:3C:4D:5E 021A:2BFF:FE3C:4D5E
08:00:27:AB:CD:EF 08:00:27:FF:FE:AB:CD:EF 0A:00:27:FF:FE:AB:CD:EF 0A00:27FF:FEAB:CDEF
AC:DE:48:12:34:56 AC:DE:48:FF:FE:12:34:56 AE:DE:48:FF:FE:12:34:56 AEDE:48FF:FE12:3456
02:00:00:00:00:01 02:00:00:FF:FE:00:00:01 00:00:00:FF:FE:00:00:01 0000:00FF:FE00:0001

Как определить EUI-64 «на глаз»?

🔍 Признаки EUI-64 в IPv6-адресе

Если в идентификаторе интерфейса (последние 64 бита) вы видите:

  • FF:FE в середине — это почти наверняка EUI-64
  • Группы 5 и 6 выглядят как xxFF:FExx
Пример адреса: 2001:db8:1:2:021A:2BFF:FE3C:4D5E
                            └──────────────────┘
                            Это EUI-64: виден FF:FE
      

Обратная задача: извлечь MAC из EUI-64

📝 Пример: дан EUI-64, найти MAC

EUI-64: 021A:2BFF:FE3C:4D5E

1 Записываем побайтово
02:1A:2B:FF:FE:3C:4D:5E
2 Убираем FF:FE из середины
02:1A:2B:FF:FE:3C:4D:5E  →  02:1A:2B:3C:4D:5E
3 Инвертируем 7-й бит обратно
02:1A:2B:3C:4D:5E  →  00:1A:2B:3C:4D:5E
✓ Результат

MAC-адрес: 00:1A:2B:3C:4D:5E

Алгоритм EUI-64: краткая шпаргалка

📋 MAC → EUI-64
  1. Раздели MAC на две половины: XX:XX:XX | YY:YY:YY
  2. Вставь FF:FE между ними: XX:XX:XX:FF:FE:YY:YY:YY
  3. Инвертируй 7-й бит первого байта (XOR 02)
  4. Запиши в формате IPv6: XXXX:XXFF:FEYY:YYYY
Печать