Learning Platform
Глоссарий Troubleshooting
Урок 06.04 · 18 мин
Начальный
IPv6Dual-stackSLAACLink-local

IPv6 — 128 бит, бесконечные адреса и почему мы всё ещё на IPv4

IPv4 закончился: новые блоки в IANA не выдаются с 2011 года. Решение, спроектированное ещё в 1995, — IPv6 с 128-битным адресным пространством. Это 2^128 = 340 ундециллионов адресов. Достаточно, чтобы дать каждому атому в человеческом теле триллион IP. И всё же в 2026 году значимая часть интернета всё ещё на IPv4.

В этом уроке разберём формат IPv6, чем он лучше и хуже IPv4, как живут в смешанном (dual-stack) окружении, и почему миграция растянулась на 30 лет. Знать IPv6 нужно DE, потому что облака, мобильный интернет и даже домашние сети всё чаще приходят с IPv6 по умолчанию.

Что такое syscall — граница процесс/ядро

128 бит — запись в hex

В IPv4 32 бита записывались как 4 десятичных октета. В IPv6 128 бит записываются как 8 групп по 4 hex-цифры, разделённых двоеточием.

Пример полного адреса:

2001:0db8:0000:0000:0000:ff00:0042:8329

Это 128 бит, разбитые на 8 групп по 16 бит каждая.

IPv6 -- 128 бит -> 8 групп по 4 hex-цифры
2001Первая группа. 16 бит = 4 hex-цифры. Каждая hex-цифра = 4 бита
0db8Вторая группа
0000Третья группа -- все нули
0000Четвёртая -- тоже нули
0000Пятая
ff00Шестая
0042Седьмая
8329Восьмая (последняя)

Длинно. Поэтому есть две правила сокращения:

1. Убираем leading zeros в каждой группе.

2001:0db8:0000:0000:0000:ff00:0042:8329
->
2001:db8:0:0:0:ff00:42:8329

2. Заменяем самую длинную цепочку нулей на :: (один раз!).

2001:db8:0:0:0:ff00:42:8329
->
2001:db8::ff00:42:8329

:: означает «дополни нулями до 128 бит». Это сокращение можно использовать только один раз в адресе, иначе непонятно, сколько именно групп заменено.

Примеры:

  • ::1 — IPv6 loopback (эквивалент 127.0.0.1). Это 7 групп нулей + 1.
  • :: — unspecified address (эквивалент 0.0.0.0).
  • fe80::1 — link-local адрес fe80:0:0:0:0:0:0:1.
  • 2001:4860:4860::8888 — Google Public DNS IPv6 (2001:4860:4860:0:0:0:0:8888).

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

В IPv6 принято делить адрес на две части по 64 бита:

  • Network prefix — 64 бита (первая половина).
  • Interface identifier — 64 бита (вторая половина).

То есть стандартная подсеть в IPv6 — /64. Каждая такая подсеть имеет 2^64 адресов (это в 4 миллиарда раз больше, чем весь IPv4!). Подсеть меньше /64 — редкость и часто не работает.

IPv6-адрес: 64 + 64
2001:0db8:abcd:1234Первые 64 бита -- network prefix. Назначает ISP, IANA-делегации, организация. Это как IPv4 'network address'
0001:0203:0405:0607Последние 64 бита -- Interface ID. Уникален в рамках подсети. Может генерироваться из MAC (EUI-64), быть случайным (privacy) или статичным
ХостХост получает /64 -- по сути 'безлимит'. Все 2^64 адресов в его распоряжении. Хочешь tor exit node на отдельном IPv6 для каждого соединения? Пожалуйста

Что бывает в первых 64 битах (типичная иерархия):

  • Global routing prefix (первые 48 бит) — назначается ISP’у.
  • Subnet ID (бит 48-64) — организация может разделить на 65,536 подсетей /64 внутри.
  • Interface ID (бит 64-128) — идентификатор устройства внутри подсети.

Типы IPv6-адресов

Не все IPv6-адреса одинаковы. Есть несколько важных категорий.

1. Global unicast (2000::/3). Публичные адреса, маршрутизируемые в интернете. Адреса вида 2001:..., 2607:... и т.д. Их выдаёт IANA через регистраторов. Это «настоящий» интернет-IPv6.

2. Link-local (fe80::/10). Аналог 169.254.X.X в IPv4. Каждый IPv6-интерфейс автоматически получает link-local адрес fe80::<EUI-64>. Используется для общения внутри сегмента, не маршрутизируется. ARP в IPv6 заменён на Neighbor Discovery, и он использует link-local.

3. Unique local (fc00::/7, fd00::/8). Аналог приватных IPv4 (10/8, 172.16/12, 192.168/16). Используются внутри организаций, не маршрутизируются в интернете. На практике используются меньше, чем 10.X.X.X в IPv4 — проще получить пул global unicast.

4. Loopback (::1/128). Один-единственный адрес ::1. Эквивалент 127.0.0.1. (В отличие от IPv4, где целый /8 — здесь только один адрес.)

5. Multicast (ff00::/8). Аналог IPv4 multicast, но активно используется самим протоколом (Neighbor Discovery, OSPF и др.).

6. Документации (2001:db8::/32). Аналог 192.0.2.X в IPv4 — для книг и примеров. Не маршрутизируется.

Категории IPv6-адресов
2000::/3Global unicast. Публичный интернет. Адреса 2001:..., 2607:..., 2a00:..., и т.д.
fe80::/10Link-local. Авто-назначается каждому интерфейсу. Только внутри сегмента, не маршрутизируется
fc00::/7Unique local addresses (ULA). Аналог 10.0.0.0/8 в IPv4. Для приватных сетей
::1/128Loopback. Один адрес, не /8 как в IPv4
ff00::/8Multicast. Активно используется самим IPv6: Neighbor Discovery, MLD, OSPF, и т.д.
2001:db8::/32Документация. Используйте в примерах, статьях, обучающих материалах

SLAAC — как хост получает IPv6 без DHCP

В IPv4 для получения IP обычно используется DHCP. В IPv6 есть альтернатива — SLAAC (Stateless Address Autoconfiguration). Хост сам себе генерирует IPv6 без сервера. Алгоритм:

  1. Хост поднимает интерфейс. Сразу же получает link-local адрес fe80::<EUI-64>. EUI-64 — модифицированный MAC + дополнительные биты.
  2. Шлёт Router Solicitation (RS) на multicast ff02::2 (все роутеры). «Кто здесь роутер?»
  3. Роутер отвечает Router Advertisement (RA): «Я роутер. Подсеть — 2001:db8::/64. Default gateway — мой link-local fe80::1.»
  4. Хост берёт префикс 2001:db8::/64, генерирует interface ID (либо из MAC, либо случайно), получает свой global адрес 2001:db8::<id>.
  5. Шлёт Duplicate Address Detection (DAD) — «есть тут кто с таким IP?» Если ответили — генерирует новый.
  6. Готово, у хоста IPv6.
SLAAC -- хост сам конфигурирует IPv6
Host upСразу получает link-local fe80::EUI-64. Никаких внешних запросов
RS
RouterСлушает на ff02::2 (multicast 'all routers'). Принимает RS
RouterШлёт RA с информацией о префиксе подсети, default gateway, MTU, DNS-сервере
RA
HostПолучает prefix, генерирует interface ID, формирует global adress 2001:db8::xxxx
DADDuplicate Address Detection -- хост проверяет, что никто другой не занял тот же IP
ГотовМожно ходить в интернет по IPv6

SLAAC — революция: не нужен DHCP сервер. Только роутер с RA. Это снижает сложность сети.

Однако есть DHCPv6 — работает похоже на DHCPv4, выдаёт IP плюс дополнительные опции. Современные сети часто используют гибрид: SLAAC даёт адрес, DHCPv6 даёт DNS-сервер и другие настройки.

В Linux:

# Посмотреть IPv6:
ip -6 addr show

# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
#     inet6 2001:db8::a683:e7ff:fe1a:bbcc/64 scope global dynamic mngtmpaddr
#     inet6 fe80::a683:e7ff:fe1a:bbcc/64 scope link

# Виден link-local (fe80::) и global (2001:...). Оба сосуществуют.

Заметьте: a683:e7ff:fe1a:bbcc в interface ID — это EUI-64 от MAC a4:83:e7:1a:bb:cc. Алгоритм EUI-64:

  1. MAC = a4:83:e7:1a:bb:cc.
  2. Вставляем ff:fe в середину: a4:83:e7:ff:fe:1a:bb:cc.
  3. Инвертируем второй младший бит первого октета: a4 (10100100) -> a6 (10100110).
  4. Получаем a6:83:e7:ff:fe:1a:bb:cc.
  5. Группируем по 16 бит: a683:e7ff:fe1a:bbcc.

С точки зрения приватности — проблема: ваш MAC «утекает» в IPv6, и сайты могут отслеживать вас по нему. Решение — temporary addresses (RFC 4941) — ОС генерирует случайные IPv6 и периодически их меняет. По умолчанию включено в Windows и macOS, опционально в Linux.


Dual-stack — IPv4 и IPv6 одновременно

В переходный период (который уже 30 лет идёт) большинство хостов и сервисов работают в dual-stack — имеют и IPv4, и IPv6, могут принимать соединения по обоим. Как клиент выбирает?

Happy Eyeballs (RFC 8305) — алгоритм, реализованный в браузерах и современных HTTP-клиентах:

  1. Делаем DNS-запрос на example.com. Получаем AAAA (IPv6) и A (IPv4) записи.
  2. Параллельно пытаемся соединиться по IPv6 и IPv4.
  3. Кто первый ответит — тем и идём. IPv6 даём небольшой приоритет (~250 мс fora).
  4. Если IPv6 быстрее — используем его. Если медленнее или не работает — fallback на IPv4.

Это решает «IPv6 broken pipe» проблему: если у пользователя IPv6 настроен, но не работает — браузер не зависнет, быстро переключится на IPv4.

# Проверить, идёт ли соединение по IPv6 или IPv4:
curl -v https://www.google.com 2>&1 | grep 'Connected'
# Connected to www.google.com (2607:f8b0:4004:c08::65) port 443
# -- это IPv6

# Принудить на IPv4:
curl -4 https://www.google.com -v 2>&1 | grep 'Connected'
# Connected to www.google.com (142.251.40.196) port 443

# Принудить на IPv6:
curl -6 https://www.google.com -v 2>&1 | grep 'Connected'

Что IPv6 даёт и не даёт

Плюсы:

  1. Огромное адресное пространство. Никакого NAT, каждое устройство имеет глобально уникальный адрес.
  2. End-to-end connectivity. Любой может достучаться до любого — ваш домашний компьютер может быть сервером без проброса портов.
  3. Auto-configuration (SLAAC). Сеть проще — не нужно DHCP.
  4. Built-in security (IPsec). В стандарте есть поддержка IPsec, в IPv4 это надстройка.
  5. Простой заголовок. Меньше полей, нет fragmentation в роутерах, нет header checksum.
  6. Multicast вместо broadcast. Чище, эффективнее.

Минусы / почему не везде:

  1. Legacy. Миллионы серверов, файрволов, балансировщиков — настроены на IPv4. Менять страшно и дорого.
  2. Кадры. Сетевики и админы привыкли мыслить десятичными октетами. 2001:db8:abcd:1234::5 — не так удобно.
  3. NAT в IPv4 даёт «бесплатный файрвол». Любой хост за NAT недоступен извне. В IPv6 хосту нужен явный stateful firewall, иначе он голый в интернете.
  4. Поддержка приложений. Некоторые legacy-приложения не поддерживают IPv6.
  5. Привычка к 192.168.X.X. Локалки на IPv6 — редкость.

В 2026 году:

  • ~40% трафика Google идёт по IPv6.
  • AWS, GCP, Azure поддерживают IPv6, но IPv4 всё ещё дефолт.
  • Мобильные сети США и Индии — почти полностью IPv6 (T-Mobile, Reliance Jio).
  • Многие домашние провайдеры выдают IPv6, но клиенты не пользуются.

Попробуй сам

# 1. Посмотреть свои IPv6:
ip -6 addr show
# Увидите link-local (fe80::) на каждом интерфейсе
# Если есть global -- увидите 2001:..., 2a00:..., 2607:... или подобные

# 2. Пинг по IPv6:
ping6 ::1                       # loopback
ping6 google.com                # внешний хост (если IPv6 настроен)
ping6 2001:4860:4860::8888      # Google Public DNS IPv6

# 3. DNS-запрос AAAA:
dig +short AAAA google.com
# 2607:f8b0:4004:c08::65 ...

# 4. Узнать публичный IPv6:
curl -6 ifconfig.me 2>/dev/null || echo "No IPv6 connectivity"

# 5. Сравнить latency IPv6 vs IPv4:
ping -c 5 -4 google.com
ping -c 5 -6 google.com

# 6. Посмотреть IPv6 routing table:
ip -6 route show

# 7. Захватить IPv6-трафик:
sudo tcpdump -i any 'ip6' -c 10
# Увидите ICMPv6 (Neighbor Solicitations, Router Advertisements)

# 8. Узнать link-local адрес соседа:
ping6 -I eth0 ff02::1   # multicast 'all nodes'
# Каждый сосед в сегменте ответит со своего link-local адреса

Особенно интересно: каждый IPv6-хост сразу имеет link-local, даже без интернета. Это всегда работает — пингаешь fe80::%eth0 или используешь interface scope.


Проверка знанийKnowledge check
У вашего домашнего интернета есть IPv6, провайдер выдаёт SLAAC. Каждый раз когда вы перезагружаете ноутбук, его IPv6 МЕНЯЕТСЯ. На вашем NAS вы хотите настроить SSH доступ по IPv6 -- но запоминать постоянно новый адрес неудобно. Что делать?
ОтветAnswer
Несколько решений: 1) Найти причину смены и зафиксировать. Современные ОС включают по умолчанию temporary addresses (RFC 4941) -- генерируют случайные IPv6 и меняют их периодически (1-7 дней) ради приватности. На Linux это управляется через 'sysctl net.ipv6.conf.eth0.use_tempaddr' (0 = выкл, 1 = вкл, 2 = вкл и предпочитать). На macOS -- 'sysctl -w net.inet6.ip6.use_tempaddr=0' (требует sudo). После отключения адрес будет стабильным EUI-64 из MAC. 2) Использовать DNS вместо IP. Настроить динамический DNS (например, через freedns.afraid.org для IPv6) -- ноутбук на каждом старте обновляет AAAA-запись для имени laptop.example.com, NAS идёт по имени. 3) Использовать link-local. Внутри одной локалки fe80::%интерфейс работает всегда, и он стабильный (генерится из MAC). На NAS: ssh user@fe80::a683:e7ff:fe1a:bbcc%eth0. Знак %eth0 говорит SSH, через какой интерфейс ходить (link-local не уникален между интерфейсами). 4) Дать ноутбуку статический IPv6 в локалке (Unique Local Address fd00::/8). Все три устройства получают fdXX:: адреса фиксированно, провайдерская динамика становится неважной для внутреннего использования.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. Сколько бит у IPv6-адреса и как он записывается?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5