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 :
- Décommentez
TURNSERVER_ENABLED=1et enregistrez. - Ouvrez le fichier de configuration, voir Configurer coturn ci-dessous :
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 :
Configurer coturn¶
Modifiez turnserver.conf comme suit.
Écoute et réseau :
listening-portettls-listening-portdoivent valoir80et443plutô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 lorsquelistening-ipest une adresse privée derrière un NAT.min-port=49152etmax-port=65535: la plage de ports UDP que coturn alloue au trafic relayé. Ouvrez cette plage en UDP dans votre pare-feu.
Authentification :
fingerprintdoit ê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=600doit ê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é danssettings.conf, souswebrtc.service_quality.maximum. Attention,max-bpss'exprime en octets par seconde tandis quewebrtc.service_quality.maximums'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) :
certetpkeydoivent 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 port80en désignant ce serveur, voir Configurer Drovio Server.- Renseignez
cipher-listavec"ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AESCCM". no-tlsv1etno-tlsv1_1doivent être décommentés.
Durcissement :
no-multicast-peersdoit être décommenté.allow-loopback-peersdoit rester commenté, le bouclage étant refusé par défaut depuis coturn 4.5.2.no-tcp-relaydoit ê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/16etdenied-peer-ip=127.0.0.0/8: empêchent le trafic relayé d'atteindre les réseaux privés ou de bouclage.no-software-attributedoit être décommenté, ce qui masque la version de coturn dans les réponses.no-rfc5780,no-stun-backward-compatibilityetresponse-origin-only-with-rfc5780doivent ê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=5766etcli-password=myclipassword: changez le mot de passe. Cette interface sert à vérifier les pairs connectés, en lançanttelnet localhost 5766, en saisissant le mot de passe puisps. N'exposez pas ce port vers l'extérieur.
Enregistrez, puis redémarrez coturn :
Votre serveur relais TURN, et STUN, est désormais opérationnel.
Configurer Drovio Server¶
De retour sur votre instance Drovio Server :
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¶
- Ouvrez le tableau de bord Cloudflare, puis Realtime → TURN.
- 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 :
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
ttlplus 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.
- Ouvrez l'application Drovio et connectez-vous.
- Utilisez l'icône en forme d'éclair pour démarrer une réunion instantanée.
- Copiez puis collez le lien d'invitation dans un navigateur et ajoutez-y
?ice=relay. - Poursuivez, saisissez un nom d'affichage, sans choisir de lancer l'application, et poursuivez à nouveau.
- 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.