IPv6

Введение

Эта страница про IPv6. Про IPv4 читайте здесь

Термин Перевод Кол-во бит Кол-во байт Пример (0b) Пример (0x)
Bit Бит 1 - 0 или 1 -
Nibble Ниббл 4 - 1010 0xA
Byte Байт 8 1 11001001 0xС9
Hextet Хекстет 16 2 10101010 01010101 0xAF09

IPv4 Адрес имеет длину 32 бита = 4 байта.

192.168.10.10

11000000 10101000 00001010 00001010

IPv6 Адрес в четыре раза больше 128 бит = 32 ниббла = 16 байт = 8 хекстетов

2001:0DB8:0002:0002:008D:0000:0000:00A5:52F5 0010000000000001:0000110110111000:0000000000000010:0000000000000010:0000000010001101:0000000000000000:0000000000000000:0000000010100101:0101001011110101

Так как половину адреса занимает сетевой адрес, можно сделать вывод, что в обычной сети может бы 2 ** 64 адресов, то есть 18446744073709551616

Компьютерная сеть изображение с сайта www.devhops.site
Компьютерная сеть
Изображение: rudalle.ru

Структура

Сетевой адрес (Network Portion) имеет размер 64 бита

2001:0DB8:0002:008D

Адрес хоста (Host Portion или Interfacte Identifier) также имеет размер 64 бита

0000:0000:00A5:52F5

Полный адрес выглядит следующим образом

2001:0DB8:0002:008D:0000:0000:00A5:52F5

Удаление ведущих нулей

Если полный адрес выглядит слеюдущим образом

2001:0DB8:0002:008D:0000:0000:00A5:52F5

Его можно сократить удалив нули, которые не несут смысловую нагрузку

2001:DB8:2:8D:0:0:A5:52F5

Если в адресе хоста первые хекстеты это нули, их можно заменить на :

2001:DB8:2:8D::A5:52F5

:: разделят адрес на сетевую часть слева и адрес хоста справа.

В адресе может быть только одно ::

Unicast Address

Unicast адреса идентифицируют только один сетевой интерфейс. Протокол IPv6 доставляет пакеты, отправленные на такой адрес, на конкретный интерфейс.

Существуют следующие типы Unicast адресов:

Global Unicast

Публичный адрес который доступен через глобальный интернет

Link-Local

fe80::/10

Адрес только для локальных сетей. Не доступен через глобальный интернет.

Аналог APIPA адресов в IPv4

Разберем подробнее, что означает

fe80::/10

FE80 это

1111 1110 1000 0000

/10 означает, что первые 10 бит должны оставаться неизменными

Первые 10 бит это

1111 1110 10

Оставшиеся 118 бит это адрес интерфейса.

Первый IPv6 адрес типа Link-Local это

1111 1110 1000 0000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000

FE80::

Последний IPv6 адрес типа Link-Local это

1111 1110 1011 1111 1111111111111111 1111111111111111 1111111111111111 1111111111111111 1111111111111111 1111111111111111 1111111111111111

FEBF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

Таким образом диапазон Link-Local адресов начинается с FE80:: и заканчивается на FEBF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

Не все Link-Local адреса начинаются с FE80. Возможны варианты FE8*, FE9*, FEA*, FEB*. Где * это любой Hex от 0 до F

Unique Local Address (ULA)

Адрес только для локальных сетей. Не доступен через глобальный интернет.

Аналог частных адресов в IPv4 но не поддерживает NAT.

FC00::/7

FC00 это

1111 1100 0000 0000

/7 означает, что первые 7 бит должны оставаться неизменными

Первые 7 бит это

1111 110

Оставшиеся 121 бит это адрес интерфейса.

Первый IPv6 адрес типа ULA это

1111 1100 0000 0000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000

FC00::

Последний IPv6 адрес типа ULA это

1111 1101 1111 1111 1111111111111111 1111111111111111 1111111111111111 1111111111111111 1111111111111111 1111111111111111 1111111111111111

FDFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

Loopback

Адрес для трафик на самого себя. Не доступен через глобальный интернет.

Аналог looback адреса 127.0.0.1 в IPv4

::1/128

Multicast Address

Многоадресный адрес идентифицирует группу интерфейсов.

Пакеты, отправленные на многоадресный адрес, доставляются всем членам группы.

Anycast Address

Anycast-адрес назначается нескольким интерфейсам, обычно на разных устройствах.

Трафик, отправленный на Anycast-адрес, доставляется на ближайший интерфейс (с точки зрения маршрутизации).

SLAAC

Stateless Address Auto-configuration.

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

Он делает это независимо и без какой-либо предварительной конфигурации с помощью автоконфигурации адресов без сохранения состояния (SLAAC), используя компонент протокола обнаружения соседей. Этот адрес выбирается с префиксом fe80::/64.

В IPv4 типичными протоколами конфигурации являются DHCP или PPP. Хотя существует DHCPv6, хосты IPv6 обычно используют протокол обнаружения соседей для создания глобально маршрутизируемого одноадресного адреса: хост отправляет запросы на запрос маршрутизатора, а маршрутизатор IPv6 отвечает назначением префикса.

В Windows Interface Identifier создается как случайное 64-х битное число

В Linux и Unix Interface Identifier ранее создавался на основе MAC адреса

SLAAC в Linux

SLAAC в Linux работает путем прослушивания объявлений маршрутизатора IPv6 (RA), изучения префикса /64 сети и автоматической генерации собственного IPv6-адреса — обычно с использованием случайного идентификатора интерфейса (randomized interface identifier).

Linux использует для этого протокол обнаружения соседей IPv6 (NDP - Neighbor Discovery Protocol), и эта функция включена по умолчанию во всех современных дистрибутивах.

Как работает SLAAC в Linux - пошаговый разбор

1. Linux активирует интерфейс

Когда сетевой интерфейс становится активным, ядро автоматически включает автоконфигурацию IPv6, если она не специально не была отключена.

Типичные названия сетевых интерфесов в Linux: eth0, eth1, enp0s3, enp0s8, wlan0

Инициализация интерфейса запускает создание локального адреса IPv6

FE80::/10

Обнаружение дубликатов адресов (DAD - Duplicate Address Detection) проверяет уникальность локального адреса.

2. Linux ожидает уведомлений маршрутизатора (RA)

RA - Router Advertisements

Маршрутизаторы периодически отправляют уведомления маршрутизатора ICMPv6, содержащие:

Префикс сети (обычно /64)

Флаги, указывающие на доступность SLAAC (флаг A)

Информация DNS (RDNSS), если предоставлена

Время жизни маршрутизатора и MTU

Linux также активно запрашивает эту информацию, отправляя запрос маршрутизатора (Router Solicitation), когда интерфейс становится активным.

3. Linux формирует свой IPv6-адрес

После получения уведомления маршрутизатора (RA) Linux генерирует идентификатор интерфейса (IID) и добавляет его к префиксу.

Linux может генерировать IID несколькими способами:

4. Linux выполняет обнаружение дубликатов адресов (DAD)

Перед использованием нового глобального IPv6-адреса Linux отправляет запрос соседа (Neighbor Solicitation), чтобы убедиться, что ни одно другое устройство его не использует.

Если конфликта не обнаружено, адрес становится предпочтительным и готовым к использованию.

5. Linux настраивает маршруты по умолчанию и DNS

Если данные, полученные от роутера (RA), включают в себя

Это завершает SLAAC.

EUI-64

Чтобы из MAC адреса вида

aa:bb:cc:dd:ee:ff

Создать новый IPv6 адрес хоста после 3-го байта добавляется ещё два байта FF:FE

aa:bb:cc:FF:FE:dd:ee:ff

В первом байте инвертируется 7-й бит

aa (1010 1010) превращается в

a8 (1010 1000)

a8:bb:cc:FF:FE:dd:ee:ff

Полезные команды Linux для SLAAC Назначение команды ip -6 addr Показать IPv6-адреса ip -6 route Показать маршруты IPv6 rdisc6 eth0 Просмотреть объявления маршрутизатора sysctl net.ipv6.conf.all.autoconf Проверить статус SLAAC journalctl -u NetworkManager Просмотреть сетевые журналы

Флаги конфигурации SLAAC в Linux net.ipv6.conf...autoconf* → Включает SLAAC net.ipv6.conf...accept_ra* → Принимать объявления маршрутизатора net.ipv6.conf...use_tempaddr* → Включить адреса конфиденциальности

DHCP

Подсети

В IPv4 мы могли выбирать CIDR маску разного размера. В IPv6 в LAN рекомендуется использовать только /64

В особых случаев используются и другие длины префиксов:

Случаи, отличные от /64
/48, /56, /60 делегируются клиентам интернет-провайдерами (для дальнейшего разделения на подсети).
/127 каналы связи точка-точка между маршрутизаторами (предотвращает атаки исчерпания ND).
/128 один адрес хоста (петля обратной связи, идентификатор маршрутизатора).
/96 IPv4-отображенные IPv6-адреса.
/112 иногда используется для подсетей с высокой плотностью устройств (например, IoT), хотя не рекомендуется для обычных локальных сетей.

Адреса вида

2001:DB8::/32

Используются для документации и в лабораториях

Автор статьи: Андрей Олегович