Serveur TURN est un serveur du protocole Traversal Using Relays around NAT qui relaie le trafic multimédia entre deux pairs lorsqu’une connexion P2P directe est impossible. Selon IETF RFC 5766, 2010, le serveur TURN agit comme dernier recours (fallback) dans le processus ICE de WebRTC, garantissant la connexion même avec un NAT Symétrique et des pare-feux d’entreprise.
Points clés
Serveur TURN (Traversal Using Relays around NAT) est un service réseau défini dans la RFC 5766 et mis à jour dans la RFC 8656 qui relaie le trafic UDP et TCP entre deux clients lorsqu’une connexion P2P directe est impossible en raison de restrictions NAT ou de pare-feux. Dans l’architecture WebRTC, le serveur TURN agit comme mécanisme de secours final, garantissant la connectivité dans toutes les conditions réseau.
Contrairement à STUN, qui indique simplement à un client son adresse externe, le serveur TURN participe activement à la transmission des données. Chaque pair établit une connexion avec le serveur TURN et lui envoie ses données multimédia. Le serveur TURN, à son tour, transmet ces données à l’autre pair. En conséquence, il n’y a pas de connexion directe entre les pairs — tout le trafic passe par le serveur relais, garantissant la livraison même sous les restrictions NAT les plus strictes.
TURN est une extension du protocole STUN. Les messages TURN utilisent le même en-tête de 20 octets et le même mécanisme d’attributs. La différence clé est que TURN définit de nouveaux types de messages (Allocate, Refresh, Send, Data, CreatePermission, ChannelBind) et des attributs nécessaires à la gestion des allocations relais. Le client crée une allocation sur le serveur TURN via un message Allocate, reçoit une adresse de transport relayée (relayed transport address) et l’utilise pour envoyer et recevoir des données via le serveur.
Le serveur TURN fonctionne selon la séquence d’étapes suivante. Le client envoie une demande Allocate avec authentification (username, credential). Le serveur vérifie les identifiants et crée une allocation — une liaison temporaire d’une adresse relayée (IP:port sur le serveur TURN) au client. Le serveur renvoie une réponse Allocate avec une adresse de transport relayée — l’adresse que les autres pairs utiliseront pour envoyer des données à ce client via le serveur TURN.
Après la création de l’allocation, le client peut envoyer des données via le serveur TURN en utilisant des messages Send Indication ou via des canaux (ChannelBind). Lors de la réception de données du client, le serveur TURN vérifie les permissions (autorisation d’envoyer des données à des pairs spécifiques) et relaie les données au pair cible. Pour recevoir des données entrantes, le client doit d’abord créer une permission pour le pair dont il attend des données ; sinon, le serveur TURN rejettera le paquet entrant. Une permission est créée via un message CreatePermission spécifiant l’adresse IP du pair.
Une allocation sur le serveur TURN a une durée de vie limitée — 10 minutes par défaut. Le client doit envoyer périodiquement une demande Refresh pour prolonger l’allocation. La durée de vie est spécifiée en secondes dans l’attribut LIFETIME. Si aucun Refresh n’est reçu, le serveur supprime l’allocation et libère l’adresse relayée. Intervalle de rafraîchissement recommandé — 5 minutes (300 secondes) pour se protéger contre la perte de paquets Refresh.
Dans WebRTC, le serveur TURN est configuré via la configuration RTCPeerConnection dans le tableau iceServers. Les serveurs TURN peuvent utiliser le transport UDP, TCP ou TLS. L’authentification utilise généralement des identifiants à durée limitée (identifiants TURN) générés sur le serveur d’application avec une période de validité restreinte.
Considérons un exemple de configuration de serveur TURN en JavaScript avec authentification par jeton 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);
Dans cet exemple, le serveur TURN est spécifié avec un serveur STUN dans une seule configuration ICE. Le processus ICE tente d’abord d’utiliser les candidats host et les candidats srflx obtenus de STUN. Si la connexion directe échoue, ICE bascule automatiquement vers le candidat relay obtenu du serveur TURN. Le paramètre iceTransportPolicy: "all" active les candidats relay — la valeur alternative "relay" désactive tous les candidats sauf TURN, ce qui est utile pour les tests.
Pour empêcher toute utilisation non autorisée, le serveur TURN nécessite une authentification. L’approche standard consiste à générer des identifiants à durée limitée sur le serveur d’application en utilisant HMAC-SHA1. Le serveur d’application chiffre le nom d’utilisateur avec la clé secrète du serveur TURN et renvoie le nom d’utilisateur et l’identifiant au client. Le client les transmet à la configuration RTCPeerConnection, et le navigateur les utilise lors de la création d’une allocation sur le serveur TURN. Lorsque les identifiants expirent, le client en obtient de nouveaux auprès du serveur d’application.
TURN et STUN résolvent des tâches connexes de traversée NAT, mais diffèrent fondamentalement par leur mécanisme et leur coût. TURN relaie le trafic, agissant comme intermédiaire, tandis que STUN aide seulement à déterminer l’adresse externe pour une connexion P2P directe. Le choix entre eux dépend du type NAT des pairs et des exigences de performance.
| Critère | STUN | TURN |
|---|---|---|
| Mécanisme | Découverte d’adresse externe | Relais de trafic |
| Connexion | P2P directe | Via serveur relais |
| Latence | Minimale (route directe) | Supplémentaire (via relais) |
| Charge serveur | Requêtes initiales uniquement | Relais constant de trafic |
| Coût | Faible (peu de requêtes) | Élevé (trafic serveur) |
| Compatibilité NAT Symétrique | Non | Oui |
| Bande passante | Limitée seulement par le canal P2P | Limitée par le canal serveur |
En pratique, le serveur TURN est utilisé uniquement pour les connexions où le P2P est impossible. Selon Google (statistiques WebRTC, 2023), environ 15 – 20% de toutes les connexions WebRTC nécessitent un relais TURN. Les 80 – 85% restants établissent la connectivité via STUN ou des candidats host locaux. Lors de la conception d’une application, vous devez budgétiser le trafic TURN à 15 – 20% du volume multimédia total si votre public inclut des utilisateurs de réseaux d’entreprise et de régions aux restrictions NAT strictes.
Le serveur TURN consomme des ressources importantes car tout le trafic multimédia passe par lui. Chaque appel actif avec relais TURN utilise la bande passante du serveur égale au débit total du trafic multimédia (flux entrant + sortant). Pour un appel vidéo HD (720p), cela peut représenter 1,5 – 2,5 Mbps par connexion dans chaque direction, soit un total de 3 – 5 Mbps de trafic global via le serveur TURN.
Il existe plusieurs options de déploiement pour l’infrastructure TURN. Les serveurs TURN publics gratuits ne sont pas recommandés pour la production en raison de l’absence de garanties de qualité et de sécurité. Les fournisseurs commerciaux (Twilio Network Traversal Service, Xirsys, Metered) proposent TURN en tant que service avec un prix au gigaoctet — le coût typique est de 0,005 – 0,02 $ par gigaoctet. L’auto-hébergement avec coturn (serveur TURN open-source) nécessite un serveur avec une capacité de bande passante suffisante et une configuration de surveillance.
Lors du choix d’une solution de serveur TURN, tenez compte de la géographie des utilisateurs, du coût du trafic et des exigences de sécurité. Pour les applications avec des milliers d’appels simultanés, le coturn auto-hébergé sur des serveurs avec un canal large (1+ Gbps) peut être plus rentable que les fournisseurs commerciaux. Pour les petits projets avec des dizaines d’utilisateurs, les services TURN commerciaux sont préférables en raison de l’absence de frais d’administration et de surveillance.
Questions fréquentes
Un serveur TURN est un intermédiaire qui relaie les données entre utilisateurs lorsqu’ils ne peuvent pas se connecter directement. Si deux ordinateurs sont derrière des routeurs qui ne permettent pas les connexions directes, le serveur TURN reçoit les données de l’un et les envoie à l’autre.
Un serveur TURN est nécessaire lorsque les deux participants d’un appel WebRTC sont derrière un NAT Symétrique ou des pare-feux d’entreprise bloquant le trafic P2P. Dans ces cas, STUN ne peut pas aider, et le processus ICE bascule automatiquement vers le candidat relay obtenu du serveur TURN.
STUN montre simplement à un ordinateur son adresse externe pour la connexion directe. TURN relaie activement le trafic à travers lui-même. STUN ne crée pas de charge serveur, tandis que TURN consomme de la bande passante. STUN fonctionne uniquement avec certains types de NAT ; TURN fonctionne toujours mais coûte plus cher.
Le coût d’un serveur TURN dépend du fournisseur et du volume de trafic. Twilio facture environ 0,005 – 0,01 $ par Go de trafic relayé par TURN. Xirsys facture à partir de 0,007 $ par Go. L’auto-hébergement de coturn nécessite un serveur avec au moins 100 Mbps de bande passante, dont le coût dépend du fournisseur d’hébergement.
Votre propre serveur TURN peut être configuré en utilisant coturn (open-source). L’installation comprend la configuration des ports, de l’authentification (secret partagé), des certificats TLS et du pare-feu. Le fichier de configuration de base contient les paramètres listening-port, realm, user et fingerprint. Après configuration, le serveur est spécifié dans iceServers de WebRTC avec le préfixe turn: ou turns: pour TLS.
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