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.

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.

Den Relay-Server überprüfen

So prüfen Sie, ob der Relay-Server korrekt funktioniert:

  1. Starten Sie Firefox.
  2. Geben Sie about:config in die Adressleiste ein, bestätigen Sie und fahren Sie fort.
  3. Tippen Sie relay in die Suchleiste.
  4. Setzen Sie media.peerconnection.ice.relay_only auf true.
  5. Öffnen Sie die Drovio App und melden Sie sich an.
  6. Nutzen Sie das Symbol in Form eines Briefumschlags und klicken Sie auf Invite by URL.
  7. Fügen Sie den Einladungslink in Firefox ein und fahren Sie fort.
  8. Geben Sie einen Anzeigenamen ein, ohne die App starten zu lassen, und fahren Sie im Browser fort.
  9. Sie sollten Ihren eigenen Bildschirm sehen, spiegelbildlich, wenn Sie den geteilten Bildschirm betrachten.
  10. Öffnen Sie einen neuen Tab in Firefox, ohne den vorherigen zu schließen, und geben Sie about:webrtc ein.
  11. Klicken Sie auf Show details.
  12. Sie sollten ICE State: succeeded, nominated: true, selected: true lesen und relay neben Ihrer IP-Adresse sehen, statt host, srflx oder prflx.

Setzen Sie die Einstellung zurück

Vergessen Sie nicht, media.peerconnection.ice.relay_only wieder auf false zu setzen.