TURN Server — je server protokolu Traversal Using Relays around NAT, který přenáší médiový provoz mezi dvěma peery, když přímé P2P spojení není možné. Podle IETF RFC 5766, 2010 slouží TURN server jako poslední záloha (fallback) v procesu ICE WebRTC a zajišťuje garantované spojení i při Symmetric NAT a podnikových firewallech.
Hlavní body
TURN Server (Traversal Using Relays around NAT) — je síťová služba definovaná v RFC 5766 a aktualizovaná v RFC 8656, která přenáší UDP a TCP provoz mezi dvěma klienty, když přímé P2P spojení není možné kvůli omezením NAT nebo firewallů. V architektuře WebRTC slouží TURN server jako konečný záložní mechanismus, který zaručuje spojení za všech síťových podmínek.
Na rozdíl od STUN, který pouze informuje klienta o jeho externí adrese, TURN server se aktivně účastní přenosu dat. Každý peer naváže spojení s TURN serverem a odesílá mu svá médiová data. TURN server následně přesměruje tato data druhému peeru. Výsledkem je, že mezi peery neexistuje přímé spojení — veškerý provoz prochází přenosovým serverem, což zaručuje doručení i za těch nejpřísnějších omezení NAT.
TURN je rozšířením protokolu STUN. Zprávy TURN používají stejnou 20bajtovou hlavičku a stejný mechanismus atributů. Klíčový rozdíl je v tom, že TURN definuje nové typy zpráv (Allocate, Refresh, Send, Data, CreatePermission, ChannelBind) a atributy potřebné pro správu přenosových alokací. Klient vytváří alokaci na TURN serveru prostřednictvím zprávy Allocate, obdrží přenosovou adresu (relayed transport address) a používá ji pro odesílání a příjem dat prostřednictvím serveru.
TURN server pracuje podle následující posloupnosti kroků. Klient odešle požadavek Allocate s autentizací (username, credential). Server zkontroluje přihlašovací údaje a vytvoří alokaci — dočasné připojení přenosové adresy (IP:port na TURN serveru) ke klientovi. Server vrátí odpověď Allocate s přenosovou adresou (relayed transport address) — adresou, kterou budou ostatní peery používat pro odesílání dat tomuto klientovi prostřednictvím TURN serveru.
Po vytvoření alokace může klient odesílat data prostřednictvím TURN serveru pomocí zpráv Send Indication nebo prostřednictvím kanálů (ChannelBind). Při příjmu dat od klienta TURN server zkontroluje oprávnění (permissions) a přenese data cílovému peeru. Pro příjem příchozích dat musí klient nejprve vytvořit oprávnění pro peera, od kterého očekává data, jinak TURN server příchozí paket odmítne. Oprávnění se vytváří prostřednictvím zprávy CreatePermission s uvedením IP adresy peera.
Alokace na TURN serveru má omezenou životnost — standardně 10 minut. Klient musí pravidelně odesílat požadavek Refresh Request pro prodloužení alokace. Životnost je uvedena v sekundách v atributu LIFETIME. Pokud není Refresh odeslán, server alokaci smaže a uvolní přenosovou adresu. Doporučený interval obnovení je 5 minut (300 sekund) pro ochranu proti ztrátě paketů Refresh.
Ve WebRTC se TURN server konfiguruje prostřednictvím nastavení RTCPeerConnection v poli iceServers. TURN servery mohou používat jak UDP, tak TCP nebo TLS přenos. Pro autentizaci se obvykle používají dočasné přihlašovací údaje (TURN credentials), generované na aplikačním serveru a časově omezené.
Podívejme se na příklad konfigurace TURN serveru v JavaScriptu s autentizací pomocí tokenu HMAC-SHA1.
async function createPeerConnection(turnServerUrl) {
const credentials = await fetchTurnCredentials();
const config = {
iceServers: [
{
urls: "stun:stun.l.google.com:19302"
},
{
urls: turnServerUrl,
username: credentials.username,
credential: credentials.credential
}
],
iceTransportPolicy: "all"
};
return new RTCPeerConnection(config);
}
async function fetchTurnCredentials() {
const response = await fetch("/api/turn-credentials");
return response.json();
}
const turnUrl = "turn:turn.example.com:3478";
const pc = await createPeerConnection(turnUrl);
V tomto příkladu je TURN server uveden společně se STUN serverem v jednotné konfiguraci ICE. Proces ICE nejprve zkusí použít kandidáty host a kandidáty srflx získané od STUN. Pokud přímé spojení selže, ICE automaticky přepne na přenosového kandidáta získaného z TURN serveru. Parametr iceTransportPolicy: "all" povoluje přenosové kandidáty — alternativní hodnota "relay" zakazuje všechny kandidáty kromě TURN, což je užitečné pro testování.
Pro zabránění neoprávněnému použití TURN server vyžaduje autentizaci. Standardním přístupem je použití dočasných přihlašovacích údajů (time-limited credentials), generovaných na aplikačním serveru pomocí HMAC-SHA1. Aplikační server zašifruje uživatelské jméno tajným klíčem TURN serveru a vrátí klientovi uživatelské jméno a přihlašovací údaje. Klient je předá do konfigurace RTCPeerConnection a prohlížeč je použije při vytváření alokace na TURN serveru. Po vypršení platnosti přihlašovacích údajů klient získá nové z aplikačního serveru.
TURN a STUN řeší podobné úkoly překonávání NAT, ale zásadně se liší mechanismem a náklady. TURN přenáší provoz a funguje jako prostředník, zatímco STUN pouze pomáhá určit externí adresu pro přímé P2P spojení. Výběr mezi nimi je určen typem NAT peerů a požadavky na výkon.
| Kritérium | STUN | TURN |
|---|---|---|
| Mechanismus | Určení externí adresy | Přenos provozu |
| Spojení | Přímé P2P | Přes přenosový server |
| Zpoždění | Minimální (přímá trasa) | Dodatečné (přes přenos) |
| Zatížení serveru | Pouze počáteční požadavky | Trvalý přenos provozu |
| Náklady | Nízké (jednotlivé požadavky) | Vysoké (provoz na serveru) |
| Práce se Symmetric NAT | Ne | Ano |
| Šířka pásma | Pouze limit P2P kanálu | Limit serverového kanálu |
V praxi se TURN server používá pouze pro spojení, kde P2P není možný. Podle údajů Google (statistiky WebRTC, 2023) přibližně 15–20% všech WebRTC spojení vyžaduje přenos TURN. Zbývajících 80–85% je navázáno prostřednictvím STUN nebo místních kandidátů host. Při navrhování aplikace je třeba vyčlenit rozpočet na provoz TURN ve výši 15–20% celkového objemu médiových dat, pokud cílová skupina zahrnuje uživatele z podnikových sítí a regionů s přísnými omezeními NAT.
TURN server spotřebovává významné zdroje, protože veškerý médiový provoz prochází přes něj. Každé aktivní spojení s přenosem TURN využívá šířku pásma serveru rovnající se celkové kapacitě médiového provozu (příchozí + odchozí tok). Pro videohovor v HD kvalitě (720p) to může být 1,5–2,5 Mb/s na spojení v každém směru, tedy 3–5 Mb/s celkového provozu přes TURN server.
Existuje několik možností nasazení TURN infrastruktury. Bezplatné veřejné TURN servery se nedoporučují pro produkci kvůli chybějícím zárukám kvality a bezpečnosti. Komerční poskytovatelé (Twilio Network Traversal Service, Xirsys, Metered) nabízejí TURN jako službu s platbou za gigabajt provozu — typické náklady jsou $0,005–0,02 za gigabajt. Vlastní nasazení na základě coturn (open-source TURN server) vyžaduje server s dostatečnou šířkou pásma a konfigurací monitorování.
Při výběru řešení pro TURN server je třeba zohlednit geografii uživatelů, náklady na provoz a bezpečnostní požadavky. Pro aplikace s tisíci souběžných hovorů může být self-hosted coturn na serverech s širokým pásmem (1+ Gb/s) úspornější než komerční poskytovatelé. Pro malé projekty s desítkami uživatelů jsou komerční služby TURN výhodnější kvůli absenci nákladů na správu a monitorování.
Často kladené dotazy
TURN server je prostředník, který předává data mezi uživateli, když se nemohou spojit přímo. Pokud jsou dva počítače za směrovači, které neumožňují přímé spojení, TURN server příjmá data od jednoho a odesílá je druhému.
TURN server je vyžadován, když jsou oba účastníci WebRTC hovoru za Symmetric NAT nebo podnikovými firewally blokujícími P2P provoz. V takových případech STUN nemůže pomoci a proces ICE automaticky přepne na přenosového kandidáta získaného z TURN serveru.
STUN jednoduše ukáže počítači jeho externí adresu pro přímé spojení. TURN aktivně přenáší provoz skrze sebe. STUN nezpůsobuje zatížení serveru, TURN spotřebovává šířku pásma. STUN funguje pouze s určitými typy NAT, TURN funguje vždy, ale je dražší.
Náklady na TURN server závisí na poskytovateli a objemu provozu. Twilio účtuje přibližně $0,005–0,01 za GB provozu prošlého TURN. Xirsys — od $0,007 za GB. Vlastní nasazení coturn vyžaduje server s šířkou pásma alespoň 100 Mb/s, jehož náklady závisí na poskytovateli hostingu.
Vlastní TURN server se konfiguruje pomocí coturn (open-source). Instalace zahrnuje konfiguraci portů, autentizace (shared secret), TLS certifikátů a firewallu. Základní konfigurační soubor obsahuje parametry listening-port, realm, user a fingerprint. Po konfiguraci je server uveden v iceServers WebRTC s předponou turn: nebo turns: pro TLS.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také