Сеть
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
Фреймворк, который ходит по «лестнице кандидатов» от лучшего к худшему:
- Host candidate — прямое LAN-соединение, если клиенты в одной сети.
- Server-reflexive (srflx) — внешний адрес, полученный через STUN. Прямой P2P через hole punching.
- 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).
Источники
- RFC 8489 — STUN.
- RFC 8656 — TURN.
- RFC 8445 — ICE.
- Ford et al. — Peer-to-Peer Communication Across Network Address Translators (USENIX 2005) — каноническая работа про hole punching.
- coturn/coturn — самый популярный open-source TURN/STUN сервер.