Глиф Учебники

Урок 9. IPv6: что это и зачем

Курс «Компьютерные сети» · урок 9 из 9 · 4 минуты чтения

Адресов IPv4 всего около 4,3 миллиарда, а устройств в интернете давно больше. Свободные адреса IPv4 у региональных регистраторов закончились ещё в 2010-х годах, и сети держатся на NAT (урок NAT и проброс портов). IPv6 решает задачу по-другому: адресов в нём столько, что хватит каждому устройству — без общего адреса на всю квартиру.

Сколько адресов

Адрес IPv6 длиной 128 бит вместо 32. Это 2 в степени 128 — число с 39 цифрами. Даже одна обычная сеть IPv6 (/64) вмещает в 4,3 миллиарда раз больше адресов, чем весь IPv4:

Python
print(2 ** 32)
print(2 ** 64)
print(2 ** 128)
Вывод
4294967296
18446744073709551616
340282366920938463463374607431768211456

Как записывается адрес

Восемь групп по четыре шестнадцатеричные цифры (0–9 и a–f) через двоеточие:

Текст
2001:0db8:0000:0000:0000:ff00:0042:8329

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

  1. Нули в начале группы можно не писать: 0db8 → db8, 0042 → 42, 0000 → 0.
  2. Одну подряд идущую цепочку нулевых групп можно заменить на ::. Только одну — иначе непонятно, сколько нулей где пропущено.
Полный адрес 2001 0db8 0000 0000 0000 ff00 0042 8329 : : : : : : : 1. Нули в начале группы не пишут 2001 db8 0 0 0 ff00 42 8329 : : : : : : : 2. Одну цепочку нулевых групп заменяют на :: 2001 db8 ff00 42 8329 :: : : : итог: 2001:db8::ff00:42:8329
Адрес 2001:0db8:0000:0000:0000:ff00:0042:8329 сокращается в два шага: убираются нули в начале групп, а цепочку нулевых групп заменяет «::».

Так адрес выше превращается в 2001:db8::ff00:42:8329. Модуль ipaddress в Python делает это сам и умеет развернуть адрес обратно:

Python
import ipaddress

addr = ipaddress.ip_address("2001:0db8:0000:0000:0000:ff00:0042:8329")
print(addr)
print(addr.exploded)
print(ipaddress.ip_address("fe80::1").is_link_local)
print(ipaddress.ip_address("::1").is_loopback)
Вывод
2001:db8::ff00:42:8329
2001:0db8:0000:0000:0000:ff00:0042:8329
True
True

Адреса, которые начинаются с 2001:db8:, выделены для примеров в книгах и документации — в настоящих сетях их нет.

Маска пишется так же, как в IPv4, через косую черту: 2001:db8:1:2::/64. В адресе сайта адрес IPv6 берут в квадратные скобки, чтобы двоеточия не спутались с портом: http://[2001:db8::10]:8080/.

Виды адресов

НачалоЧто это
2… или 3…глобальный адрес: виден в интернете, как публичный IPv4
fe80:локальный адрес канала (link-local): есть у каждого интерфейса всегда, работает только в своём сегменте сети — роутер его дальше не передаёт
fd…уникальный локальный адрес (ULA): для своей сети, как 192.168.x.x в IPv4
::1сам компьютер, как 127.0.0.1

Поэтому у компьютера в сети с IPv6 сразу несколько адресов — это нормально.

Как устройство получает адрес

В IPv6 устройство обычно придумывает адрес само (SLAAC — автонастройка без сервера):

  1. Роутер время от времени объявляет в сети её префикс — первую половину адреса, например 2001:db8:1:2::/64.
  2. Устройство дописывает к префиксу вторую половину, придуманную само, и проверяет, что такой адрес ещё никто не занял.
роутер устройство 1 объявляет префикс сети 2001:db8:1:2::/64 Адрес устройства — 128 бит 2001:db8:1:2: 1a2b:3c4d:5e6f:7a8b 64 бита — префикс от роутера 2 64 бита придумывает устройство и проверяет, что адрес не занят
Роутер объявляет префикс 2001:db8:1:2::/64 — первые 64 бита адреса, а вторые 64 бита устройство придумывает само и проверяет, что адрес свободен.

Бывает и DHCPv6 — раздача адресов сервером, как в IPv4. Провайдер выдаёт домашнему роутеру не один адрес, а целый префикс — например /56 или /64, — и роутер делит его на свои сети.

Телефоны и компьютеры заводят ещё и временные адреса, которые регулярно меняются: так сайтам труднее следить за устройством по его адресу. Для исходящих подключений система обычно берёт временный адрес, поэтому адрес, который видят сайты, со временем меняется.

NAT не нужен, брандмауэр — нужен

У каждого устройства в IPv6 свой глобальный адрес, и NAT обычно нет. Это значит, что подключение из интернета технически может дойти до устройства напрямую. Не пускает его брандмауэр роутера: по умолчанию он должен пропускать внутрь только ответы на соединения, начатые изнутри.

Вместо проброса порта в IPv6 делают правило брандмауэра роутера: «разрешить входящие на такой-то порт такого-то адреса». Учтите, что префикс от провайдера может меняться, а временные адреса меняются всегда, — разрешайте доступ к постоянному адресу устройства.

интернет брандмауэр роутера ответ на запрос изнутри подключение снаружи на разрешённый порт ноутбук 2001:db8:1:2::25 домашний сервер 2001:db8:1:2::10 NAT нет: у каждого устройства свой глобальный адрес
В IPv6 у каждого устройства свой глобальный адрес, а брандмауэр роутера пропускает внутрь только ответы на соединения изнутри и подключения на разрешённый порт.

Проверьте, что брандмауэр IPv6 на роутере включён. Если он выключен, все устройства с глобальными адресами доступны из интернета напрямую — со всеми их открытыми портами.

Двойной стек

Почти везде IPv4 и IPv6 работают одновременно — это двойной стек (dual stack). Если у сайта есть запись AAAA (урок DNS) и IPv6 работает, браузер обычно идёт по IPv6, а если не получается — быстро переключается на IPv4. Если провайдер IPv6 не даёт, ничего не ломается: всё работает по IPv4.

Как проверить, есть ли IPv6

В Windows — ipconfig: строки с адресами IPv6 есть у каждого подключения. Если есть только адрес на fe80:, глобального IPv6 у вас нет. В Linux:

Bash
ip -6 addr
ip -6 route show default

Есть ли у сайта адрес IPv6, покажет запрос записи AAAA, и затем можно проверить связь с ним:

Командная строка
nslookup -type=AAAA glif.by
ping -6 glif.by

Если у сайта нет записи AAAA, он работает только по IPv4, и ping -6 до него не дойдёт — это не поломка. Ключ -6 у ping есть и в Windows, и в Linux. Проверить, видят ли вас сайты по IPv6, можно и на сайтах проверки IPv6.

Коротко

Проверьте себя

1. Как правильно сократить 2001:0db8:0000:0000:0000:0000:0000:0001?
2. Какой адрес IPv6 есть у каждого интерфейса и работает только в своём сегменте сети?
3. Что в IPv6 заменяет проброс порта на роутере?
4. У компьютера в ipconfig есть только адрес IPv6 на fe80:. Что это значит?