Nextcloud Talk – Einrichtung eines TURN Server

 In Cloud

Ich verfolge die Entwicklung von Nextcloud seit Anbeginn mit großem Interesse. Dazu kommt, dass Bereitstellungen von Private Cloud Lösungen in Unternehmen immer beliebter werden. In diesem Beitrag werde ich die Installation eines sicheren TURN Server auf Basis von CentOS und CoTurn für Nextcloud Talk näher erläutern. CoTurn kann selbstverständlich auch für andere Produkte als STUN oder TURN Server dienen.

Die App Nextcloud Talk ist eine Erweiterung für Nextcloud und ermöglicht die Bereitstellung eines eigens gehosteten Audio-Video-Chat Kommunikationssystems. Hiermit lassen sich sehr einfach Webmeetings realisieren und Bildschirminhalte teilen. Eine Zusammenarbeit in Teams ist auf diese Weise effizient möglich.

Allerdings sind teilnehmende Geräte überwiegend durch Firewalls und NAT (Network Address Translation) geschützt. Aufgrund dieser Gegebenheiten sind für Audio- und Video-Konferenzen mit Nextcloud Talk ein oder mehrere TURN Server erforderlich. Ein STUN Server, welcher lediglich die Verbindung zwischen Client und Server aushandelt, stellt hier Nextcloud bereits kostenfrei zur Verfügung.

Als TURN Server empfehle ich eigenständige Cloud-Server, welche direkt im Internet verfügbar sind und geringe Latenzzeiten zu den in den Meetings beteiligten Geräten besitzen. Insbesondere bei Audio- und Video-Übertragungen sind niedrige Latenzzeiten und eine stabile Bandbreite von Bedeutung. Auf diesen Servern entsteht dazu ein hoher Traffic.

Folgende Voraussetzungen sind zu erfüllen

  • Eine minimale Installation von CentOS.
  • Ein Zertifikat, sollte eine Verschlüsselung der Daten erforderlich sein. Ich verwende gerne Let’s Encrypt Zertifikate. Die Einrichtung von Let’s Encrypt ist nicht Bestandteil in diesem Beitrag.
  • Eine öffentliche IP Adresse. Wird derselbe Server auch als STUN Server eingerichtet, sind zwei öffentliche IP Adressen erforderlich.
  • SELinux sowie Firewall sind standardmäßig aktiv und ich empfehle bei Systemen im produktiven Einsatz immer damit zu arbeiten.

 

Erforderliche Pakete für CoTurn unter CentOS

yum -y install openssl-devel libevent-devel mariadb-devel sqlite sqlite-devel
yum -y install epel-release
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Das Kompilieren und die Installation von CoTurn

Für CoTurn gibt es offiziell unter CentOS keine fertigen Pakete. Eine Installation lässt sich aber mit folgenden Befehlen rasch durchführen.

yum -y groupinstall 'Development Tools'
cd /tmp
wget http://turnserver.open-sys.org/downloads/v4.5.0.8/turnserver-4.5.0.8.tar.gz
tar -xzvf turnserver-*
cd turnserver-*
./configure
make && make install

Die Konfiguration von CoTurn

Zu Beginn wird die Standard-Konfiguration kopiert und ein Passwort für den static-auth-secret Eintrag generiert. Dieses Passwort wird später für die Konfiguration des TURN Server in Nextcloud Talk benötigt und muss ebenfalls in der turnserver.conf eingetragen werden.

cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf
openssl rand -hex 32
cd460f5921176138b5bbac38b26f36e771c43effb35931d85c200cadc12dc8a2

Mit einem Lieblings-Editor erfolgen nun untenstehende Anpassungen in der /usr/local/etc/turnserver.conf

Die Zeile listening-port und tls-listening-port gibt an, auf welchem Port der TURN Server läuft. Da dies ein eigenständiger Server ist und auch keine weiteren Dienste laufen, nutze ich für beide Listening-Ports den Port 443. CoTurn erkennt hierbei automatisch ob die Pakete unverschlüsselt oder verschlüsselt ankommen. Das Risiko das der Port 443 (HTTPS) ausgehend durch eine Firewall beim Client blockiert wird ist zudem geringer.

#listening-port=3478
listening-port=443
#tls-listening-port=5349
tls-listening-port=443

Bei listening-ip und relay-ip muss die öffentliche IP Adresse eintragen werden. Dies ist meist identisch mit der IP Adresse des Cloud-Server.

#listening-ip=172.17.19.101
#listening-ip=10.207.21.238
#listening-ip=2607:f0d0:1002:51::4
listening-ip=123.123.123.123
#relay-ip=172.17.19.105
#relay-ip=2607:f0d0:1002:51::5
relay-ip=123.123.123.123

Mit folgendem Eintrag werden fingerprints in TURN-Messages aktiviert und die Nutzung von long-term credential mechanism erlaubt. Unter static-auth-secret wird das zuvor erstellte Passwort eingetragen.

fingerprint
lt-cred-mech
#use-auth-secret
static-auth-secret=cd460f5921176138b5bbac38b26f36e771c43effb35931d85c200cadc12dc8a2

In der Zeile realm sollte der Hostname des TURN Server stehen. Das Gesamtquota wird von unlimitiert auf 100 angepasst und eine Lifetime von 10 min festgelegt.

realm=turn.mydomain.com
total-quota=100
stale-nonce=600

In der Zeile cert und pkey wird der Pfad zum Zertifikat und Schlüssel angegeben. Unter cipher-list stehen alle Verschlüsselungsprotokolle welche erlaubt (+) und aber auch nicht erlaubt (!) sind.

cert=/etc/letsencrypt/live/turn.mydomain.com/fullchain.pem
pkey=/etc/letsencrypt/live/turn.mydomain.com/privkey.pem
cipher-list="kEECDH:+kEECDH+SHA:kEDH:+kEDH+SHA:+kEDH+CAMELLIA:kECDH:+kECDH+SHA:kRSA:+kRSA+SHA:+kRSA+CAMELLIA:!aNULL:!eNULL:!SSLv2:!RC4:!MD5:!DES:!EXP:!SEED:!IDEA:!3DES"

Zu Beginn macht eine Protokollierung meist Sinn. Beim Eintrag log-file wird der Pfad zur LOG-Datei angegeben.

log-file=/var/log/turnserver/turn.log

Wird der Server auch als STUN Server verwendet, muss der Eintrag no-stun entfernt werden.

no-stun

Die Sicherheit wird durch nachfolgende Einträge erhöht. Der Prozess wird zudem beim Start unter einem eigenständigen Benutzer und Gruppe ausgeführt.

no-loopback-peers
no-multicast-peers
pidfile="/var/run/turnserver/turnserver.pid"
mobility
proc-user=turnserver
proc-group=turnserver
no-tlsv1
no-tlsv1_1

Service Benutzer + Gruppe für CoTurn

Standardmäßig wird CoTurn als root Benutzer ausgeführt. Zur Erhöhung der Sicherheit wird hierfür ein eigenständiger Benutzer sowie Gruppe erstellt. In der turnserver.conf wurden diese bereits unter proc-user und proc-group eingetragen.

useradd --system --user-group turnserver

Hinweis: Es muss sichergestellt werden, dass der Benutzer turnserver Zugriff auf das Zertifikat und den Schlüssel erhält. Am einfachsten lässt sich dies mit einer Gruppe für Let’s Encrypt lösen, wobei auch der Benutzer turnserver Mitglied dieser Gruppe ist.

Mit folgendem Befehl wird zudem ein LOG-Verzeichnis erstellt und der Besitzer angepasst.

mkdir /var/log/turnserver
chown turnserver.turnserver /var/log/turnserver

Die Einrichtung eines Systemd-Service für CoTurn

Mit nachfolgender Konfiguration lässt sich CoTurn sehr einfach als Systemd-Service starten. Hier verwende ich vi als Editor.

vi /etc/sysconfig/turnserver
#
# TURN Server startup options
#

EXTRA_OPTIONS=""
vi /etc/systemd/system/turnserver.service
[Unit]Description=coturn
Documentation=man:coturn(1) man:turnadmin(1) man:turnserver(1)
After=syslog.target network.target

[Service]
User=turnserver
Group=turnserver
Type=forking
EnvironmentFile=/etc/sysconfig/turnserver
RuntimeDirectory=turnserver
PIDFile=/var/run/turnserver/turnserver.pid
ExecStart=/usr/local/bin/turnserver -o -c /usr/local/etc/turnserver.conf $EXTRA_OPTIONS
ExecStopPost=/usr/bin/rm -f /var/run/turnserver/turnserver.pid
Restart=on-abort

LimitCORE=infinity
LimitNOFILE=999999
LimitNPROC=60000
LimitRTPRIO=infinity
LimitRTTIME=7000000
CPUSchedulingPolicy=other
UMask=0007

[Install]
WantedBy=multi-user.target
systemctl daemon-reload

Capabilities anpassen

Zur Sicherheit des Linux-Systems ist es nicht erlaubt Services ohne Anpassungen der Capabilities auf einem Port kleiner als 1024 zu starten. Bei Nutzung des Port 443 ist daher folgende Anpassung für CoTurn erforderlich.

setcap 'cap_net_bind_service=+ep' /usr/local/bin/turnserver

 

Die Aktivierung und der erste Start von CoTurn

systemctl enable turnserver
systemctl start turnserver

Des Weiteren wird der Port 443 auf der Firewall erlaubt. Der Befehl für firewalld lautet wie folgt.

firewall-cmd --permanent --add-port=443
firewall-cmd --reload

Mit folgendem Befehl lässt sich prüfen, ob der Prozess gestartet wurde und welcher Port dafür genutzt wird.

ps -elf | grep turnserver

Ein TURN Server hinter NAT

Sollte CoTurn hinter NAT betrieben werden, sind Anpassungen in der /usr/local/etc/turnserver.conf erforderlich.

Sowohl die listening-ip als auch die relay-ip sollten nicht aktiviert sein.

#listening-ip=123.123.123.123
#relay-ip=123.123.123.123

Bei external-ip ist die externe und interne IP Adresse einzutragen. In diesem Beispiel: 123.123.123.123=externe IP und 10.10.1.1=interne IP.

external-ip=123.123.123.123/10.10.1.1

Ein einfacher Test

Testen lässt sich die Installation unter folgender URL:

https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

Leider funktioniert dieser Test nur mit Benutzername und Kennwort. Daher muss kurzfristig in der /usr/local/etc/turnserver.conf folgendes angepasst werden.

#static-auth-secret=cd460f5921176138b5bbac38b26f36e771c43effb35931d85c200cadc12dc8a2
user=username2:password2

Den Neustart des Dienstes dabei nicht vergessen. Die TURN URI wird mit folgendem Format eingetragen: turn:turn.mydomain.com:443?transport=tcp

Erscheinen bei diesem Test zwei Zeilen mit dem Typ relay, ist alles in Ordnung und der TURN-Server funktioniert wie gewünscht. Somit kann wieder auf static-auth-secret umgestellt werden.

Hinzufügen des TURN Server in Nextcloud Talk

Nach einem erfolgreichen Test kann nun der TURN Server in Nextcloud unter Einstellungen -> Talk -> TURN-Server eingetragen werden.

Nextcloud Talk Einstellungen TURN-Server

Für weitere Informationen und Fragen, besuchen Sie bitte die Kontakt-Seite.

Do NOT follow this link or you will be banned from the site! asoggetti-413830-unsplash_1024Werbeblocker Pi-Hole Dashboard