Aller au contenu

Serveur relais (TURN)

Les connexions purement pair à pair ne peuvent parfois pas s'établir, à cause de pare-feux ou de NAT chez l'un des utilisateurs ou chez tous. Pour y remédier et franchir les pare-feux les plus récalcitrants, un ou plusieurs serveurs TURN (Traversal Using Relay NAT) peuvent être mis en place.

Drovio Server prend en charge deux façons de fournir des relais, que vous choisissez avec webrtc.turn_provider.type dans settings.conf :

type Relais Identifiants
shared_secret (par défaut) Vos propres serveurs coturn Calculés localement à partir d'un secret partagé
cloudflare Cloudflare Realtime TURN Demandés à l'API Cloudflare

Héberger votre propre coturn garde chaque paquet relayé sur l'infrastructure que vous maîtrisez et vous laisse choisir les ports et les protocoles ouverts. Cloudflare supprime la machine à installer, à mettre à jour et à surveiller. Les deux approches sont décrites ci-dessous.

Déploiements existants

shared_secret est la valeur par défaut : un déploiement qui ne déclare pas turn_provider du tout continue de se comporter exactement comme avant.

Héberger votre propre coturn

Nous utilisons coturn (github.com/coturn/coturn) pour nos serveurs TURN, comme la plupart des éditeurs, dont Slack et Zoom. Coturn fait également office de serveur STUN, chargé de répondre à la question « quelle est mon adresse IP publique ».

Machine dédiée

Nous déconseillons de déployer un serveur TURN sur la machine qui héberge déjà Drovio Server, pour des raisons de sécurité et de performance.

Installer sous Debian

Coturn est packagé pour Debian, la version 13 embarquant une version quasiment à jour, et fonctionne aussi bien en x64 qu'en arm64, les commandes ci-dessous étant identiques sur les deux. Étape par étape, sur une machine Debian 13 fraîchement installée :

sudo apt update
sudo apt install coturn
sudo nano /etc/default/coturn
  • Décommentez TURNSERVER_ENABLED=1 et enregistrez.
  • Ouvrez le fichier de configuration, voir Configurer coturn ci-dessous :
sudo nano /etc/turnserver.conf

Installer sous RHEL

Coturn est disponible par EPEL sous RHEL 9 et 10. Étape par étape :

sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
sudo dnf install coturn

La première commande active EPEL, ici dans sa version pour RHEL 9 : adaptez l'URL à votre version.

Ouvrez ensuite le fichier de configuration, voir Configurer coturn ci-dessous :

sudo nano /etc/coturn/turnserver.conf

Configurer coturn

Modifiez turnserver.conf comme suit.

Écoute et réseau :

  • listening-port et tls-listening-port doivent valoir 80 et 443 plutôt que les ports par défaut, afin de franchir la plupart des pare-feux.
  • listening-ip : l'IP publique, ou l'IP privée si vous êtes derrière un NAT, par exemple sur AWS EC2.
  • relay-ip : identique à listening-ip.
  • external-ip : l'IP publique, uniquement lorsque listening-ip est une adresse privée derrière un NAT.
  • min-port=49152 et max-port=65535 : la plage de ports UDP que coturn alloue au trafic relayé. Ouvrez cette plage en UDP dans votre pare-feu.

Authentification :

  • fingerprint doit être décommenté.
  • static-auth-secret=MySeCrEt : remplacez par une longue chaîne aléatoire. C'est le secret partagé entre Drovio Server et coturn.
  • realm=turn.example.com : à remplacer ; cette valeur n'a pas besoin de résoudre vers quoi que ce soit.
  • stale-nonce=600 doit être décommenté.

Bande passante :

  • max-bps : nombre maximal d'octets par seconde et par session. Commentez la ligne pour ne pas la limiter, ou fixez-la au moins au débit maximal configuré dans settings.conf, sous webrtc.service_quality.maximum. Attention, max-bps s'exprime en octets par seconde tandis que webrtc.service_quality.maximum s'exprime en kbits par seconde : la valeur par défaut de 10 Mbps correspond à 1 250 000 octets par seconde.

TLS (facultatif, pour la prise en charge de TURNS) :

  • cert et pkey doivent désigner votre certificat et votre clé privée. Si vous n'avez pas besoin de TURNS, sautez cette partie et n'utilisez que le port 80 en désignant ce serveur, voir Configurer Drovio Server.
  • Renseignez cipher-list avec "ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AESCCM".
  • no-tlsv1 et no-tlsv1_1 doivent être décommentés.

Durcissement :

  • no-multicast-peers doit être décommenté. allow-loopback-peers doit rester commenté, le bouclage étant refusé par défaut depuis coturn 4.5.2.
  • no-tcp-relay doit être décommenté : Drovio n'utilise que le relais UDP, et désactiver le relais TCP réduit la surface d'attaque.
  • denied-peer-ip=0.0.0.0/8, denied-peer-ip=10.0.0.0/8, denied-peer-ip=172.16.0.0/12, denied-peer-ip=192.168.0.0/16 et denied-peer-ip=127.0.0.0/8 : empêchent le trafic relayé d'atteindre les réseaux privés ou de bouclage.
  • no-software-attribute doit être décommenté, ce qui masque la version de coturn dans les réponses.
  • no-rfc5780, no-stun-backward-compatibility et response-origin-only-with-rfc5780 doivent être décommentés. Ils désactivent des fonctions STUN héritées, inutiles ici, et réduisent l'exposition.

Vous voudrez sans doute aussi isoler ce serveur dans son propre réseau ou VPC.

Interface en ligne de commande :

  • cli-ip=127.0.0.1, cli-port=5766 et cli-password=myclipassword : changez le mot de passe. Cette interface sert à vérifier les pairs connectés, en lançant telnet localhost 5766, en saisissant le mot de passe puis ps. N'exposez pas ce port vers l'extérieur.

Enregistrez, puis redémarrez coturn :

sudo systemctl restart coturn

Votre serveur relais TURN, et STUN, est désormais opérationnel.

Configurer Drovio Server

De retour sur votre instance Drovio Server :

sudo nano /etc/drovio-server/settings.conf

Repérez webrtc, remplacez turn_servers_secret par la valeur de static-auth-secret définie plus haut et adaptez la configuration ci-dessous à vos besoins, en veillant à remplacer l'URL turn.example.com par celle ou l'IP de votre machine coturn :

"webrtc": {
  "turn_servers_secret": "MySeCrEt",
  "turn_servers_auth_timeout": 300,
  "ice_servers": [
    { "url": "stun:turn.example.com:443" },
    { "url": "turn:turn.example.com:443" },
    { "url": "turn:turn.example.com:443?transport=tcp" },
    { "url": "turns:turn.example.com:443" }
  ],
  "service_quality": {
    "minimum": 1000,
    "maximum": 10000
  }
}
  • La première entrée est le STUN, qui ne répond qu'aux demandes « quelle est mon adresse IP ».
  • La deuxième est le TURN classique en UDP sur 443, sans couche TLS.
  • La troisième est le TURN en TCP sur 443, sans couche TLS.
  • La quatrième est le TURNS en UDP sur 443, avec une couche TLS supplémentaire.

Cela devrait fonctionner avec la plupart des pare-feux récalcitrants. La section webrtc s'applique à chaud, il n'y a donc rien à redémarrer : les nouveaux relais sont pris en compte en quelques secondes.

Utiliser Cloudflare Realtime TURN

Cloudflare Realtime TURN est un service de relais managé : il n'y a aucune machine à installer, à mettre à jour ou à surveiller et chaque participant est servi par le site Cloudflare le plus proche de lui. Cloudflare facture le trafic relayé, reportez-vous à sa page de tarifs pour les montants en vigueur.

Créer une clé TURN

  1. Ouvrez le tableau de bord Cloudflare, puis Realtime → TURN.
  2. Créez une clé TURN et relevez son Key ID ainsi que son API token. Le jeton n'est affiché qu'une fois.

Diriger Drovio Server vers Cloudflare

Sur votre instance Drovio Server :

sudo nano /etc/drovio-server/settings.conf

Repérez webrtc, passez turn_provider à cloudflare et renseignez les relais de Cloudflare dans ice_servers :

"webrtc": {
  "turn_provider": {
    "type": "cloudflare",
    "cloudflare": {
      "key_id": "<votre key id>",
      "api_token": "<votre api token>",
      "ttl": 86400
    }
  },
  "ice_servers": [
    { "url": "stun:stun.cloudflare.com:3478" },
    { "url": "turn:turn.cloudflare.com:3478?transport=udp" },
    { "url": "turn:turn.cloudflare.com:3478?transport=tcp" },
    { "url": "turns:turn.cloudflare.com:443?transport=tcp" }
  ],
  "service_quality": {
    "minimum": 1000,
    "maximum": 10000
  }
}

turn_servers_secret et turn_servers_auth_timeout sont ignorés tant que type vaut cloudflare. Laissez-les en place : repasser type à shared_secret rétablit votre installation coturn sans aucune autre modification.

Comme le reste de la section webrtc, cela s'applique à chaud et vous n'avez pas à redémarrer Drovio Server.

Durée de vie des identifiants

ttl est la durée, en secondes, pendant laquelle un identifiant transmis à un client reste valide.

  • Cloudflare refuse les identifiants vivant plus de 48 heures. Les valeurs supérieures sont ramenées à ce plafond.
  • Drovio Server renouvelle son identifiant à mi-parcours de cette durée.
  • Un client demande un identifiant une seule fois, à l'ouverture d'une connexion, et jamais ensuite. Un ttl plus court que votre plus longue réunion coupe le relais en cours de session. Conservez la valeur par défaut sauf raison contraire.

Si Cloudflare ne peut pas être joint pendant le renouvellement, Drovio Server continue de servir l'identifiant qu'il détient jusqu'à sa véritable expiration et journalise l'échec.

Portée face aux pare-feux

Cloudflare ne répond en UDP que sur le port 3478. Son port 443 est uniquement en TCP, sous une couche TLS (turns:). Un participant derrière un pare-feu qui n'autorise rien d'autre que le 443 en sortie retombe donc sur un relais TCP. Cela ajoute de la latence et supporte moins bien la perte de paquets que l'UDP.

Si vous avez un pare-feu restrictif qui n'autorise que le port 443 et que la performance compte, vous voudrez peut-être héberger votre propre serveur coturn avec le port 443 en UDP.

Vérifier le serveur relais

Ajouter ice=relay à la chaîne de requête d'une URL du client web force toutes les connexions de cette session à passer par un relais, dans n'importe quel navigateur.

  1. Ouvrez l'application Drovio et connectez-vous.
  2. Utilisez l'icône en forme d'éclair pour démarrer une réunion instantanée.
  3. Copiez puis collez le lien d'invitation dans un navigateur et ajoutez-y ?ice=relay.
  4. Poursuivez, saisissez un nom d'affichage, sans choisir de lancer l'application, et poursuivez à nouveau.
  5. Vous devriez voir votre propre écran, en miroir lorsque vous regardez l'écran partagé.

Si vous n'obtenez qu'un indicateur de chargement, le relais est inaccessible ou ses identifiants sont refusés. La console du navigateur affiche également un avertissement, The url forces every connection through the TURN server, qui confirme que le paramètre a bien été pris en compte.