Matrix - Telefonie - Turn

Veröffentlicht von Ulf Joksch am 26.02.2021

Ein Turn-Server für die Matrix

Damit wir mit unserem Matrix-Server nicht nur Textnachrichten und Bilder austauschen, sondern auch telefonieren können, brauchen wir zusätzlich zu unserer Matrix-Synapse noch einen Turn-Server. Was ein Turn-Server im allgemeinen ist, könnt ihr hier nachlesen.

Für den Turnserver reicht eine Minimalausstattung an “Hardware”, respektive virtueller Hardware. Ich nutze hier einen virtuellen KVM-Server mit 1 vCPU, 2GB RAM und einer Plattenkapazität von 20GB. Den bekommt ihr für kleines Geld z.B. bei Hetzner.

Für meinen Turn-Server habe ich eine CentOS 8 Grundinstallation gewählt.

Was also ist zu tun, um den Turnserver für unsere Matrix-Synapse funktional zu machen?

Folgende Voraussetzungen sind gegeben:

  • CentOS 8 Server mit dem DNS-Namen turn.mymatrix.de
  • CentOS 7 Server mit der Matrix-Synapse matrix.mymatrix.de

Installation coturn

dnf install coturn

Damit installieren wir den Turn-Dienst namens coturn.

Als nächstes muss ich den Dienst konfigurieren. Die Konfigurationdate heißt: /etc/coturn/turnserver.conf

vi /etc/coturn/turnserver.conf

Als erstes gebe ich den Port an, auf dem unser Turn-Server lauschen soll. Ich will nur sichere Verbindungen zulassen und gebe hier nur den TLS-Port an:

tls-listening-port=443
alt-tls-listening-port=5349

Mit Listening-IP gebe ich an, unter welcher IP-Adresse der Turnserver erreichbar ist. Hier muss natürlich nicht die 172er-Adresse genommen werden, sondern die tatsächliche IP-Adresse des Servers:

listening-ip=172.17.19.101

Jetzt definiere ich einen Bereich von UDP-Ports, die der Turn-Server verwenden soll. Ich habe hier die Defaultwerte verwendet:

min-port=49152
max-port=65535

Dieser Bereich muss später noch in der Firewall freigeschaltet werden.

Dann stelle ich die zu nutzende Authentifizierungsmethode ein:

use-auth-secret

Als nächstes lege ich die geheime Zeichenkette fest, über die sich der Turnserver und die Matrix-Synapse später identifizieren werden. Eine möglichst komplexe, nicht zu kurze Zeichenkette. Diese muss ich dann später auch in die Konfiguration des Synapse-Servers eintragen.

static-auth-secret=SehrgeheimezufaelligeZeichenkettemitZahlenundso2132435443342!$32

Jetzt gebe ich bekannt, wer mein Gegenüber sein wird, also den DNS-Namen meines Matrix-Synapse-Servers:

realm=matrix.mymatrix.de

Für die TLS-Kommunikation trage ich noch die Zertifikate ein, die ich zuvor über LetsEncrypt erstellt habe:

cert=/etc/letsencrypt/live/turn.mymatrix.de/fullchain.pem
pkey=/etc/letsencrypt/live/turn.mymatrix.de/privkey.pem

Das Command-Line-Interface werde ich hoffentlich nicht benötigen, ebensowenig die STUN-Funktionalität. Deswegen schalte ich es ab:

no-cli
no-stun

Die benötigten Ports in der Firewall noch aufmachen:

firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=5349/tcp
firewall-cmd --permanent --add-port=5349/udp
firewall-cmd --permanent --add-port=49152-65535/udp
firewall-cmd --reload

Coturn vs. LetsEncrypt

Der Coturn-Service ist IMHO nicht ganz sauber implementiert und hat deswegen Probleme damit, das LetsEncrypt-Zertifikat und den LetsEncrypt-Key einzulesen. LetsEncrypt erlaubt nur root auf diese Dateien zuzugreifen.

Bin ich es bisher so gewohnt, dass ein Dienst mit root-Rechten startet und nach der Initialisierung auf einen anderen, niedrig privilegierten User umswitcht, so startet Coturn gleich als user coturn mit der Gruppe coturn.

Dies hat zur Folge, dass Coturn die LetsEncrypt-Dateien nicht einlesen kann und somit die Verschlüsselung nicht initialisieren kann.

Ich habe es recht “dirty” gelöst, indem ich der Gruppe coturn Zugriff auf die notwendigen Verzeichnisse “/etc/letsencrypt/archive“ und “/etc/letsencrypt/live“ sowie auch auf den private Key gegeben habe. Nicht schön, aber für den Moment funktional.

Ich hoffe, dass die Coturn-Entwickler dies zukünftig ändern werden.

Anpassungen am Matrix-Synapse-Server

Jetzt kommen die Anpassungen, die ich an der Konfigurationsdatei unseres Matrix-Homeservers vornehmen muss. Hierzu verbinde ich mich per SSH auf unseren matrix.mymatrix.de und wechsle dort in das Verzeichnis des Synapse-Servers:

ssh root@matrix.mymatrix.de
cd /opt/synapse

Die Änderungen müssen in der Datei homeserver.yaml gemacht werden.

vi homserver.yaml
## TURN ##
turn_uris: ["turn:turn.mymatrix.de:443?transport=udp", "turn:turn.mymatrix.de:443?transport=tcp"]
turn_shared_secret: "SehrgeheimezufaelligeZeichenkettemitZahlenundso2132435443342!$32"
turn_user_lifetime: 1h
turn_allow_guests: true

Danach starte ich den Synapse-Server neu:

source /opt/synapse/env/bin/activate
synctl restart

Anschliessend gehe ich wieder auf unseren neuen Turn-Server und starte dort den coturn-Dienst:

systemctl start coturn