L3 IPv6 — адресация, NDP, SLAAC

IPv6 — не «когда-нибудь потом». Больше половины трафика крупнейших сервисов уже идёт по нему, мобильные операторы выдают v6 по умолчанию, а в собеседованиях CCNA-уровня это обязательный блок. При этом большинство инженеров знает IPv6 «по касательной» — и именно здесь легко выделиться. Разберём с нуля и до рабочего уровня: адреса, автонастройку, NDP вместо ARP, маршрутизацию, диагностику и типовые грабли.

Что узнаешь
Вспомни из прошлых модулей

Модуль 2: ARP и broadcast-домены — сегодня увидишь, чем их заменили. Модуль 4: маска/префикс, сетевая и хостовая части — в IPv6 логика та же, но границы фиксированные. Модуль 5–7: таблица маршрутизации, OSPF и BGP — для IPv6 они те же самые, только адреса длиннее. Если это на месте — IPv6 займёт у тебя один вечер, а не неделю: концепции не поменялись, поменялась запись.

1. Зачем IPv6 — и почему NAT лишь обезболил

IPv4-адресов 232 ≈ 4,3 млрд. Устройств в интернете — десятки миллиардов. Дефицит закрыли костылями: приватные диапазоны, NAT, CG-NAT у операторов (диапазон 100.64.0.0/10 — возможно, ты сам сейчас за ним сидишь). Работает? Работает. Но цена высока:

IPv6 решает проблему в лоб: адрес 128 бит, то есть 2128 ≈ 3,4×1038 адресов. Это не «в 2 раза больше» — это каждому устройству планеты можно раздать по личной вселенной адресов. NAT становится не нужен: каждый холодильник получает глобальный адрес, а безопасность обеспечивает firewall (что правильнее и честнее, чем «безопасность через спрятанность за NAT»).

Сразу зафиксируем установку

IPv6 — это не «IPv4 с длинными адресами». Убрали broadcast, заменили ARP на NDP, автонастройку встроили в сам протокол, фрагментацию перенесли на хосты. Но модель мышления — та же: префикс/хост, таблица маршрутов, longest prefix match. Учишь дельту, а не новый мир.

2. Формат адреса: читаем без паники

128 бит записываются как 8 групп по 16 бит в шестнадцатеричном виде, через двоеточия:

2001группа 1
0db8группа 2
00a3группа 3
0000группа 4
0000группа 5
0000группа 6
02bbгруппа 7
0001группа 8

Полная запись 2001:0db8:00a3:0000:0000:0000:02bb:0001 глазам больно. Поэтому есть два правила сокращения:

Правило 1: ведущие нули в группе можно убрать
0db8db8, 00a3a3, 00011, а вот просто 00000 (один ноль остаётся). Получаем: 2001:db8:a3:0:0:0:2bb:1.
Правило 2: одну самую длинную цепочку нулевых групп можно заменить на «::»
Три подряд группы 0:0:0 сворачиваются в ::. Итог: 2001:db8:a3::2bb:1. Красиво и однозначно: считаем группы — их 5, значит :: прячет ровно 8−5=3 нулевые группы.
Ловушка №1 — двойное «::»

«::» можно использовать только один раз в адресе. Запись 2001::5:0:0:1 и 2001:0:0:5::1 — легальны, а 2001::5::1нет: невозможно понять, сколько нулей прячется в каждом из двух «::». Это любимый вопрос-ловушка в тестах CCNA.

Префиксы пишутся как в CIDR: 2001:db8:a3::/48 — первые 48 бит это сеть. Никаких «масок» вида 255.х в IPv6 нет вообще — только слэш-нотация. И ещё одна деталь: в URL адрес v6 берут в квадратные скобки, потому что двоеточие занято портом: http://[2001:db8::1]:8080/.

3. Типы адресов: три, которые нужны каждый день

ТипПрефиксАналог в IPv4Смысл
Global Unicast (GUA)2000::/3
(всё, что начинается с 2 или 3)
публичный (белый) адрес Маршрутизируется по всему интернету. Выдаёт провайдер/RIR. Пример: 2001:db8:a3::2bb:1
Unique Local (ULA)fc00::/7
(на практике fd…)
приватный (192.168.х, 10.х) Внутренние сети, в интернет не маршрутизируется. Генерируется со случайным «глобальным ID», чтобы при слиянии компаний сети не пересеклись (учтён главный грех RFC1918!)
Link-Localfe80::/10 169.254.х.х… но лишь отчасти! Живёт только внутри одного L2-сегмента, за роутер не выходит. Есть на каждом v6-интерфейсе всегда — см. ниже, это ключ ко всему IPv6
Multicastff00::/8 multicast 224.х + заменяет broadcast Группы «кому надо — те слушают»: ff02::1 — все узлы линка, ff02::2 — все роутеры линка, ff02::5 — OSPF-роутеры
Loopback::1/128127.0.0.1«Сам себе». Один адрес вместо целой сети /8

Главное озарение модуля: link-local — рабочая лошадка IPv6

В IPv4 адрес 169.254.х.х — признак поломки («DHCP не ответил»). В IPv6 всё наоборот: link-local адрес есть на каждом интерфейсе, всегда, и это норма. Интерфейс поднялся — хост сам собрал себе fe80::… ещё до всяких DHCP и роутеров. И на этих адресах держится вся внутренняя механика:

Ловушка №2 — «%интерфейс»

Link-local адреса одинаковы во всех сегментах (fe80::/10 везде), поэтому системе нужно указывать, через какой интерфейс ты обращаешься: ping fe80::1%eth0 (Linux), ping fe80::1%12 (Windows, номер интерфейса), ping fe80::1%Vlan10 (Cisco). Забыл zone-id — получишь ошибку «invalid argument» и полчаса недоумения.

Вопрос с собеседования: почему в IPv6 нет broadcast и что вместо него?
Broadcast будил все устройства сегмента, даже кому пакет не нужен. В IPv6 его заменили адресными multicast-группами: «все узлы» (ff02::1), «все роутеры» (ff02::2), solicited-node группы для NDP. Устройство слушает только свои группы — сеть тише, CPU свободнее.

4. Почему подсеть — всегда /64 (и как это упрощает жизнь)

В IPv4 мы мучительно считали: «сколько хостов влезет в /26?» В IPv6 договорились жёстко: LAN-сегмент = /64. Первые 64 бита — сеть, вторые 64 — интерфейсный идентификатор (interface ID). Всё. Субнеттинг переезжает на уровень «сколько /64 нарезать из выданного блока»:

2001:db8/32 — блок провайдера
00a3сайт клиента (/48)
0010№ VLAN/сегмента (/64)
xxxx:xxxx:xxxx:xxxxinterface ID — 64 бита хосту

Типовая раздача: провайдер получает /32, клиент-организация — /48 (это 65 536 подсетей /64!), домашнему абоненту дают /56 (256 подсетей). Считать хостов больше не нужно никогда: 264 адресов в каждом сегменте хватит на всё. Исключение из правила одно: линки точка-точка между роутерами принято делать /127 (аналог /31 из IPv4) — чтобы отсечь класс атак на огромные пустые подсети.

Аналогия

IPv4 — коммуналка, IPv6 — город с бесконечными кварталами

В IPv4 мы делили тесную коммуналку: «этим — 62 койки, тем — 30, и не дай бог пересечься». В IPv6 каждому сегменту выдают целый квартал (/64), а организации — район из 65 тысяч кварталов (/48). Планирование адресов превращается из экономии байтов в наведение порядка: номер квартала — это номер VLAN, и адрес читается как адресная табличка.

5. NDP — «ARP нового мира» (и не только ARP)

ARP в IPv6 нет. Его работу (и ещё несколько задач) выполняет NDP — Neighbor Discovery Protocol, работающий поверх ICMPv6. Четыре типа сообщений, которые нужно знать наизусть:

СообщениеICMPv6 типКто шлётЗачемАналог
RS — Router Solicitation133хост при включении«Роутеры, отзовитесь!»DHCP Discover (по духу)
RA — Router Advertisement134роутер (периодически и в ответ на RS)«Я роутер. Вот префикс сети, вот флаги, я могу быть шлюзом»— (нет аналога! сердце SLAAC)
NS — Neighbor Solicitation135кто ищет соседа«У кого адрес X? Дай MAC» + проверка дубликатов (DAD)ARP request
NA — Neighbor Advertisement136владелец адреса«X — это я, MAC такой-то»ARP reply

Тонкое отличие от ARP: NS уходит не broadcast'ом, а в solicited-node multicast — специальную группу, вычисляемую из последних 24 бит искомого адреса. Услышит её только устройство с этим адресом (и его коллизионные «соседи» по хешу), а не весь сегмент. Таблица соседей смотрится так:

# Linux: сосед-таблица v6 (аналог arp -a) $ ip -6 neigh fe80::1 dev eth0 lladdr cc:2d:e0:11:aa:01 router REACHABLE 2001:db8:a3:10::5 dev eth0 lladdr a4:5e:60:1f:22:0b STALE # Cisco Router# show ipv6 neighbors IPv6 Address Age Link-layer Addr State Interface FE80::A8BB:CCFF:FE00:200 0 aabb.cc00.0200 REACH Gi0/0

6. SLAAC: хост настраивает себя сам — разбор по шагам

Самая красивая часть IPv6: автонастройка встроена в протокол. DHCP-сервер не обязателен. Вот что происходит, когда ноутбук подключается к v6-сети:

Собрать link-local
Интерфейс поднялся → хост генерирует fe80::/64 + interface ID (из MAC по алгоритму EUI-64 или случайный). Проверяет его на дубликат: шлёт NS на свой же адрес (DAD — duplicate address detection). Тишина = адрес свободен, забираю.
Спросить роутеров: RS → RA
Хост шлёт RS на ff02::2 («все роутеры»). Роутер отвечает RA: «префикс сегмента — 2001:db8:a3:10::/64, флаг A=1 (можешь собрать адрес сам), я — твой шлюз (мой link-local), MTU такое-то».
Собрать глобальный адрес
Хост берёт префикс из RA + генерирует interface ID → получает GUA вида 2001:db8:a3:10:xxxx:xxxx:xxxx:xxxx. Снова DAD. Современные ОС генерируют privacy-адреса — случайные, сменяемые раз в сутки, чтобы по interface ID нельзя было следить за устройством между сетями.
Шлюз уже известен
Default route хост ставит на link-local роутера из RA. Заметь: никакого DHCP не понадобилось вообще. DNS-серверы тоже можно получить из RA (опция RDNSS).

А что же DHCPv6? Он существует, и режим задают флаги в RA — это стандартный вопрос экзамена:

Флаги RAРежимКто выдаёт адресКто выдаёт DNS и опции
A=1, M=0, O=0чистый SLAACхост сам (из префикса RA)RA (RDNSS)
A=1, M=0, O=1SLAAC + stateless DHCPv6хост самDHCPv6 (только опции, адреса не ведёт)
A=0, M=1stateful DHCPv6DHCPv6-сервер (ведёт учёт — нужен корпорациям для контроля)DHCPv6
Ловушка №3 — Android и DHCPv6

Android не поддерживает DHCPv6 вовсе — только SLAAC. Спланируешь корпоративную сеть в режиме «A=0, M=1» — все Android-устройства останутся без v6. Реальный кейс, о который больно ударялись многие. Решение: SLAAC + stateless DHCPv6 либо смирение.

7. Dual-stack и переходные механизмы

Мир будет жить с двумя протоколами ещё долго. Стандартная стратегия — dual-stack: у интерфейса одновременно и IPv4-, и IPv6-адрес, приложение пробует оба. Какой предпочтёт? Алгоритм Happy Eyeballs: браузер начинает соединение по v6 и почти одновременно (с задержкой ~250 мс) по v4 — кто быстрее установился, тот и победил. Поэтому «сломанный IPv6» проявляется не как «не работает», а как «всё как-то подтормаживает» — браузер каждый раз ждёт таймаут v6, прежде чем откатиться на v4. Запомни этот симптом.

МеханизмЧто делаетГде встретишь
Dual-stackоба протокола параллельностандарт: серверы, офисы, облака
NAT64 + DNS64v6-only клиенты ходят в v4-мир: DNS64 подделывает AAAA из A (64:ff9b::/96 + v4-адрес), NAT64 транслируетмобильные операторы (твой смартфон, скорее всего, так и живёт!)
Туннели (6in4, 6rd)v6-пакеты внутри v4legacy, Hurricane Electric для лабораторий
464XLATнадстройка над NAT64 для приложений, зашитых на v4Android/iOS в v6-only сетях

8. Маршрутизация IPv6: всё то же самое, только длиннее

Таблица маршрутов, longest prefix match, статика, IGP, BGP — всё работает идентично IPv4. Смотри, насколько знакомо выглядят конфиги:

! Включить v6-маршрутизацию (по умолчанию выключена!) и адрес на интерфейс Router(config)# ipv6 unicast-routing Router(config)# interface Gi0/0 Router(config-if)# ipv6 address 2001:db8:a3:10::1/64 Router(config-if)# ipv6 enable ! Статика — как в v4 Router(config)# ipv6 route 2001:db8:b4::/48 2001:db8:a3:12::2 Router(config)# ipv6 route ::/0 Gi0/1 FE80::1 ! default; next-hop link-local + интерфейс ! OSPFv3 — включается НА ИНТЕРФЕЙСЕ (не network-командой, как v2) Router(config)# router ospfv3 1 Router(config-rtr)# router-id 1.1.1.1 ! router-id всё ещё в формате v4! Router(config)# interface Gi0/0 Router(config-if)# ospfv3 1 ipv6 area 0 ! BGP — то же семейство команд, отдельная address-family Router(config)# router bgp 65000 Router(config-router)# neighbor 2001:db8:ffff::2 remote-as 65010 Router(config-router)# address-family ipv6 Router(config-router-af)# neighbor 2001:db8:ffff::2 activate Router(config-router-af)# network 2001:db8:a3::/48

9. Безопасность: две вещи, которые надо знать сразу

10. Диагностика: команды на каждый день

# ── Linux ── $ ip -6 addr show dev eth0 # адреса: ищи и fe80::, и глобальный $ ip -6 route # таблица: default via fe80::… — норма! $ ping -6 ya.ru $ traceroute -6 2001:4860:4860::8888 $ dig AAAA example.com # есть ли у имени v6-адрес # ── Windows ── > ipconfig # «IPv6-адрес» и «Локальный IPv6-адрес канала» > ping -6 ya.ru > netsh interface ipv6 show neighbors # ── Cisco ── Router# show ipv6 interface brief # адреса на портах Router# show ipv6 route # таблица v6 Router# show ipv6 neighbors # NDP-таблица (замена show ip arp) Router# show ipv6 ospf neighbor Router# show bgp ipv6 unicast summary Router# debug ipv6 nd # посмотреть RA/NS/NA живьём (аккуратно в проде!)

11. Мини-лаба: IPv6 уже есть на твоём компьютере

Найди свои v6-адреса
ipconfig (Windows) / ip -6 addr (Linux). Link-local fe80::… будет точно — он есть всегда. Есть ли глобальный (2xxx:…)? Если да — твой провайдер уже выдаёт v6.
Проверь связность и предпочтение протокола
Открой test-ipv6.com — сайт покажет, ходишь ли ты по v6 и нет ли «сломанного» v6 (того самого, что делает интернет медленным). Затем ping -6 ya.ru — работает?
Посмотри NDP-таблицу
ip -6 neigh / netsh interface ipv6 show neighbors — вот замена ARP-таблицы. Найди запись с пометкой router — это твой v6-шлюз, и он link-local.
Пингани «всех» в своём сегменте
Linux: ping ff02::1%eth0 (подставь свой интерфейс) — ответят соседи по линку. Ты только что использовал multicast «все узлы» вместо broadcast. Красиво же?
Есть ли AAAA у любимых сайтов?
nslookup -type=AAAA google.com и сравни с каким-нибудь сайтом-динозавром без v6. Двойной стек виден прямо в DNS.

12. Плейбук: «с IPv6 что-то не так»

Симптом «всё подтормаживает» — подозревай сломанный v6
Happy Eyeballs маскирует мёртвый v6 под «медленный интернет». Проверка: test-ipv6.com или curl -6 -m 5 https://ya.ru (таймаут = v6 сломан). Быстрый обход — выключить v6 на интерфейсе; правильное лечение — найти, где он сломан (обычно RA приходят, а реальной v6-связности у роутера нет).
Хост не получает глобальный адрес
Есть ли RA? Linux: rdisc6 eth0 или tcpdump icmp6 and ip6[40]==134. RA нет → на роутере забыт ipv6 unicast-routing (ловушка №4!) или RA подавлены (ipv6 nd ra suppress). RA есть, адреса нет → смотри флаги A/M/O и вспоминай про Android/DHCPv6.
Сосед недостижим при живом линке
NDP-диагностика — полный аналог ARP-плейбука: ip -6 neigh / show ipv6 neighbors. Состояние FAILED/INCMP = сосед не отвечает на NS: не тот VLAN, выключен, firewall режет ICMPv6 (см. следующий шаг).
«Запретим ICMP для безопасности» — и всё умерло
В IPv6 ICMPv6 — не вспомогательный, а несущий протокол: на нём NDP (типы 133–136) и Path MTU Discovery (тип 2). Фаервол, тупо режущий весь ICMPv6, ломает сеть целиком. Разрешай минимум типы 1–4 и 133–136 в пределах линка.
Пинг по адресу работает, по имени — нет
Это DNS, а не v6: проверь AAAA-записи и работу резолвера (dig AAAA имя). Старая истина «it's always DNS» в dual-stack становится вдвое вернее.

13. Частые ошибки джунов

ОшибкаПоследствиеКак правильно
Забыт ipv6 unicast-routingадреса висят, RA нет, транзит не идёт — «мистика»первая команда при включении v6 на Cisco
Два «::» в адресеадрес невалиден«::» — строго один раз
Пинг link-local без zone-idinvalid argument / не тудаfe80::1%eth0 — всегда с интерфейсом
Заблокировали весь ICMPv6умерли NDP и PMTUD — сеть «загадочно» лежитразрешить типы 1–4, 133–136
Планирование «по-старому»: /120-подсети, экономия адресовломается SLAAC (ему нужен /64), боль без выгодыLAN = /64, точка-точка = /127, не экономить
«Мы v6 не используем» → нет ACL/мониторинга на v6слепая зона для атак (rogue RA, туннели)v6-политики с первого дня, RA Guard на доступе
Вопрос с собеседования: чем NDP принципиально лучше ARP?
1) Не будит весь сегмент: NS уходит в solicited-node multicast, а не broadcast. 2) Это часть ICMPv6/L3 — работает единообразно поверх любого канального уровня. 3) Встроенные функции, которых у ARP не было: обнаружение роутеров (RA), автонастройка (SLAAC), проверка дубликатов (DAD), определение недостижимости соседа (NUD). 4) Расширяем криптозащитой (SEND). ARP из этого не умел ничего — только «кто такой X?».

14. Словарик модуля

ТерминПо-английскиСмысл в одну строку
GUAglobal unicast addressглобальный адрес 2000::/3 — «белый» IPv6
ULAunique local addressfd… — внутренний адрес, аналог приватных v4
Link-locallink-local, fe80::/10адрес «внутри одного провода», есть на каждом интерфейсе
NDPNeighbor Discovery Protocolзамена ARP + обнаружение роутеров + автонастройка (поверх ICMPv6)
RS / RARouter Solicitation / Advertisement«роутеры, отзовитесь» / «я роутер, вот префикс и шлюз»
NS / NANeighbor Solicitation / Advertisementаналог ARP request/reply
SLAACstateless address autoconfigurationхост сам собирает адрес из префикса RA — без DHCP
DADduplicate address detectionпроверка «адрес свободен?» перед использованием
Dual-stackdual stackv4 и v6 одновременно на одном интерфейсе
Happy Eyeballshappy eyeballsгонка v6 против v4 при соединении — маскирует сломанный v6
NAT64/DNS64мост из v6-only мира в v4-ресурсы (мобильные сети)
RA GuardRA guardзащита сегмента от поддельных Router Advertisement
IPv6 — это 128-битные адреса (8 hex-групп, «::» один раз), фиксированный /64 на сегмент и автонастройка, встроенная в протокол: RA объявляет префикс, SLAAC собирает адрес, DAD проверяет дубликаты. ARP заменён NDP (NS/NA поверх ICMPv6), broadcast — multicast-группами, шлюз и next-hop — это link-local соседа. Маршрутизация концептуально не изменилась: статика, OSPFv3, BGP address-family ipv6. Главные грабли: забытый ipv6 unicast-routing, порезанный ICMPv6, двойное «::» и иллюзия «мы v6 не используем».

15. Задачи — реши сам

Задача 1. Сократи по правилам: 2001:0db8:0000:0000:00fe:0000:0000:0001

Убираем ведущие нули: 2001:db8:0:0:fe:0:0:1. «::» ставим на самую длинную цепочку нулей — здесь две цепочки по две группы, при равенстве сворачивают левую: 2001:db8::fe:0:0:1. Второй «::» поставить нельзя!

Задача 2. Классифицируй адреса: fe80::1, 2001:db8::5, fd12:3456::10, ff02::2, ::1

fe80::1 — link-local (только внутри линка); 2001:db8::5 — global unicast (документационный диапазон); fd12:3456::10 — ULA, внутренний; ff02::2 — multicast «все роутеры линка»; ::1 — loopback.

Задача 3. В ip -6 route хоста: default via fe80::1 dev eth0. Джун паникует: «шлюз — какой-то локальный адрес, это сломано!» Что ответишь?

Это норма и стандарт IPv6: шлюз приходит из RA и это link-local роутера. Link-local всегда достижим на линке независимо от глобальных префиксов — надёжнее, чем GUA. Ничего чинить не нужно.

Задача 4. Организации выдали 2001:db8:a300::/48. Сколько стандартных LAN-сегментов (/64) она может нарезать? Какой адрес будет у VLAN 16 (hex 0x10)?

С /48 до /64 — 16 бит на номера подсетей: 65 536 сегментов. VLAN 16 → подсеть номер 0x0010: 2001:db8:a300:10::/64. Красота v6-планирования: номер VLAN читается прямо в адресе.

Задача 5. После включения v6 на роутере хосты сегмента адреса не получают. show ipv6 interface brief показывает адрес на порту, пинг с роутера на хост по link-local работает. Самая вероятная причина?

Забыт ipv6 unicast-routing: без него IOS не выполняет роль маршрутизатора и не рассылает RA — хостам неоткуда взять префикс для SLAAC. Адреса и пинги на линке при этом работают, что и сбивает с толку.

Задача 6. Безопасник требует «запретить весь ICMP по обеим версиям IP, как в v4 привыкли». Чем это грозит в v6 и какой компромисс предложишь?

В v6 это убьёт сеть: на ICMPv6 работают NDP (разрешение адресов! типы 135/136), RA/RS (133/134) и Path MTU Discovery (тип 2 — в v6 маршрутизаторы не фрагментируют, без PMTUD большие пакеты молча умирают). Компромисс: разрешить типы 1–4 и 133–136 (в пределах линка), rate-limit на echo, RA Guard на портах доступа.

Мост к следующему модулю

Ты заметил, что шлюз в IPv6 — это один роутер из RA? А что будет, если он умрёт в 3 часа ночи? В IPv4 таже проблема: default gateway — единая точка отказа всего сегмента. Как два роутера делят один виртуальный адрес шлюза и подхватывают друг друга за секунды — следующий модуль: HSRP и VRRP, протоколы резервирования шлюза.