Zum Inhalt

Relay-Server (TURN)

Rein Peer-to-Peer aufgebaute Verbindungen lassen sich manchmal nicht herstellen, wegen Firewalls oder NAT bei einem der Benutzer oder bei allen. Um dem abzuhelfen und auch die widerspenstigsten Firewalls zu durchqueren, können ein oder mehrere TURN-Server (Traversal Using Relay NAT) eingesetzt werden.

Drovio Server unterstützt zwei Wege, Relays bereitzustellen, die Sie über webrtc.turn_provider.type in settings.conf auswählen:

type Relays Zugangsdaten
shared_secret (Standard) Ihre eigenen coturn-Server Lokal aus einem gemeinsamen Geheimnis berechnet
cloudflare Cloudflare Realtime TURN Bei der Cloudflare-API angefragt

Einen eigenen coturn zu betreiben hält jedes weitergeleitete Paket auf der Infrastruktur, die Sie beherrschen, und lässt Ihnen die Wahl der geöffneten Ports und Protokolle. Cloudflare erspart Ihnen die Maschine, die zu installieren, zu aktualisieren und zu überwachen wäre. Beide Wege sind unten beschrieben.

Bestehende Installationen

shared_secret ist der Standardwert: eine Installation, die turn_provider überhaupt nicht deklariert, verhält sich weiterhin genau wie bisher.

Einen eigenen coturn betreiben

Wir verwenden coturn (github.com/coturn/coturn) für unsere TURN-Server, wie die meisten Anbieter, darunter Slack und Zoom. Coturn dient zugleich als STUN-Server, der die Frage "Wie lautet meine öffentliche IP-Adresse?" beantwortet.

Dedizierte Maschine

Wir raten davon ab, einen TURN-Server auf derselben Maschine bereitzustellen, auf der bereits Drovio Server läuft, aus Sicherheits- und Leistungsgründen.

Unter Debian installieren

Coturn ist für Debian paketiert, wobei Version 13 eine nahezu aktuelle Fassung mitbringt, und läuft sowohl unter x64 als auch unter arm64; die folgenden Befehle sind auf beiden identisch. Schritt für Schritt, auf einer frisch installierten Debian-13-Maschine:

sudo apt update
sudo apt install coturn
sudo nano /etc/default/coturn
  • Kommentieren Sie TURNSERVER_ENABLED=1 ein und speichern Sie.
  • Öffnen Sie die Konfigurationsdatei, siehe Coturn konfigurieren weiter unten:
sudo nano /etc/turnserver.conf

Unter RHEL installieren

Coturn steht unter RHEL 9 und 10 über EPEL zur Verfügung. Schritt für Schritt:

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

Der erste Befehl aktiviert EPEL, hier in der Fassung für RHEL 9: passen Sie die URL an Ihre Version an.

Öffnen Sie anschließend die Konfigurationsdatei, siehe Coturn konfigurieren weiter unten:

sudo nano /etc/coturn/turnserver.conf

Coturn konfigurieren

Ändern Sie turnserver.conf wie folgt.

Listener und Netzwerk:

  • listening-port und tls-listening-port sollten auf 80 und 443 gesetzt werden statt auf die Standardports, um die meisten Firewalls zu durchqueren.
  • listening-ip: die öffentliche IP, oder die private IP, wenn Sie hinter einem NAT stehen, etwa auf AWS EC2.
  • relay-ip: identisch mit listening-ip.
  • external-ip: die öffentliche IP, nur wenn listening-ip eine private Adresse hinter einem NAT ist.
  • min-port=49152 und max-port=65535: der UDP-Portbereich, den coturn für den relayten Verkehr belegt. Öffnen Sie diesen Bereich in Ihrer Firewall für UDP.

Authentifizierung:

  • fingerprint muss einkommentiert sein.
  • static-auth-secret=MySeCrEt: ersetzen Sie den Wert durch eine lange Zufallszeichenkette. Das ist das gemeinsame Geheimnis zwischen Drovio Server und coturn.
  • realm=turn.example.com: zu ersetzen; dieser Wert muss auf nichts auflösen.
  • stale-nonce=600 muss einkommentiert sein.

Bandbreite:

  • max-bps: maximale Anzahl Bytes pro Sekunde und Sitzung. Kommentieren Sie die Zeile aus, um sie nicht zu begrenzen, oder setzen Sie sie mindestens auf die maximale Bitrate, die in settings.conf unter webrtc.service_quality.maximum konfiguriert ist. Achtung, max-bps wird in Bytes pro Sekunde angegeben, webrtc.service_quality.maximum dagegen in kbit pro Sekunde: der Standardwert von 10 Mbps entspricht 1 250 000 Bytes pro Sekunde.

TLS (optional, für die Unterstützung von TURNS):

  • cert und pkey müssen auf Ihr Zertifikat und Ihren privaten Schlüssel verweisen. Wenn Sie TURNS nicht benötigen, überspringen Sie diesen Teil und verwenden Sie nur den Port 80, wenn Sie auf diesen Server verweisen, siehe Drovio Server konfigurieren.
  • Setzen Sie cipher-list auf "ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AESCCM".
  • no-tlsv1 und no-tlsv1_1 müssen einkommentiert sein.

Härtung:

  • no-multicast-peers muss einkommentiert sein. allow-loopback-peers muss auskommentiert bleiben, da Loopback seit coturn 4.5.2 standardmäßig abgelehnt wird.
  • no-tcp-relay muss einkommentiert sein: Drovio nutzt ausschließlich das UDP-Relay, und das TCP-Relay abzuschalten verkleinert die Angriffsfläche.
  • 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 und denied-peer-ip=127.0.0.0/8: verhindern, dass relayter Verkehr private Netze oder Loopback-Netze erreicht.
  • no-software-attribute muss einkommentiert sein, was die coturn-Version in den Antworten verbirgt.
  • no-rfc5780, no-stun-backward-compatibility und response-origin-only-with-rfc5780 müssen einkommentiert sein. Sie schalten hier überflüssige, historisch bedingte STUN-Funktionen ab und verringern die Exposition.

Sie werden diesen Server vermutlich auch in seinem eigenen Netz oder VPC isolieren wollen.

Kommandozeilenschnittstelle:

  • cli-ip=127.0.0.1, cli-port=5766 und cli-password=myclipassword: ändern Sie das Passwort. Diese Schnittstelle dient dazu, die verbundenen Peers zu prüfen, indem Sie telnet localhost 5766 starten, das Passwort und dann ps eingeben. Geben Sie diesen Port nicht nach außen frei.

Speichern Sie, und starten Sie coturn neu:

sudo systemctl restart coturn

Ihr Relay-Server für TURN, und STUN, ist nun betriebsbereit.

Drovio Server konfigurieren

Zurück auf Ihrer Drovio-Server-Instanz:

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

Suchen Sie webrtc, ersetzen Sie turn_servers_secret durch den oben festgelegten Wert von static-auth-secret und passen Sie die folgende Konfiguration an Ihre Bedürfnisse an, wobei Sie die URL turn.example.com durch die URL oder die IP Ihrer coturn-Maschine ersetzen:

"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
  }
}
  • Der erste Eintrag ist das STUN, das nur auf die Frage "Wie lautet meine IP-Adresse?" antwortet.
  • Der zweite ist das klassische TURN über UDP auf 443, ohne TLS-Schicht.
  • Der dritte ist das TURN über TCP auf 443, ohne TLS-Schicht.
  • Der vierte ist das TURNS über UDP auf 443, mit zusätzlicher TLS-Schicht.

Das sollte mit den meisten widerspenstigen Firewalls funktionieren. Der Abschnitt webrtc wird im laufenden Betrieb übernommen, es ist also nichts neu zu starten: die neuen Relays werden innerhalb weniger Sekunden berücksichtigt.

Cloudflare Realtime TURN verwenden

Cloudflare Realtime TURN ist ein verwalteter Relay-Dienst: es gibt keine Maschine zu installieren, zu aktualisieren oder zu überwachen und jeder Teilnehmer wird vom nächstgelegenen Cloudflare-Standort bedient. Cloudflare stellt den relayten Verkehr in Rechnung, die aktuellen Preise finden Sie auf der zugehörigen Seite.

Einen TURN-Schlüssel anlegen

  1. Öffnen Sie das Cloudflare-Dashboard, dann Realtime → TURN.
  2. Legen Sie einen TURN-Schlüssel an und notieren Sie seine Key ID sowie sein API token. Das Token wird nur einmal angezeigt.

Drovio Server auf Cloudflare ausrichten

Auf Ihrer Drovio-Server-Instanz:

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

Suchen Sie webrtc, setzen Sie turn_provider auf cloudflare und tragen Sie die Relays von Cloudflare in ice_servers ein:

"webrtc": {
  "turn_provider": {
    "type": "cloudflare",
    "cloudflare": {
      "key_id": "<Ihre key id>",
      "api_token": "<Ihr 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 und turn_servers_auth_timeout werden ignoriert, solange type den Wert cloudflare hat. Lassen Sie sie stehen: type wieder auf shared_secret zu setzen stellt Ihre coturn-Installation ohne jede weitere Änderung wieder her.

Wie der übrige webrtc-Abschnitt wird dies im laufenden Betrieb übernommen und Sie müssen Drovio Server nicht neu starten.

Lebensdauer der Zugangsdaten

ttl ist die Dauer in Sekunden, über die ein an einen Client übermittelter Zugangsdatensatz gültig bleibt.

  • Cloudflare lehnt Zugangsdaten ab, die länger als 48 Stunden leben. Höhere Werte werden auf diese Obergrenze gesetzt.
  • Drovio Server erneuert seinen Zugangsdatensatz nach der Hälfte dieser Dauer.
  • Ein Client fragt einen Zugangsdatensatz nur einmal ab, beim Aufbau einer Verbindung, und danach nie wieder. Ein ttl, das kürzer ist als Ihre längste Besprechung, trennt das Relay mitten in der Sitzung. Behalten Sie den Standardwert, sofern nichts dagegen spricht.

Lässt sich Cloudflare während der Erneuerung nicht erreichen, bedient Drovio Server weiterhin den Zugangsdatensatz, den er bereits hält, bis dieser wirklich abläuft, und protokolliert den Fehlschlag.

Reichweite durch Firewalls

Cloudflare antwortet in UDP nur auf Port 3478. Sein Port 443 ist ausschließlich TCP, unter einer TLS-Schicht (turns:). Ein Teilnehmer hinter einer Firewall, die nach außen nichts anderes als 443 erlaubt, fällt daher auf ein TCP-Relay zurück. Das erhöht die Latenz und verträgt Paketverluste schlechter als UDP.

Wenn Sie eine restriktive Firewall haben, die nur Port 443 erlaubt, und die Leistung zählt, möchten Sie vielleicht Ihren eigenen coturn-Server mit Port 443 über UDP betreiben.

Den Relay-Server überprüfen

ice=relay an die Abfragezeichenfolge einer Web-Client-URL anzuhängen erzwingt, dass alle Verbindungen dieser Sitzung über ein Relay laufen, in jedem Browser.

  1. Öffnen Sie die Drovio App und melden Sie sich an.
  2. Nutzen Sie das Symbol in Form eines Blitzes, um eine Sofortbesprechung zu starten.
  3. Kopieren Sie den Einladungslink, fügen Sie ihn in einen Browser ein und hängen Sie ?ice=relay daran.
  4. Fahren Sie fort, geben Sie einen Anzeigenamen ein, ohne die App starten zu lassen, und fahren Sie erneut fort.
  5. Sie sollten Ihren eigenen Bildschirm sehen, spiegelbildlich, wenn Sie den geteilten Bildschirm betrachten.

Wenn Sie nur eine Ladeanzeige erhalten, ist das Relay nicht erreichbar oder seine Zugangsdaten werden abgelehnt. Die Browser-Konsole zeigt zudem eine Warnung, The url forces every connection through the TURN server, die bestätigt, dass der Parameter übernommen wurde.