Vermittlungsserver: coturn mit Zugangsdaten, die verfallen

Damit Anrufe auch in Netzen zustande kommen, die keine direkte
Verbindung zulassen (15-25 % der Faelle). coturn ist installiert,
steht aber still, bis die Konfiguration liegt -- ein coturn mit
Werkseinstellung ist ein offenes Relais.

KEIN FESTES PASSWORT. Es laege dauerhaft im Browser jedes
Team-Mitglieds und liesse sich nie entziehen. Der Server rechnet
stattdessen bei jeder Abfrage Zugangsdaten, die nach zwoelf Stunden
verfallen (server/workspace-turn.js, coturns `use-auth-secret`). Das
Geheimnis liegt in einer Datei, nicht in der Datenbank: einstellung-
Setzen() schreibt Werte ins Protokoll, und coturn braucht denselben
Wert ohnehin in /etc.

Die Oberflaeche frischt die Daten vor jedem Anruf auf. Der Chat ist
eine App, die tagelang offen bleibt -- wer nur beim Laden holt,
telefoniert am zweiten Tag ohne Vermittlung, und es faellt nicht auf:
Es scheitern nur die, die sie gebraucht haetten.

DIE WICHTIGSTE ZEILE DER KONFIGURATION ist die Sperrliste. Gemessen:
dreizehn Dienste lauschen auf diesem Server nur oertlich, darunter
Caddys Verwaltung auf 127.0.0.1:2019 -- wer sie erreicht, kann jede
Website umleiten. Ohne Sperrliste waere der Vermittlungsserver die
Tuer dorthin, und die Anfrage saehe fuer Caddy aus wie von localhost.

Geprueft: pruef-anruf.mjs 51 -> 73 Pruefungen. Gegenprobe (Geheimnis
als Passwort ausliefern + fremde Zugangsdaten ueberschreiben) macht
genau 5 rot, darunter "das Geheimnis steht NIRGENDS in der Antwort".

tools/turn-probelauf.sh beweist am echten coturn, was ein fester
Vergleichswert nicht kann: dass coturn unsere Rechnung akzeptiert.
Beide Seiten koennten sonst konsequent falsch rechnen und jede
Pruefung waere gruen. Seine eigene Gegenprobe war zweimal zu Recht
rot -- der erste Aufbau mass wegen `-y` gar nicht das Ziel, das er zu
messen behauptete, sondern coturns eingebauten Loopback-Schutz.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-18 15:22:14 +02:00
co-authored by Claude Opus 5
parent 5bbf1f2019
commit 775c4b4207
40 changed files with 1348 additions and 413 deletions
+27 -1
View File
@@ -72,6 +72,7 @@ import {
istDogFather,
} from "./workspace.js";
import { chatEreignis, istDrinFuerAnruf, teilnehmerFuerAnruf } from "./workspace-chat.js";
import { mitZugangsdaten } from "./workspace-turn.js";
export const anrufRouter = express.Router();
@@ -161,13 +162,38 @@ anrufRouter.get("/workspace/api/anruf/adressen", (req, res) => {
try {
let liste = [];
try { liste = JSON.parse(einstellung("anruf_adressen") || "[]"); } catch { liste = []; }
/* ZUGANGSDATEN WERDEN GERECHNET, NICHT GESPEICHERT.
Warum das so ist, steht ausfuehrlich in workspace-turn.js. Kurz:
Ein festes TURN-Passwort laege dauerhaft im Browser jedes
Teilnehmers und liesse sich nie wieder entziehen. Die hier
erzeugten verfallen von selbst.
Als Kennung die PERSONENNUMMER, nicht der Name -- sie landet im
Protokoll von coturn, und das ist kein Ort fuer Klarnamen. */
const { adressen, turn_gesamt, turn_bereit, grund } =
mitZugangsdaten(liste, `w${req.person.id}`);
if (grund) {
/* DER DRITTE AUSGANG. „Kann nicht nachsehen" ist etwas anderes
als „ist nicht eingerichtet" -- und wer das verschweigt, sucht
den Fehler spaeter beim Anrufer. */
console.warn(`[anruf] TURN-Geheimnis nicht verwendbar: ${grund}`);
}
res.json({
adressen: Array.isArray(liste) ? liste : [],
adressen,
gruppe_max: GRUPPE_MAX,
/* WAS DIE OBERFLAECHE WISSEN MUSS, um ehrlich zu sein: Ohne
Adressen klappt der Anruf nur im selben Netz. Das gehoert
DAVOR gesagt, nicht als Fehlermeldung danach. */
nur_gleiches_netz: !Array.isArray(liste) || liste.length === 0,
/* Zahlen statt Ja/Nein: Wer zaehlen kann, kann pruefen. Ein
eingetragener TURN-Server, der mangels Geheimnis niemanden
durchlaesst, sieht sonst genauso aus wie ein funktionierender. */
turn_gesamt,
turn_bereit,
...(grund ? { turn_grund: grund } : {}),
});
} catch (f) {
console.error("[anruf] Adressen:", f?.message);