# IPv6 - адресация и базовые концепции _Сеть: L2 / L3 · LinuxLab Knowledge Base_ **TL;DR:** IPv6 - 128-битные адреса в 8 группах по 16 бит. Link-local fe80::/10 для соседей, global для интернета. SLAAC выдаёт адрес автоматически через Router Advertisement. Neighbor Discovery (NDP) заменяет ARP. ## Зачем IPv6 [[ipv4-addressing|IPv4]] - 4 миллиарда адресов, кончились. NAT помог, но мешает p2p-связи и сложен в админстве. IPv6 даёт 2^128 ≈ 3.4×10^38 адресов - хватит надолго. Но IPv6 - **не переименование IPv4**. Это новый протокол: новые заголовки, новые алгоритмы автоконфигурации, ARP заменён на NDP. ## Запись адреса 128 бит = 8 групп по 16 бит, в hex, через двоеточие: ``` 2001:0db8:85a3:0000:0000:8a2e:0370:7334 ``` **Сокращения:** - Ведущие нули в группе можно убрать: `0db8` → `db8` - Одну подряд группу нулей можно заменить на `::` (только один раз): `2001:db8:85a3::8a2e:370:7334` - `::1` = loopback (аналог 127.0.0.1) - `::` = unspecified (аналог 0.0.0.0) В URL: `http://[2001:db8::1]:8080/` - квадратные скобки чтобы порт не путали с группами адреса. ## Префикс и подсети Запись CIDR-стиля: `2001:db8::/32` - первые 32 бита = префикс. Типичные размеры подсетей: - **/128** - один хост (host route) - **/64** - стандартная LAN-подсеть, 2^64 хостов (намеренно избыточно для SLAAC) - **/56** - типичный домашний prefix от провайдера (256 LAN-подсетей) - **/48** - корпоративный - **/32** - что регистрирует RIR на регион Правило: **LAN всегда /64**. Меньше - сломает SLAAC. ## Типы адресов | Префикс | Назначение | |------------|------------| | `2000::/3` | global unicast (рутируемый интернет) | | `fe80::/10` | link-local, только в пределах сегмента, не маршрутизируется | | `fc00::/7` | unique local (аналог 10/8 в IPv4) | | `ff00::/8` | multicast (аналог [[broadcast-domain|broadcast]] - в IPv6 broadcast'а нет) | | `::1/128` | loopback | | `::/128` | unspecified | Каждый IPv6-интерфейс имеет минимум **link-local** (`fe80::*`) - автоматически назначается из MAC-адреса при старте. По нему работает NDP, RA - то есть link-local нужен всегда, даже без global. ## SLAAC - автоконфигурация IPv6 имеет встроенный механизм автонастройки: 1. Хост шлёт **Router Solicitation (RS)** на ff02::2 (всем роутерам) 2. Роутер отвечает **Router Advertisement (RA)** на ff02::1 с префиксом 3. Хост берёт префикс + сам формирует hostid (из MAC через EUI-64, или random через privacy extensions) 4. Получает global IP без DHCP Опционально RA может сказать «возьми DNS у меня», или «иди в DHCPv6 за дополнительной информацией». ## NDP - замена ARP В IPv4 [[arp|ARP]] резолвит MAC по IP. В IPv6 - **Neighbor Discovery Protocol** через ICMPv6: - **Neighbor Solicitation (NS)** - «у кого этот IP?» - **Neighbor Advertisement (NA)** - «у меня; вот MAC» - **Router Advertisement (RA)** - «я дефолт-шлюз, prefix такой» - **Redirect** - «лучше ходи через другой шлюз» Использует multicast вместо broadcast (меньше шума). ## IPv6 на Linux ```bash # Все IPv6 на интерфейсах ip -6 addr # Маршруты IPv6 ip -6 route # Соседи (как arp) ip -6 neigh # Включить/выключить IPv6 на интерфейсе sysctl -w net.ipv6.conf.eth0.disable_ipv6=1 ``` ## Privacy extensions (RFC 4941) По дефолту host-часть из MAC-адреса (EUI-64) - это раскрывает identity (можно отследить ноут по разным сетям). Privacy extensions генерируют случайный hostid и регулярно его меняют. ```bash sysctl net.ipv6.conf.all.use_tempaddr # 0=off, 2=on by default ``` ## DNS IPv6 использует **AAAA-record** (vs A для IPv4). Один и тот же домен обычно имеет оба: ``` $ dig example.com A # 1.2.3.4 $ dig example.com AAAA # 2001:db8::1 ``` Resolver выбирает на основе RFC 6724 (preference policy). ## Когда что-то пошло не так - **`ip -6 addr` пуст или только `fe80::`** - не пришёл RA; либо роутер не объявляет префикс, либо `accept_ra=0` на интерфейсе - **`Network is unreachable` для IPv6** - default route не настроен или global адрес не получен - **Сайт открывается только с IPv4** - DNS не отдал AAAA, или сайт не имеет IPv6 - **Slow connect** - happy-eyeballs (RFC 8305) пробует и v6, и v4 параллельно с задержкой 250ms; если не настроен v6, увидишь задержку при первом подключении - **`No buffer space available`** - переполнен neighbor cache; `gc_thresh` тюнить ## Команды ```bash ip -6 addr show ``` Все IPv6-адреса по интерфейсам, scope link/global ```bash ip -6 route show ``` Маршрутизация v6 - default к роутеру, локальные подсети ```bash ping6 -c 3 ipv6.google.com ``` Проверить IPv6-связность к интернету ```bash ip -6 neigh show ``` Кэш NDP - аналог 'arp -n', видно соседей и MAC ```bash tcpdump -i any -nn 'icmp6' ``` RA, NS, NA - все NDP-сообщения видны как ICMPv6 ```bash sysctl net.ipv6.conf.all.disable_ipv6 ``` Глобально IPv6 включён? 0 = да, 1 = выключено ## См. также - [IPv4-адресация и CIDR](/kb/ipv4-addressing.md) - [ARP - Address Resolution Protocol](/kb/arp.md) - [Default gateway - выход из своей сети](/kb/default-gateway.md) - [DNS resolution](/kb/dns-resolution.md) - [Broadcast-домен - что это и кто в нём живёт](/kb/broadcast-domain.md)