STUN
STUN (Session Traversal Utilities for NAT, RFC 8489) — простой протокол чтобы клиент за NAT узнал свой внешний IP+порт, каким его видит внешний мир. Основа для WebRTC и любых P2P-соединений через NAT.
Как работает
- Клиент отсылает UDP-пакет на STUN-сервер (обычно
stun.l.google.com:19302). - STUN-сервер видит: пакет пришёл с
85.140.10.50:54321(это NAT-транслированный адрес). - STUN-сервер отвечает: «твой внешний адрес — 85.140.10.50:54321».
- Клиент теперь знает свой публичный endpoint и может передать его другой стороне через сигналинг.
Пакет
Простой бинарный формат:
- Header 20 байт: Type (2), Length (2), Magic Cookie
0x2112A442(4), Transaction ID (12). - Attributes: TLV-список. Главный —
XOR-MAPPED-ADDRESSв ответе.
Публичные STUN
| Провайдер | Адрес |
|---|---|
| stun.l.google.com:19302 (и .1, .2, .3, .4) | |
| Cloudflare | stun.cloudflare.com:3478 |
| Twilio | global.stun.twilio.com:3478 |
| Nextcloud | stun.nextcloud.com:443 |
Проверить
# stunclient (пакет stuntman-client)
$ stunclient stun.l.google.com 19302
Binding test: success
Local address: 192.168.1.100:54321
Mapped address: 85.140.10.50:54321
Типы NAT (устаревшая классификация)
Старый RFC 3489 определял 4 типа NAT: full cone / restricted cone / port-restricted / symmetric. Сегодня они условны, но термины живут:
| Тип | Что делает | STUN достаточно? |
|---|---|---|
| Full cone | Любой внешний хост может слать на внешний port | Да |
| Restricted cone | Только те, кому клиент писал первый | Да (нужен hole-punch) |
| Port-restricted | Только те endpoint'ы, кому клиент писал | Да (сложнее) |
| Symmetric | Разный внешний порт для каждого назначения | Нет, нужен TURN |
STUN + TCP
Обычно UDP, но есть и TCP-вариант — RFC 5389. Реже используется, потому что цель STUN — узнать endpoint именно для UDP-P2P (WebRTC).
STUN over TLS (STUN/TLS)
Порт 5349. Защищает от подмены STUN-ответов на пути (иначе можно заставить клиента думать что его внешний IP другой).
Где используется
- WebRTC — обязательный этап discovery.
- VoIP-клиенты — SIP-телефоны, Zoom, Discord.
- WireGuard с NAT — endpoint discovery.
- P2P-игры — Steam, PlayStation Network.
Проблема — приватность
Через WebRTC браузер может узнать реальный локальный IP клиента (даже за VPN) и внешний IP. Атака WebRTC IP leak. Защита в браузере:
- Chrome: настройки WebRTC IP handling → «Default public interface only».
- Firefox:
media.peerconnection.enabled = false. - Расширения WebRTC Control / Disable WebRTC.