Народный

Сеть

NAT traversal — STUN, TURN, ICE

Набор техник для установки P2P-соединения между устройствами за NAT. STUN определяет внешний endpoint, TURN ретранслирует трафик при failure, ICE выбирает лучший доступный путь. Основа Tailscale, ZeroTier, WebRTC и современных WireGuard mesh.

Что это

NAT traversal — общее название техник, позволяющих двум устройствам за разными NAT’ами установить прямое P2P-соединение, не имея публичных IP-адресов. Без NAT traversal вся современная P2P-инфраструктура — Tailscale, ZeroTier, WireGuard mesh, WebRTC, BitTorrent, видеозвонки в Skype/WhatsApp/Telegram — работала бы только через центральные relay-серверы со всеми вытекающими (стоимость, латентность, single point of failure).

Канонический набор стандартов — IETF triad: STUN (RFC 8489), TURN (RFC 8656), ICE (RFC 8445).

Как это работает

STUN — Session Traversal Utilities for NAT

Лёгкий протокол поверх UDP/TCP, который позволяет клиенту узнать свой внешний IP и порт, видимый снаружи NAT’а. Алгоритм: клиент отправляет UDP-пакет на публичный STUN-сервер (например, stun.l.google.com:19302), сервер отвечает строкой с парой «внешний IP + внешний порт». Клиент узнаёт, как его видит остальной интернет.

Это работает, потому что NAT, выпуская исходящий UDP-пакет, временно открывает обратный канал по тому же мэппингу (NAT binding). Если второй пир отправит пакет на этот endpoint (IP + порт) достаточно быстро, NAT пропустит его внутрь. Эта техника называется UDP hole punching.

TURN — Traversal Using Relays around NAT

Когда STUN не помогает (см. ниже про symmetric NAT), на сцену выходит TURN — relay-сервер, через который оба клиента шлют трафик. По сути обычный прокси, но с авторизацией и квотами. Минус — нагрузка на канал TURN-сервера полностью равна сумме трафика всех клиентов.

ICE — Interactive Connectivity Establishment

Фреймворк, который ходит по «лестнице кандидатов» от лучшего к худшему:

  1. Host candidate — прямое LAN-соединение, если клиенты в одной сети.
  2. Server-reflexive (srflx) — внешний адрес, полученный через STUN. Прямой P2P через hole punching.
  3. Relayed — TURN-relay как последний шанс.

ICE параллельно пробует все варианты и выбирает первый успешный.

Типы NAT и почему symmetric NAT — это плохо

Классификация (RFC 3489 historic, концепция актуальна):

  • Full cone NAT. Любой внешний хост может слать пакеты на открытый mapping. Hole punching работает мгновенно.
  • Restricted cone NAT. Только хост, которому клиент сам отправил пакет. Punching работает с координацией через STUN.
  • Port-restricted cone NAT. То же + ограничение по порту.
  • Symmetric NAT. Каждое исходящее соединение получает уникальный external port, даже если клиент шлёт на один и тот же сервер с разных destination’ов. Hole punching невозможен — внешний порт, который клиент A узнал у STUN, не совпадёт с тем, что увидит клиент B.

Symmetric NAT — типичный сценарий у мобильных операторов (особенно с CGNAT) и в корпоративных firewall. В РФ через 4G/5G МТС/Билайн/МегаФон symmetric NAT — норма. Tailscale в этом случае автоматически падает на DERP-relay (его аналог TURN), ZeroTier — на root-серверы, WireGuard mesh без relay просто не работает.

Почему это важно для пользователя VPN

NAT traversal — невидимый, но критичный слой:

  • Mesh-VPN (Tailscale, ZeroTier, Netbird). Скорость P2P-режима против relay-режима отличается в десять раз — STUN/ICE определяют, попадёте ли вы в первый.
  • Self-hosted WireGuard на домашнем NAS. Без публичного IP нужен либо DDNS + проброс портов, либо посредник с NAT traversal (Tailscale, ZeroTier, Cloudflare Tunnel).
  • Видеозвонки и WebRTC. Те же STUN/TURN, тот же ICE. Когда видеозвонок «не подключается» — обычно проблема в symmetric NAT и недоступности TURN.

Совет: если самостоятельно поднимаете mesh, проверьте, какой у вас NAT. На Linux: stun stun.l.google.com 19302. На Windows: Test-NetConnection. При symmetric NAT — нужен relay-провайдер либо переход на 4G-модем с другим оператором.

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

Tailscale, ZeroTier — основные потребители NAT traversal в VPN-мире. WireGuard — отдельно не делает hole punching (просто слушает UDP-порт), но обёртки добавляют. IPSec ESP — наоборот, исторически плохо ладит с NAT (отсюда NAT-T).

Источники