Автоматическая настройка IPv6

TL;DR: IPv6 спроектирован с автоконфигурацией «из коробки». Хост получает link-local адрес (fe80::) автоматически, без серверов. Для глобального адреса — SLAAC: маршрутизатор рассылает префикс сети (Router Advertisement), хост дополняет его своим идентификатором. DHCPv6 опционален — нужен только для дополнительных параметров (DNS, NTP) или когда администратор хочет контролировать выдачу адресов.

Зачем это знать

IPv4-адреса исчерпаны (с 2011 года). IPv6 — не «когда-нибудь», а реальность: крупные облака, мобильные операторы, CDN уже работают по IPv6. Главное отличие от IPv4 в контексте настройки — IPv6 не нуждается в DHCP для базовой работы. Хост сам генерирует себе адрес.

Формат адреса IPv6

128 бит, записывается как восемь групп по 4 hex-цифры:

2001:0db8:85a3:0000:0000:8a2e:0370:7334

Правила сокращения:

2001:0db8:85a3:0000:0000:8a2e:0370:7334   полный
2001:db8:85a3:0:0:8a2e:370:7334           убрать ведущие нули
2001:db8:85a3::8a2e:370:7334              :: заменяет группы нулей (один раз)

Типы адресов

ПрефиксТипАналог в IPv4Описание
::1/128Loopback127.0.0.1Сам хост
fe80::/10Link-local169.254.x.xТолько в пределах одного сегмента
2000::/3Global UnicastПубличные IPМаршрутизируемые в интернете
fc00::/7 (fd00::/8)Unique Local10.0.0.0/8, 192.168.0.0/16Частные сети
ff00::/8Multicast224.0.0.0/4Групповая рассылка

В IPv6 нет broadcast. Его функции выполняет multicast (например, ff02::1 — все узлы на link).

Три уровня автоконфигурации

При поднятии интерфейса ядро автоматически генерирует link-local адрес fe80::. Никаких серверов не нужно.

fe80:: + идентификатор интерфейса (из MAC или случайный)
$ ip -6 addr show eth0
inet6 fe80::5054:ff:fe12:3456/64 scope link
#     ↑ link-local, сгенерирован автоматически

Link-local достаточен для общения внутри одного сегмента: Neighbor Discovery, обнаружение маршрутизаторов. Но он не маршрутизируется — для выхода за пределы сегмента нужен глобальный адрес.

2. SLAAC — глобальный адрес без DHCP

SLAAC (Stateless Address Autoconfiguration) — основной механизм автоконфигурации IPv6.

Хост                                   Маршрутизатор
  │                                         │
  │  1. Router Solicitation (RS)            │
  │  "Есть тут маршрутизатор?"             │
  │  dst: ff02::2 (all-routers multicast)  │
  │────────────────────────────────────────→│
  │                                         │
  │  2. Router Advertisement (RA)           │
  │  "Префикс сети: 2001:db8:1::/64        │
  │   Мой адрес: fe80::1                   │
  │   Флаги: A=1 (используй SLAAC)        │
  │   Время жизни: 1800с"                  │
  │←────────────────────────────────────────│
  │                                         │
  ▼
Хост генерирует глобальный адрес:
  2001:db8:1:: + собственный идентификатор
  = 2001:db8:1::5054:ff:fe12:3456/64

Хост добавляет default route:
  default via fe80::1 dev eth0

Маршрутизатор также периодически рассылает RA (обычно каждые 200–600 секунд) на ff02::1 (все узлы) — новые хосты не обязаны отправлять RS, достаточно подождать.

Stateless означает, что маршрутизатор не хранит информацию о том, какие адреса выданы. Каждый хост самостоятельно генерирует уникальный адрес из префикса + идентификатора.

3. DHCPv6 — когда SLAAC недостаточно

SLAAC выдаёт только адрес и gateway. Для DNS, NTP, доменного имени и других параметров нужен DHCPv6 или RDNSS (DNS-информация в RA).

Флаги в Router Advertisement определяют поведение:

ФлагЗначениеРезультат
A=1 (Autonomous)Использовать SLAAC для адресаХост сам генерирует IP
M=1 (Managed)Использовать DHCPv6 для адресаХост запрашивает IP у DHCPv6
O=1 (Other)Использовать DHCPv6 для доп. параметровSLAAC для IP, DHCPv6 для DNS и т.д.

Типичная конфигурация: A=1, O=1 — адрес через SLAAC, DNS через DHCPv6 (или RDNSS в RA).

Генерация идентификатора интерфейса

64 бита адреса — префикс сети (от маршрутизатора), 64 бита — идентификатор интерфейса (генерирует хост).

МетодОписаниеПриватность
EUI-64 (из MAC)52:54:00:12:34:56::5054:00ff:fe12:3456Плохая: MAC = fingerprint
Stable Privacy (RFC 7217)Хеш от MAC + префикса + секретаХорошая: стабильный, но не отслеживаемый
Temporary (RFC 8981)Случайный, меняется со временемОтличная: для исходящих соединений

Современные дистрибутивы по умолчанию используют Stable Privacy + Temporary адреса:

$ ip -6 addr show eth0
inet6 2001:db8:1::a1b2:c3d4:e5f6:7890/64 scope global dynamic mngtmpaddr
#     ↑ stable privacy (основной)
inet6 2001:db8:1::8f2e:7d41:3b19:cafe/64 scope global temporary dynamic
#     ↑ temporary (для исходящих соединений, меняется)
inet6 fe80::5054:ff:fe12:3456/64 scope link
#     ↑ link-local
# Проверить метод генерации
sudo sysctl net.ipv6.conf.eth0.addr_gen_mode
# 0 = EUI-64, 2 = Stable Privacy, 3 = Random
 
# Включить Privacy Extensions (temporary addresses)
sudo sysctl net.ipv6.conf.eth0.use_tempaddr=2

Neighbor Discovery Protocol (NDP)

NDP заменяет несколько протоколов IPv4: ARP, ICMP Router Discovery, ICMP Redirect. Работает поверх ICMPv6.

СообщениеФункцияАналог IPv4
Router Solicitation (RS)Запрос маршрутизатора
Router Advertisement (RA)Ответ маршрутизатора с параметрами
Neighbor Solicitation (NS)Резолвинг IPv6 → MACARP Request
Neighbor Advertisement (NA)Ответ с MAC-адресомARP Reply
DAD (Duplicate Address Detection)Проверка уникальности адресаGratuitous ARP

DAD — перед использованием сгенерированного адреса хост отправляет NS на этот адрес. Если кто-то отвечает — адрес занят, генерируется другой.

Настройка IPv6 в Linux

# Проверить IPv6
ip -6 addr show
ip -6 route show
 
# Отключить IPv6 (если не нужен)
sudo sysctl net.ipv6.conf.all.disable_ipv6=1
sudo sysctl net.ipv6.conf.default.disable_ipv6=1
 
# Включить обратно
sudo sysctl net.ipv6.conf.all.disable_ipv6=0
 
# Проверить что IPv6 работает
ping -6 ::1                    # loopback
ping -6 fe80::1%eth0           # link-local (нужен %interface)
curl -6 https://ipv6.google.com

Указание интерфейса через %eth0 обязательно для link-local адресов — они не уникальны глобально (каждый интерфейс имеет свой fe80:: адрес).

Dual Stack: IPv4 + IPv6

Большинство современных систем работают в режиме dual stack — оба протокола одновременно. Приложения пытаются сначала IPv6, потом IPv4 (определяется /etc/gai.conf).

$ ip addr show eth0
inet 192.168.1.100/24 ...              # IPv4
inet6 2001:db8:1::a1b2:c3d4/64 ...    # IPv6 global
inet6 fe80::5054:ff:fe12:3456/64 ...   # IPv6 link-local

Подводные камни

ПроблемаСимптомРешение
Нет глобального IPv6-адресаТолько fe80:: (link-local)Маршрутизатор не отправляет RA. Проверить: rdisc6 eth0, настроить RA на роутере
connect: Network unreachable по IPv6Нет default routeip -6 route — должен быть default via fe80::.... Проблема с RA
Медленное подключение к сайтамТаймаут IPv6, потом fallback на IPv4Если IPv6 не работает — отключить: sysctl net.ipv6.conf.all.disable_ipv6=1
ping6 fe80::1Invalid argumentНе указан интерфейсping6 fe80::1%eth0 — для link-local нужен %iface
Несколько IPv6-адресов на интерфейсеЭто нормальноLink-local + global + temporary — штатное поведение

Связанные материалы

  • networking — стек TCP/IP, IPv4, подсети, маршрутизация
  • dhcp — DHCPv4, DORA, lease
  • configure-network — nmcli, netplan, статический IP