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:
- Kommentieren Sie
TURNSERVER_ENABLED=1ein und speichern Sie. - Öffnen Sie die Konfigurationsdatei, siehe Coturn konfigurieren weiter unten:
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:
Coturn konfigurieren¶
Ändern Sie turnserver.conf wie folgt.
Listener und Netzwerk:
listening-portundtls-listening-portsollten auf80und443gesetzt 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 mitlistening-ip.external-ip: die öffentliche IP, nur wennlistening-ipeine private Adresse hinter einem NAT ist.min-port=49152undmax-port=65535: der UDP-Portbereich, den coturn für den relayten Verkehr belegt. Öffnen Sie diesen Bereich in Ihrer Firewall für UDP.
Authentifizierung:
fingerprintmuss 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=600muss 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 insettings.confunterwebrtc.service_quality.maximumkonfiguriert ist. Achtung,max-bpswird in Bytes pro Sekunde angegeben,webrtc.service_quality.maximumdagegen 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):
certundpkeymü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 Port80, wenn Sie auf diesen Server verweisen, siehe Drovio Server konfigurieren.- Setzen Sie
cipher-listauf"ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AESCCM". no-tlsv1undno-tlsv1_1müssen einkommentiert sein.
Härtung:
no-multicast-peersmuss einkommentiert sein.allow-loopback-peersmuss auskommentiert bleiben, da Loopback seit coturn 4.5.2 standardmäßig abgelehnt wird.no-tcp-relaymuss 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/16unddenied-peer-ip=127.0.0.0/8: verhindern, dass relayter Verkehr private Netze oder Loopback-Netze erreicht.no-software-attributemuss einkommentiert sein, was die coturn-Version in den Antworten verbirgt.no-rfc5780,no-stun-backward-compatibilityundresponse-origin-only-with-rfc5780mü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=5766undcli-password=myclipassword: ändern Sie das Passwort. Diese Schnittstelle dient dazu, die verbundenen Peers zu prüfen, indem Sietelnet localhost 5766starten, das Passwort und dannpseingeben. Geben Sie diesen Port nicht nach außen frei.
Speichern Sie, und starten Sie coturn neu:
Ihr Relay-Server für TURN, und STUN, ist nun betriebsbereit.
Drovio Server konfigurieren¶
Zurück auf Ihrer Drovio-Server-Instanz:
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¶
- Öffnen Sie das Cloudflare-Dashboard, dann Realtime → TURN.
- 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:
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.
- Öffnen Sie die Drovio App und melden Sie sich an.
- Nutzen Sie das Symbol in Form eines Blitzes, um eine Sofortbesprechung zu starten.
- Kopieren Sie den Einladungslink, fügen Sie ihn in einen Browser ein und hängen
Sie
?ice=relaydaran. - Fahren Sie fort, geben Sie einen Anzeigenamen ein, ohne die App starten zu lassen, und fahren Sie erneut fort.
- 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.