STUN Server — це сервер протоколу Session Traversal Utilities for NAT (STUN), який дозволяє клієнту визначити свою зовнішню IP-адресу та порт, а також тип Network Address Translation (NAT), за яким він знаходиться. Згідно з IETF RFC 5389, 2008, STUN є обов’язковим компонентом інфраструктури WebRTC, що забезпечує встановлення прямого peer-to-peer з’єднання між клієнтами за NAT.
Головне
STUN Server (Session Traversal Utilities for NAT) — це мережева послуга, яка працює за протоколом, визначеним в RFC 5389 та оновленим в RFC 8489. Основне завдання STUN сервера — надати клієнту інформацію про його власну публічну IP-адресу та порт, як вони видні з зовнішньої мережі, а також визначити тип NAT-пристрою між клієнтом та інтернетом.
Архітектура STUN включає два компоненти: клієнт STUN, вбудований в додаток (наприклад, браузер або нативний додаток WebRTC), і STUN сервер, розміщений в публічній мережі. Клієнт надсилає Binding Request на сервер, який у відповіді вказує IP-адресу джерела та порт запиту — тобто публічні адреси клієнта, як їх бачить сервер. Порівнюючи ці дані з локальними адресами, клієнт може визначити, який тип NAT використовується в його мережі.
STUN працює поверх UDP (порт 3478 за замовчуванням) або TCP (порт 3478 або 5349 для TLS). Повідомлення STUN складається з 20-байтового заголовка та змінної кількості атрибутів. Заголовок містить тип повідомлення (Binding Request, Binding Response, Binding Error Response), довжину та унікальний ідентифікатор транзакції (96 біт), що дозволяє зіставляти запити та відповіді. Кожна Binding Response містить атрибут XOR-MAPPED-ADDRESS — зовнішню адресу клієнта, закодовану з маскуванням для захисту від атак на основі перехоплення STUN-трафіку.
STUN сервер працює за простим протоколом запит-відповідь. Клієнт, що знаходиться за NAT, формує Binding Request і надсилає її на STUN сервер. Сервер отримує пакет, вилучає з UDP-заголовка IP-адресу джерела та порт відправника, потім формує Binding Response, пакуючи цю адресу в атрибут XOR-MAPPED-ADDRESS. Відповідь надсилається на адресу джерела запиту.
Клієнт отримує відповідь та вилучає XOR-MAPPED-ADDRESS, який містить зовнішню IP-адресу та порт, призначені NAT-пристроєм. Потім клієнт порівнює цю адресу зі своєю локальною (RFC 1919 — приватною) адресою. Якщо адреси збігаються — клієнт не знаходиться за NAT. Якщо відрізняються — клієнт за NAT, і зовнішня адреса використовується як кандидат для ICE (Interactive Connectivity Establishment) в WebRTC.
STUN сервер дозволяє визначити тип NAT через послідовність тестових запитів. Клієнт надсилає запити з різними прапорціями (CHANGE-REQUEST) та аналізує відповіді. Повний цикл виявлення включає надсилання запитів на різні IP-адреси та порти STUN сервера. Якщо сервер відповідає на запит зі зміненим портом — NAT типу Restricted Cone. Якщо не відповідає на запит зі зміненим портом та IP — NAT типу Symmetric. Ця інформація критична для вибору стратегії ICE в WebRTC.
STUN сервер здатен виявити чотири основні типи NAT, кожен з яких по-різному впливає на можливість встановлення P2P-з’єднання. Тип NAT визначає, чи може STUN забезпечити пряме з’єднання між двома клієнтами. Він також визначає, який ICE кандидат — host, server reflexive або relay — буде використаний для з’єднання.
| Тип NAT | Поведінка | STUN працює | ICE Fallback |
|---|---|---|---|
| Full Cone | Будь-який зовнішній хост може надіслати пакет клієнту | Так | Server Reflexive |
| Restricted Cone | Тільки хости, яким клієнт надсилав пакети | Так | Server Reflexive |
| Port Restricted | Як Restricted, але також фільтрує за портом джерела | Так | Server Reflexive |
| Symmetric NAT | Зовнішня адреса унікальна для кожної пари хост:порт | Ні | Relay (TURN) |
Symmetric NAT — єдиний тип, з яким STUN не справляється. При Symmetric NAT кожен новий запит до нового хоста призначення отримує іншу зовнішню адресу (IP та/або порт). Оскільки STUN сервер повідомляє адресу для з’єднання з самим STUN сервером, ця адреса непридатна для підключення до іншого клієнта. У таких випадках WebRTC використовує TURN сервер для ретрансляції трафіку. За даними досліджень (Ford et al., RFC 3489, 2003), близько 8–10% всіх NAT-пристроїв в інтернеті є симетричними.
STUN сервер інтегрується в WebRTC через конфігурацію RTCPeerConnection. Браузер або нативний додаток використовує STUN для збору ICE кандидатів, які потім обмінюються через Signaling Server. У конфігурації WebRTC STUN сервер вказується в масиві iceServers з префіксом stun: для UDP або stuns: для TLS-з’єднань.
Розглянемо приклад налаштування STUN сервера в JavaScript при створенні RTCPeerConnection для WebRTC-додатка.
const config = {
iceServers: [
{
urls: "stun:stun.l.google.com:19302"
},
{
urls: "stun:stun1.l.google.com:19302"
}
]
};
const pc = new RTCPeerConnection(config);
pc.onicecandidate = (event) => {
if (event.candidate) {
console.log("ICE кандидат:", event.candidate.candidate);
}
};
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
У цьому прикладі використовуються публічні STUN сервери Google (stun.l.google.com:19302). При створенні offer або answer браузер автоматично надсилає STUN Binding Request на вказані сервери, отримує зовнішню адресу (server reflexive кандидат) та додає її до списку ICE кандидатів. Після збору всіх кандидатів вони надсилаються віддаленому піру через Signaling Server для спроби встановлення прямого P2P-з’єднання.
В процесі ICE існує три типи кандидатів: host (локальна адреса), srflx (server reflexive — отриманий від STUN) та relay (ретрансльований через TURN). STUN сервер забезпечує створення srflx-кандидатів, які мають вищий пріоритет, ніж relay-кандидати, оскільки STUN-з’єднання є прямим і не потребує ретрансляції. ICE-процес перевіряє всі комбінації кандидатів (локальні та отримані від STUN) обох пірів, починаючи з найвищих пріоритетів.
STUN сервер має фундаментальні обмеження, пов’язані з архітектурою протоколу. Основне обмеження — неможливість роботи з Symmetric NAT, коли кожен новий запит до зовнішнього хоста отримує унікальний зовнішній порт. У цьому випадку адреса, отримана від STUN сервера, не може бути використана для підключення до іншого піра, оскільки NAT створив прив’язку тільки для взаємодії з самим STUN сервером.
Друге обмеження пов’язане з тим, що STUN не забезпечує ретрансляцію даних. Якщо пряме P2P-з’єднання неможливе (обидва піри за Symmetric NAT), STUN не надає альтернативного шляху для передачі даних. У цьому випадку потрібен TURN сервер, який виступає ретранслятором медіатрафіку між пірами, приймаючи дані від одного учасника та надсилаючи їх іншому через свою публічну IP-адресу.
Незважаючи на обмеження, STUN сервер залишається критичним компонентом WebRTC-інфраструктури. У більшості випадків (80–90%) пряме P2P-з’єднання вдається встановити за допомогою STUN, що дозволяє уникнути витрат на TURN-ретрансляцію та зменшує затримку передачі медіаданих. Для публічних WebRTC-додатків рекомендується використовувати комбінацію STUN та TURN серверів з автоматичним fallback.
Часті запитання
STUN сервер — це дзеркало в інтернеті, яке повідомляє клієнту його зовнішню IP-адресу. Коли комп’ютер знаходиться за маршрутизатором (NAT), він не знає своєї публічної адреси. STUN сервер допомагає дізнатися її, щоб інші комп’ютери могли підключитися напряму.
У WebRTC STUN сервер вказується в конфігурації RTCPeerConnection. Браузер надсилає STUN-запит для отримання зовнішньої адреси кандидата (srflx). Цей кандидат передається віддаленому піру через Signaling Server, і ICE намагається встановити пряме з’єднання між ними.
STUN допомагає дізнатися зовнішню адресу для прямого P2P-з’єднання. TURN ретранслює трафік через свій сервер, коли P2P неможливий. STUN — це дзеркало, TURN — посередник. TURN створює навантаження на сервер та додає затримку, тому STUN є більш бажаним.
Google надає безкоштовні STUN сервери: stun.l.google.com:19302, stun1.l.google.com:19302. Twilio також надає STUN + TURN інфраструктуру через свій Network Traversal Service. Для продакшн-додатків краще використовувати власні або комерційні STUN/TURN сервери з гарантованою доступністю.
Symmetric NAT створює унікальне зовнішнє відображення порту для кожної пари «локальна адреса:зовнішня адреса призначення». Адреса, яку клієнт отримує від STUN сервера, прив’язана до з’єднання з цим STUN сервером. Коли інший пір намагається використати цю адресу, Symmetric NAT блокує пакет, оскільки відображення порту відрізняється для нової адреси призначення.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також