STUN Server est un serveur du protocole Session Traversal Utilities for NAT (STUN) qui permet à un client de déterminer son adresse IP externe et son port, ainsi que le type de Network Address Translation (NAT) derrière lequel il se trouve. Selon IETF RFC 5389, 2008, STUN est un composant obligatoire de l’infrastructure WebRTC, permettant d’établir une connexion directe peer-to-peer entre clients derrière un NAT.
Points essentiels
STUN Server (Session Traversal Utilities for NAT) est un service réseau fonctionnant selon le protocole défini dans la RFC 5389 et mis à jour dans la RFC 8489. La tâche principale d’un serveur STUN est de fournir au client des informations sur sa propre adresse IP publique et son port tels qu’ils sont vus depuis le réseau externe, ainsi que de déterminer le type de périphérique NAT entre le client et Internet.
L’architecture STUN comprend deux composants : un client STUN intégré dans l’application (par exemple, un navigateur ou une application native WebRTC) et un serveur STUN déployé dans le réseau public. Le client envoie une Binding Request au serveur, qui dans sa réponse indique l’adresse IP source et le port de la requête — c’est-à-dire les adresses publiques du client telles que vues par le serveur. En comparant ces données avec ses adresses locales, le client peut déterminer quel type de NAT est utilisé dans son réseau.
STUN fonctionne sur UDP (port 3478 par défaut) ou TCP (port 3478 ou 5349 pour TLS). Un message STUN se compose d’un en-tête de 20 octets et d’un nombre variable d’attributs. L’en-tête contient le type de message (Binding Request, Binding Response, Binding Error Response), la longueur et un identifiant de transaction unique (96 bits) permettant de faire correspondre les demandes et les réponses. Chaque Binding Response contient l’attribut XOR-MAPPED-ADDRESS — l’adresse externe du client, encodée avec un masquage pour se protéger contre les attaques basées sur l’interception du trafic STUN.
Un serveur STUN fonctionne selon un protocole simple de demande-réponse. Le client derrière le NAT crée une Binding Request et l’envoie au serveur STUN. Le serveur reçoit le paquet, extrait l’adresse IP source et le port de l’expéditeur de l’en-tête UDP, puis crée une Binding Response, en empaquetant cette adresse dans l’attribut XOR-MAPPED-ADDRESS. La réponse est renvoyée à l’adresse source de la demande.
Le client reçoit la réponse et extrait le XOR-MAPPED-ADDRESS, qui contient l’adresse IP externe et le port attribués par le périphérique NAT. Ensuite, le client compare cette adresse avec son adresse locale (RFC 1919 — privée). Si les adresses correspondent, le client n’est pas derrière un NAT. Si elles diffèrent, le client est derrière un NAT, et l’adresse externe est utilisée comme candidat pour ICE (Interactive Connectivity Establishment) dans WebRTC.
Un serveur STUN permet de déterminer le type de NAT via une séquence de requêtes de test. Le client envoie des requêtes avec différents indicateurs (CHANGE-REQUEST) et analyse les réponses. Le cycle complet de découverte comprend l’envoi de requêtes à différentes adresses IP et ports du serveur STUN. Si le serveur répond à une requête avec un port modifié, le NAT est de type Restricted Cone. S’il ne répond pas à une requête avec un port et une IP modifiés, le NAT est de type Symmetric. Cette information est cruciale pour choisir la stratégie ICE dans WebRTC.
Un serveur STUN peut détecter quatre types principaux de NAT, chacun affectant différemment la capacité à établir une connexion P2P. Le type de NAT détermine si STUN peut permettre une connexion directe entre deux clients. Il détermine également quel candidat ICE — host, server reflexive ou relay — sera utilisé pour la connexion.
| Type NAT | Comportement | STUN fonctionne | Fallback ICE |
|---|---|---|---|
| Full Cone | Tout hôte externe peut envoyer un paquet au client | Oui | Server Reflexive |
| Restricted Cone | Uniquement les hôtes auxquels le client a envoyé des paquets | Oui | Server Reflexive |
| Port Restricted | Comme Restricted, mais filtre également par port source | Oui | Server Reflexive |
| Symmetric NAT | Adresse externe unique pour chaque paire hôte:port | Non | Relay (TURN) |
Symmetric NAT est le seul type avec lequel STUN ne peut pas fonctionner. Avec Symmetric NAT, chaque nouvelle requête vers un nouvel hôte de destination reçoit une adresse externe différente (IP et/ou port). Étant donné que le serveur STUN signale l’adresse pour la connexion au serveur STUN lui-même, cette adresse ne convient pas pour se connecter à un autre client. Dans de tels cas, WebRTC utilise un serveur TURN pour relayer le trafic. Selon les recherches (Ford et al., RFC 3489, 2003), environ 8à 10 % de tous les périphériques NAT sur Internet sont symétriques.
Un serveur STUN est intégré dans WebRTC via la configuration RTCPeerConnection. Un navigateur ou une application native utilise STUN pour collecter les candidats ICE, qui sont ensuite échangés via le serveur de signalisation. Dans la configuration WebRTC, le serveur STUN est spécifié dans le tableau iceServers avec le préfixe stun: pour UDP ou stuns: pour les connexions TLS.
Considérons un exemple de configuration d’un serveur STUN en JavaScript lors de la création d’une RTCPeerConnection pour une application 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("Candidat ICE :", event.candidate.candidate);
}
};
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
Cet exemple utilise les serveurs STUN publics de Google (stun.l.google.com:19302). Lors de la création d’une offre ou d’une réponse, le navigateur envoie automatiquement une Binding Request STUN aux serveurs spécifiés, reçoit l’adresse externe (candidat server reflexive) et l’ajoute à la liste des candidats ICE. Après la collecte de tous les candidats, ils sont envoyés au pair distant via le serveur de signalisation pour tenter d’établir une connexion P2P directe.
Dans le processus ICE, il existe trois types de candidats : host (adresse locale), srflx (server reflexive — obtenu depuis STUN) et relay (relayé via TURN). Le serveur STUN permet la création de candidats srflx, qui ont une priorité plus élevée que les candidats relay car une connexion basée sur STUN est directe et ne nécessite pas de relais. Le processus ICE vérifie toutes les combinaisons de candidats (locaux et obtenus depuis STUN) des deux pairs, en commençant par les priorités les plus élevées.
Un serveur STUN a des limitations fondamentales liées à l’architecture du protocole. La limitation principale est l’incapacité à fonctionner avec Symmetric NAT, où chaque nouvelle requête vers un hôte externe reçoit un port externe unique. Dans ce cas, l’adresse obtenue du serveur STUN ne peut pas être utilisée pour se connecter à un autre pair car le NAT a créé une liaison uniquement pour la communication avec le serveur STUN lui-même.
La deuxième limitation est que STUN ne fournit pas de relais de données. Si la connexion P2P directe est impossible (les deux pairs derrière Symmetric NAT), STUN n’offre pas de chemin alternatif pour la transmission des données. Dans ce cas, un serveur TURN est nécessaire, qui agit comme un relais de trafic multimédia entre les pairs, recevant les données d’un participant et les envoyant à un autre via son adresse IP publique.
Malgré les limitations, un serveur STUN reste un composant essentiel de l’infrastructure WebRTC. Dans la plupart des cas (80 à 90 %), une connexion P2P directe peut être établie avec STUN, ce qui évite les coûts du relais TURN et réduit la latence de transmission des données multimédias. Pour les applications WebRTC publiques, il est recommandé d’utiliser une combinaison de serveurs STUN et TURN avec un fallback automatique.
Foire aux questions
Un serveur STUN est un « miroir » sur Internet qui indique à un client son adresse IP externe. Lorsqu’un ordinateur se trouve derrière un routeur (NAT), il ne connaît pas son adresse publique. Le serveur STUN aide à la découvrir afin que d’autres ordinateurs puissent se connecter directement.
Dans WebRTC, le serveur STUN est spécifié dans la configuration RTCPeerConnection. Le navigateur envoie une requête STUN pour obtenir l’adresse externe du candidat (srflx). Ce candidat est transmis au pair distant via le serveur de signalisation, et ICE tente d’établir une connexion directe entre eux.
STUN aide à découvrir l’adresse externe pour une connexion P2P directe. TURN relaie le trafic via son serveur lorsque le P2P n’est pas possible. STUN est un « miroir », TURN est un « intermédiaire ». TURN crée une charge sur le serveur et ajoute de la latence, donc STUN est préféré.
Google fournit des serveurs STUN gratuits : stun.l.google.com:19302, stun1.l.google.com:19302. Twilio fournit également une infrastructure STUN + TURN via son service Network Traversal Service. Pour les applications de production, il est préférable d’utiliser vos propres serveurs STUN/TURN ou des serveurs commerciaux avec une disponibilité garantie.
Symmetric NAT crée un mappage de port externe unique pour chaque paire « adresse locale : adresse externe de destination ». L’adresse que le client reçoit du serveur STUN est liée à la connexion avec ce serveur STUN. Lorsqu’un autre pair tente d’utiliser cette adresse, Symmetric NAT bloque le paquet car le mappage de port est différent pour la nouvelle adresse de destination.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi