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.

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.

Vérifier le serveur relais

Pour vérifier que le serveur relais fonctionne correctement :

  1. Lancez Firefox.
  2. Saisissez about:config dans la barre d'adresse, acceptez et continuez.
  3. Dans la barre de recherche, tapez relay.
  4. Passez media.peerconnection.ice.relay_only à true.
  5. Ouvrez l'application Drovio et connectez-vous.
  6. Utilisez l'icône en forme d'enveloppe et cliquez sur Invite by URL.
  7. Collez le lien d'invitation dans Firefox et poursuivez.
  8. Saisissez un nom d'affichage, sans choisir de lancer l'application, et poursuivez dans le navigateur.
  9. Vous devriez voir votre propre écran, en miroir lorsque vous regardez l'écran partagé.
  10. Ouvrez un nouvel onglet dans Firefox, sans fermer le précédent, et saisissez about:webrtc.
  11. Cliquez sur Show details.
  12. Vous devriez lire ICE State: succeeded, nominated: true, selected: true, et voir relay mentionné à côté de votre adresse IP, plutôt que host, srflx ou prflx.

Remettez le réglage en place

N'oubliez pas de repasser media.peerconnection.ice.relay_only à false.