NAT, адресация и развёртывание IPv6
NAT расширил IPv4-интернет за пределы 4 миллиардов адресов, но сломал сквозное подключение. IPv6, SLAAC, anycast и dual-stack — архитектурно правильный путь вперёд.
WebRTC видеозвонки требуют прямого соединения обеих сторон — но типичный пользователь находится за двумя слоями NAT. STUN-сервер должен сообщить каждой стороне её публичный IP и порт. TURN-сервер ретранслирует звонок если прямое соединение не удаётся. Понимание почему существует NAT, как он работает и что он ломает — обязательно для любого фулстек-инженера создающего peer-to-peer или real-time функциональность.
Приватная адресация RFC 1918
32-битное адресное пространство IPv4 вмещает ~4,3 млрд адресов. Они закончились. RFC 1918 зарезервировал три диапазона для приватного использования:
| Диапазон | CIDR | Размер |
|---|---|---|
| 10.0.0.0/8 | Class A private | 16,7 миллиона |
| 172.16.0.0/12 | Class B private | 1 миллион |
| 192.168.0.0/16 | Class C private | 65 536 |
Хосты на приватных адресах не могут быть напрямую достигнуты из публичного Интернета. Они могут только инициировать исходящие соединения (после чего NAT-таблица хранит маппинг для ответов).
Network Address Translation (NAT)
NAT (RFC 2663) перезаписывает пакеты на границе сети:
- Исходящий пакет: source IP (приватный, например
192.168.1.10) + source port (например45231) → перезаписывается на публичный IP роутера + уникальный source port (например203.0.113.5:12345). Роутер сохраняет этот маппинг. - Входящий ответ: destination IP + port (
203.0.113.5:12345) → роутер ищет в NAT-таблице → перезаписывает обратно на192.168.1.10:45231и форвардит к внутреннему хосту.
NAT позволил IPv4-интернету вырасти за пределы лимита адресов, но фундаментально сломал end-to-end адресацию: публичный Интернет видит один IP для многих внутренних хостов, и внутренние хосты не могут принимать незапрошенные входящие соединения.
Что ломает NAT:
- Peer-to-peer протоколы (BitTorrent, VoIP, WebRTC): каждая сторона должна иметь возможность инициировать — NAT разрешает только исходящие соединения.
- Port forwarding: нужно настраивать вручную для каждого сервиса который должен быть доступен снаружи.
- Отслеживание злоупотреблений: единственный публичный IP может скрывать сотни несвязанных пользователей.
Вместе эти три проблемы превращают Интернет из симметричной peer-to-peer-сети в сеть где настоящий «слушатель» — только сторона с публичным IP. Именно поэтому любая real-time функция которую вы создаёте рано или поздно потребует STUN или TURN (протоколы обхода NAT).
Carrier-Grade NAT (CGNAT)
Мобильные операторы и ISP развёртывают CGNAT чтобы делить один публичный IPv4-адрес между сотнями или тысячами клиентов:
- Домашний роутер клиента делает NAT в
100.64.x.x(RFC 6598 shared address space — «пространство адресов NAT64 оператора»). - CGNAT оператора делает ещё один NAT на публичный IP.
Двойной NAT усугубляет P2P-проблему. Пользователи CGNAT не могут хостить никакие сервисы на своём IP, и P2P NAT traversal сложнее. Rate-limiting по IP бессмысленен (сотни несвязанных пользователей делят один IP).
Обход NAT: STUN/TURN/ICE
WebRTC и современные P2P-протоколы используют трёхуровневый подход:
- STUN (Session Traversal Utilities for NAT): STUN-сервер сообщает каждому пиру его публичный IP и порт как они видны снаружи NAT. Пиры пытаются соединиться напрямую используя эту информацию.
- TURN (Traversal Using Relays around NAT): если прямое соединение невозможно (например симметричный NAT, CGNAT), TURN-сервер ретранслирует весь трафик. Штраф задержки; только fallback.
- ICE (Interactive Connectivity Establishment): фреймворк который итерирует через STUN-кандидатов, прямые адреса и TURN пока не найдёт работающий путь.
- Пул публичных адресов IPv4
- ~3,7 млрд используемых
- Клиентов CGNAT на публичный IP
- 100–10 000
- Глобальный трафик IPv6 (2026)
- ~45–50%
- Веха Google IPv6
- 50,1% на 2026-03-28
- IPv6 /48 на сайт
- 281 трлн подсетей /64
- Interface ID SLAAC (расширения приватности)
- 64 бита, рандомизируется per site
IPv6-адреса: структура и SLAAC
IPv6-адреса — 128 бит, записываются как восемь разделённых двоеточиями hex-групп. Сокращения: ведущие нули опускаются, самый длинный пробег нулей заменяется ::. Пример: 2001:db8::1.
Типичное выделение: префикс /48 для сайта → /64 на подсеть внутри сайта. SLAAC (Stateless Address Autoconfiguration, RFC 4862) позволяет хосту самостоятельно формировать свой адрес:
- Роутер широковещательно анонсирует
/64-префикс в Router Advertisement сообщениях. - Хост генерирует нижние 64 бита (interface ID) — изначально EUI-64 из MAC-адреса, теперь случайный для приватности (расширения приватности RFC 8981).
- Хост проверяет дубликаты (Duplicate Address Detection), затем начинает использовать адрес.
- DHCP не требуется для базового подключения.
Расширения приватности (RFC 8981) рандомизируют interface ID per site для предотвращения кросс-сайтового отслеживания через IPv6-адреса. Современные ОС включают это по умолчанию.
Anycast: один IP, много локаций
Anycast анонсирует один и тот же IP-префикс из нескольких географических локаций. BGP маршрутизирует каждого пользователя в POP с наикратчайшим AS-path. Применения: DNS-резолверы (1.1.1.1, 8.8.8.8), CDN edge’ы, корневые серверы имён, сервисы защищённые от DDoS.
Anycast хорошо работает для stateless-сервисов (UDP DNS) — каждый пакет может идти в другой POP. Для stateful-сервисов (TCP, TLS) короткие флоу нормальны (BGP-маршрутизация стабильна в течение соединения), но длинные флоу требуют либо стабильного BGP, либо репликации состояния сессии между POP’ами (Cloudflare поэтому глобально реплицирует TLS-сессионные тикеты).
Dual-stack и Happy Eyeballs
Большинство текущих развёртываний работают на dual-stack: одновременно включены IPv4 и IPv6. IPv6 в приоритете для доставки контента, IPv4 как fallback.
Happy Eyeballs v2 (RFC 8305): когда dual-stack хост резолвит имя хоста, он параллельно запускает попытки подключения по IPv4 и IPv6 с небольшим форой для IPv6. Если IPv6 успевает первым — использовать его; если IPv4 побеждает или IPv6 зависает — использовать IPv4, незаметно, без видимой пользователю задержки. Это делает принятие IPv6 безопасным даже когда пути IPv6 имеют периодические проблемы.
▸Почему это работает
Почему NAT не обеспечивает безопасность. NAT скрывает внутренние IP-адреса от публичного Интернета, что некоторые операторы интерпретируют как преимущество безопасности. Но NAT — не firewall: он не инспектирует трафик, не применяет политику и не мешает скомпрометированному внутреннему хосту устанавливать исходящие соединения. Реальный stateful firewall нужен независимо от наличия NAT. Смешение NAT с безопасностью — опасное заблуждение на практике.
Почему NAT ломает истинные peer-to-peer протоколы?
Что SLAAC позволяет делать IPv6-хосту?
Стартап запускает сервисы в 3 облачных регионах и хочет надёжную глобальную адресацию. Выберите стратегию адресации.
- 01Инженер утверждает что нельзя исправить проблемы CGNAT со стороны приложения. Где изъян в этом аргументе?
- 02Почему Happy Eyeballs v2 даёт IPv6 фору но всё равно откатывается на IPv4?
- 03Что такое anycast и какие сервисы его используют?
Приватные диапазоны RFC 1918 (10/8, 172.16/12, 192.168/16) позволяют организациям повторно использовать адреса внутри; NAT на границе перезаписывает source IP+port чтобы многие внутренние хосты делили один публичный IP. Это продлило жизнь IPv4 но сломало end-to-end подключение: входящие соединения падают без явного port-forwarding, и P2P-протоколы требуют обходных путей STUN/TURN/ICE. CGNAT (NAT операторского масштаба) у мобильных операторов добавляет второй слой NAT. 128-битное адресное пространство IPv6 устраняет необходимость в NAT: каждое устройство получает маршрутизируемый публичный адрес, SLAAC автоконфигурирует без DHCP, и расширения приватности рандомизируют interface ID per site. Anycast использует BGP чтобы маршрутизировать пользователей к географически ближайшей копии сервиса. Dual-stack + Happy Eyeballs v2 позволяют приложениям параллельно гоняться IPv4 и IPv6, мигрируя прозрачно по мере зрелости развёртывания IPv6. Теперь когда WebRTC-звонок падает только у части пользователей — сначала проверьте стоят ли они за CGNAT: этот факт сразу говорит будут ли прямые ICE-кандидаты вообще работать.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.