Networking

IPv4 и IPv6

Две версии интернет-протокола: IPv4 с 32-битными адресами вида 192.168.1.1 и IPv6 со 128-битными вида 2001:db8::1.

Что такое IPv4 и IPv6

IPv4 и IPv6 — две версии интернет-протокола, то есть два формата IP-адреса и правил его обработки. Они работают параллельно и напрямую друг с другом не совместимы: узел с одним только IPv6 не откроет сайт, у которого есть лишь IPv4-адрес, без промежуточного шлюза.

IPv4 — адрес длиной 32 бита, четыре числа 0–255 через точку: 93.184.216.34. Всего пространство даёт около 4,3 млрд адресов.

IPv6 — адрес длиной 128 бит, восемь групп по четыре шестнадцатеричные цифры через двоеточие: 2001:0db8:0000:0000:0000:0000:0000:0001. Адресов — 2¹²⁸, число порядка 3,4×10³⁸.

Зачем понадобился IPv6

4,3 млрд адресов казались бесконечностью в 1981 году. Свободные блоки IPv4 у региональных регистраторов закончились в 2010-х, и с тех пор адреса перепродаются на вторичном рынке. Провайдеры выкручиваются через NAT и CGNAT, пряча тысячи абонентов за одним публичным адресом. Это работает, но ломает входящие соединения: за CGNAT нельзя поднять сервер, к которому подключатся снаружи.

IPv6 закрывает вопрос радикально — публичный адрес достаётся каждому устройству, и NAT в нём в принципе не нужен.

Сравнение

IPv4 IPv6
Длина адреса 32 бита 128 бит
Запись 192.168.1.1 2001:db8::1
Размер пространства ~4,3 млрд 2¹²⁸
Заголовок 20–60 байт, переменный 40 байт, фиксированный
Настройка адреса вручную или DHCP SLAAC или DHCPv6
Broadcast есть нет, только multicast
Разрешение MAC ARP NDP
NAT почти всегда не нужен
Минимальный MTU 576 1280

Как сокращают запись IPv6

Правила ровно два, и их достаточно:

2001:0db8:0000:0000:0000:ff00:0042:8329   полная форма
2001:db8:0:0:0:ff00:42:8329               убрали ведущие нули в группах
2001:db8::ff00:42:8329                    заменили самую длинную цепочку нулей на ::

:: в адресе может встречаться только один раз — иначе восстановить число пропущенных групп невозможно. В URL адрес берут в квадратные скобки, чтобы двоеточие не спутали с портом: http://[2001:db8::1]:8080/.

Диапазоны, которые встречаются каждый день

Назначение IPv4 IPv6
Localhost 127.0.0.1 ::1
Приватные адреса 10/8, 172.16/12, 192.168/16 fc00::/7 (ULA)
Link-local 169.254.0.0/16 fe80::/10
Публичные всё остальное 2000::/3

Стандартная подсеть IPv6 — /64: адресов в ней столько, что сканировать её перебором бессмысленно. Провайдер обычно выдаёт клиенту /64 или /56, то есть целый блок подсетей, а не один адрес.

Практика на сервере

$ ip -6 addr show eth0
    inet6 2001:db8:85a3::8a2e:370:7334/64 scope global
    inet6 fe80::5054:ff:fe12:3456/64 scope link

$ ping6 -c1 ipv6.google.com
$ curl -6 https://example.com     # принудительно по IPv6
$ curl -4 https://example.com     # принудительно по IPv4

Адрес fe80:: есть на интерфейсе всегда — он link-local и наружу не маршрутизируется. Наличие scope global означает, что IPv6 реально работает.

Практические выводы для тех, кто держит сервер:

  • Dual-stack — норма. Держите и A-, и AAAA-записи. Клиенты сами выберут протокол; при обеих записях браузеры предпочтут IPv6 и откатятся на IPv4, если он не отвечает.
  • AAAA без работающего IPv6 — авария. Опубликовали запись, а маршрута нет — часть пользователей получит таймауты вместо сайта.
  • Файрвол нужен отдельный. Правила iptables не действуют на IPv6-трафик: нужен ip6tables, а в UFW и nftables — явная поддержка обеих семей. Открытый наружу IPv6-порт при закрытом IPv4 — частая и неприятная находка.
  • IPv6 бесплатен, IPv4 — нет. Публичный IPv4 у хостеров стал платной опцией, и это ещё один аргумент за dual-stack.

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

  • IP-адрес — общее понятие для обеих версий
  • Маска подсети и CIDR — префиксы /24 и /64
  • NAT — обходной приём эпохи дефицита IPv4
  • DHCP — раздача адресов, в IPv6 дополнена SLAAC
  • DNS — A-записи для IPv4, AAAA для IPv6
  • MTU и MSS — у IPv6 минимальный MTU выше

Готовы запустить GPU-задачу?

Запустить GPU-сервер