STUN (Session Traversal Utilities for NAT) ist ein leichtgewichtiges Client-Server-Protokoll, mit dem ein Gerät hinter einem NAT-Router seine eigene öffentliche IP-Adresse und seinen öffentlichen Port ermitteln kann. Es ist die Grundlage für direkte Verbindungen bei WebRTC, VoIP und anderen Echtzeit-Anwendungen.
Wie STUN funktioniert
Der Client schickt einen Binding Request an einen STUN-Server im Internet. Der Server liest aus dem eingehenden Paket die Absenderadresse ab — das ist die öffentliche IP-Adresse und der Port, den der NAT-Router dem Client zugewiesen hat — und schickt sie als Binding Response zurück. Der Client kennt damit seine von außen sichtbare Adresse, ohne selbst in den Router schauen zu können.
STUN ist ausdrücklich keine vollständige NAT-Traversal-Lösung: Es bohrt keine Löcher in Firewalls und stellt keine Verbindung zum Partner her. Es liefert nur die Information, die andere Verfahren wie ICE oder SIP-Clients für den Verbindungsaufbau benötigen. Details sind in NAT und RFC 8489 definiert.
Technische Details
- Standard-Port 3478 (UDP und TCP), 5349 für TLS-geschützte Verbindungen.
- Nachrichten sind binär: 20-Byte-Header mit Magic Cookie 0x2112A442 und einer 96-Bit-Transaction-ID zur Zuordnung von Antworten.
- Nachrichtentypen: Binding Request, Binding Response, Binding Error Response und Indications.
- Fehlerklassen: 400er (Client-Fehler) und 500er (Server-Fehler).
Einsatz und Grenzen
In WebRTC wird der STUN-Server in der iceServers-Konfiguration angegeben, zum Beispiel stun:stun.l.google.com:19302. Dahinter steckt die Idee: Das Gerät schickt einen STUN-Request und erhält die öffentliche Adresse als sogenannten Server-Reflexiv-Kandidaten für ICE.
Die Grenze von STUN zeigt sich bei symmetrischem NAT: Dort vergibt der Router für jede Zieladresse ein neues Port-Mapping, die per STUN ermittelte Adresse gilt dann nur für den STUN-Server, nicht für den eigentlichen Gesprächspartner. In solchen Fällen hilft nur TURN mit seinem Relay. STUN läuft meist über UDP, weil es nur wenige kleine Pakete austauscht.