STUN Server — är servern för Session Traversal Utilities for NAT (STUN)-protokollet, som gör det möjligt för en klient att bestämma sin externa IP-adress och port, samt typen av Network Address Translation (NAT) som den befinner sig bakom. Enligt IETF RFC 5389, 2008 är STUN en obligatorisk komponent i WebRTC-infrastrukturen som säkerställer etablering av direkt peer-to-peer-förbindelse mellan klienter bakom NAT.
Huvudpunkter
STUN Server (Session Traversal Utilities for NAT) — är en nätverkstjänst som fungerar enligt protokollet definierat i RFC 5389 och uppdaterat i RFC 8489. Huvuduppgiften för STUN-servern är att ge klienten information om sin egen publika IP-adress och port som är synliga från det externa nätverket, samt att bestämma typen av NAT-enhet mellan klienten och internet.
STUN-arkitekturen består av två komponenter: en STUN-klient inbäddad i applikationen (t.ex. webbläsare eller inbyggd WebRTC-applikation) och en STUN-server placerad i det publika nätverket. Klienten skickar en STUN Binding Request till servern, som i svaret anger IP-adressen och porten för förfrågans källa — det vill säga klientens publika adresser som servern ser. Genom att jämföra dessa data med lokala adresser kan klienten bestämma vilken typ av NAT som används i dess nätverk.
STUN fungerar över UDP (port 3478 som standard) eller TCP (port 3478 eller 5349 för TLS). Ett STUN-meddelande består av en 20-byte rubrik och ett variabelt antal attribut. Rubriken innehåller meddelandetypen (Binding Request, Binding Response, Binding Error Response), längd och en unik transaktionsidentifierare (96 bitar) som gör det möjligt att matcha förfrågningar och svar. Varje Binding Response innehåller attributet XOR-MAPPED-ADDRESS — klientens externa adress, kodad med maskering för att skydda mot attacker baserade på avlyssning av STUN-trafik.
STUN-servern fungerar enligt ett enkelt förfrågan-svar-protokoll. Klienten bakom NAT skapar en Binding Request och skickar den till STUN-servern. Servern tar emot paketet, extraherar från UDP-rubriken käll-IP-adressen och avsändarporten, och skapar sedan en Binding Response genom att packa denna adress i attributet XOR-MAPPED-ADDRESS. Svaret skickas tillbaka till förfrågans källadress.
Klienten tar emot svaret och extraherar XOR-MAPPED-ADDRESS, som innehåller den externa IP-adressen och porten som tilldelats av NAT-enheten. Sedan jämför klienten denna adress med sin lokala (RFC 1919 — privata) adress. Om adresserna matchar — befinner sig klienten inte bakom NAT. Om de skiljer sig — befinner sig klienten bakom NAT och den externa adressen används som kandidat för ICE (Interactive Connectivity Establishment) i WebRTC.
STUN-servern gör det möjligt att bestämma NAT-typen genom en serie testförfrågningar. Klienten skickar förfrågningar med olika flaggor (CHANGE-REQUEST) och analyserar svaren. Den fullständiga upptäcktscykeln innefattar att skicka förfrågningar till olika IP-adresser och portar på STUN-servern. Om servern svarar på en förfrågan med ändrad port — NAT av typen Restricted Cone. Om den inte svarar på en förfrågan med ändrad port och IP — NAT av typen Symmetric. Denna information är kritisk för val av ICE-strategi i WebRTC.
STUN-servern kan bestämma fyra huvudtyper av NAT, som var och en påverkar möjligheten att etablera P2P-förbindelse på olika sätt. NAT-typen avgör om STUN kan tillhandahålla en direkt anslutning mellan två klienter. Från NAT-typen beror det på vilken ICE-kandidat — host, server reflexive eller relay — som kommer att användas för anslutningen.
| NAT-typ | Beteende | STUN fungerar | ICE Fallback |
|---|---|---|---|
| Full Cone | Vilken extern värd som helst kan skicka ett paket till klienten | Ja | Server Reflexive |
| Restricted Cone | Endast värdar som klienten skickat paket till | Ja | Server Reflexive |
| Port Restricted | Som Restricted, men filtrerar även efter källport | Ja | Server Reflexive |
| Symmetric NAT | Extern adress är unik för varje värd:port-par | Nej | Relay (TURN) |
Symmetric NAT — den enda typen som STUN inte kan hantera. Vid Symmetric NAT får varje ny förfrågan till en ny målserver en annan extern adress (IP och/eller port). Eftersom STUN-servern rapporterar adressen för anslutningen till själva STUN-servern, är denna adress oanvändbar för anslutning till en annan klient. I sådana fall används i WebRTC en TURN-server för vidarebefordran av trafik. Enligt forskning (Ford et al., RFC 3489, 2003) är cirka 8–10% av alla NAT-enheter på internet symmetriska.
STUN-servern integreras i WebRTC via konfigurationen av RTCPeerConnection. Webbläsaren eller den inbyggda applikationen använder STUN för att samla in ICE-kandidater, som sedan utbyts via Signaling Server. I WebRTC-konfigurationen anges STUN-servern i arrayen iceServers med prefixet stun: för UDP eller stuns: för TLS-anslutning.
Låt oss titta på ett exempel på konfiguration av STUN-server i JavaScript när vi skapar en RTCPeerConnection för en WebRTC-applikation.
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-kandidat:", event.candidate.candidate);
}
};
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
I detta exempel används Googles publika STUN-servrar (stun.l.google.com:19302). När offer eller answer skapas skickar webbläsaren automatiskt en STUN Binding Request till de angivna servrarna, tar emot den externa adressen (server reflexive candidate) och lägger till den i listan över ICE-kandidater. Efter att alla kandidater samlats in skickas de till den fjärran partnern via Signaling Server för att försöka etablera en direkt P2P-förbindelse.
I ICE-processen finns tre typer av kandidater: host (lokal adress), srflx (server reflexive — erhållen från STUN) och relay (vidarebefordrad via TURN). STUN-servern säkerställer uppkomsten av srflx-kandidater, som har högre prioritet än relay, eftersom anslutning via STUN är direkt och inte kräver vidarebefordran. ICE-processen kontrollerar alla kombinationer av kandidater (lokala och erhållna från STUN) från båda parter, med början från de högsta prioriteterna.
STUN-servern har grundläggande begränsningar relaterade till protokollets arkitektur. Den främsta begränsningen är oförmågan att fungera med Symmetric NAT, där varje ny förfrågan till en extern värd får en unik extern port. I detta fall kan adressen som erhållits från STUN-servern inte användas för anslutning till en annan partner, eftersom NAT har skapat en bindning endast för kommunikation med själva STUN-servern.
Den andra begränsningen är att STUN inte tillhandahåller vidarebefordran av data. Om en direkt P2P-förbindelse är omöjlig (båda parter befinner sig bakom Symmetric NAT), erbjuder STUN ingen alternativ väg för dataöverföring. I detta fall krävs en TURN-server, som fungerar som en vidarebefordrare av medietrafik mellan parterna, genom att ta emot data från en deltagare och skicka dem till den andre via sin publika IP-adress.
Trots begränsningarna förblir STUN-servern en kritisk komponent i WebRTC-infrastrukturen. I de flesta fall (80–90%) kan en direkt P2P-förbindelse etableras med hjälp av STUN, vilket gör det möjligt att undvika kostnader för TURN-vidarebefordran och minska fördröjningen vid överföring av mediadata. För offentliga WebRTC-applikationer rekommenderas att använda en kombination av STUN- och TURN-servrar med automatisk fallback för att garantera anslutning under alla nätverksförhållanden.
Vanliga frågor
En STUN-server — är en spegel på internet som berättar för klienten dess externa IP-adress. När en dator befinner sig bakom en router (NAT) känner den inte till sin publika adress. STUN-servern hjälper till att ta reda på den så att andra datorer kan ansluta direkt.
I WebRTC anges STUN-servern i konfigurationen av RTCPeerConnection. Webbläsaren skickar en STUN-förfrågan för att få den externa adressen för kandidaten (srflx). Denna kandidat överförs till den fjärran partnern via Signaling Server och ICE försöker etablera en direkt anslutning mellan dem.
STUN hjälper till att ta reda på den externa adressen för direkt P2P-anslutning. TURN vidarebefordrar trafik genom sin egen server när P2P är omöjligt. STUN är en spegel, TURN är en mellanhand. TURN skapar belastning på servern och ökar fördröjningen, därför är STUN att föredra.
Google tillhandahåller gratis STUN-servrar: stun.l.google.com:19302, stun1.l.google.com:19302. Twilio tillhandahåller också STUN + TURN-infrastruktur via tjänsten Network Traversal Service. För produktionsapplikationer är det bättre att använda egna eller kommersiella STUN/TURN-servrar med garanterad tillgänglighet.
Symmetric NAT skapar en unik extern portmappning för varje par av lokal adress:extern måladress. Adressen som klienten får från STUN-servern är bunden till anslutningen med denna STUN-server. När en annan partner försöker använda denna adress blockerar Symmetric NAT paketet eftersom portmappningen är annorlunda för den nya måladressen.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också