P2P Konferenz mit Coturn und Jitsi

Jitsi Konferenzen sind eine gute Alternative zu kommerziellen Angeboten. Ein Jitsi Server kann kostengünstig selber gehostet werden oder es stehen diverse Anbieter mit kostenlosen oder Managed Services zur Verfügung.

Eine 1:1 Konferenz ist dennoch die häufigste Konferenz. Um eine P2P (Person to Person) Konferenz effizienter und mit besserer Performance zu gestaltet, lohnt es sich einen STUN oder TURN Server auszusetzten und diesen wenn nötig mit Jitsi zu koppeln.

Je nach Konfiguration kann auch ein Jitsi und STUN Server auf einem virtuellen Server betrieben werden. Bei unseren All-in-One Angeboten bieten wir unseren Kunden genau diese Kombination aus Jitsi und CoTurn auf einem Root Server an.

Wir verwenden Ansible um alle Server auszusetzten und zu verwalten. Alle hier angegeben Felder müssen durch eigene Ersetzt werden.

Jitsi Konfiguration

Jitsi Meet
# /etc/jitsi/meet/{{ jitsi_meet_server_name }}-config.js

# (ca. Line 234)
useStunTurn: true, 

# (ca. Line 327)
    p2p: {
        enabled: true,

        // Use XEP-0215 to fetch STUN and TURN servers.
        useStunTurn: true,

        // The STUN servers that will be used in the peer to peer connections
        stunServers: [

{% for server in jitsi_meet_config_stun_servers %}
            { urls: '{{ server }}' }{% if not loop.last -%},
{% endif %}
{% endfor %}

        ],

Mit dieser Konfiguration wird Jitsi mitgeteilt, dass dieser bei P2P Konferenzen TURN nutzen soll. Als Server werden hier die eigenen coturn Server mit der offentlichen Domain z.B. turn.meet.h2-invent.com: eigetragen. WICHTIG: Der Port muss hier gleich mit angefügt werden.

  • jitsi_meet_config_stun_servers ist <{{ stundomain }}:{{ coturn_tls_listening_port }}> aus der Coturn Konfugration

Prosody
# /etc/prosody/conf.avail/{{ jitsi_meet_server_name }}.cfg.lua

# Global
{% set jitsi_meet_stun_server_host = jitsi_meet_config_stun_servers[0].split(':')[0] %}
{% set jitsi_meet_stun_server_port = jitsi_meet_config_stun_servers[0].split(':')[1] %}

-- domain mapper options, must at least have domain base set to use the mapper
muc_mapper_domain_base = "{{ jitsi_meet_server_name }}";

# TRUN Server Secrets
turncredentials_secret = "{{ coturn_static_auth_secret }}";

# Einrichten der ProSody Schnittstelle zum coturn Server
turncredentials = {
  { type = "stun", host = "{{ jitsi_meet_stun_server_host }}", port = "{{ jitsi_meet_stun_server_port }}" },
  { type = "turn", host = "{{ jitsi_meet_stun_server_host }}", port = "{{ jitsi_meet_stun_server_port }}", transport = "udp" },
  { type = "turns", host = "{{ jitsi_meet_stun_server_host }}", port = "{{ jitsi_meet_stun_server_port }}", transport = "tcp" }
};

Mit dieser Konfigration wird dem Prosody Dienst gesagt, wohin er sich verbinden soll, wenn nur zwei Teilnehmer in einer Konferenz sind.

TurnCredentials Installieren und Aktivieren

Noch das Modul "turncredentials" aktivieren und dieser Teil ist geschafft.

modules_enabled = {
        "bosh";
        "pubsub";
        "ping"; -- Enable mod_ping
        "turncredentials";
    }

BTW! Das Modul muss bereits installiert sein. Sonst geht es nicht. "mod_turncredentials.lua"

cd /tmp && \
wget https://raw.githubusercontent.com/otalk/mod_turncredentials/master/mod_turncredentials.lua && \
sudo cp mod_turncredentials.lua /usr/lib/prosody/modules/
Zusätze
# /etc/jitsi/videobridge/sip-communicator.properties

org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES={{ jitsi_meet_config_stun_servers[0] }}
org.jitsi.videobridge.DISABLE_TCP_HARVESTER=true

Diese Konfiguration kann vorgenommen werden, muss aber nicht.

  • {{ jitsi_meet_server_name }} = Domain des Jitsi Servers
  • {{ coturn_static_auth_secret }} Secrets des Coturn Servers
  • {{ jitsi_meet_config_stun_servers }} alle Turn Server aufgesplittet in Domain und Port. [0] ist der erste in der Liste

Coturn

Coturn starten
# sudo vim /etc/default/coturn

TURNSERVER_ENABLED=1
Coturn Konfiguration

Wenn der Coturn Server mit Letsencrypt verwendet werden soll, müsst ihr folgende Zertifikate eintragen und natürlich den Certbot installieren

server-name=<YOUR_COTURN_DOMAIN>
cert=/etc/letsencrypt/live/<YOUR_COTURN_DOMAIN>/cert.pem
pkey=/etc/letsencrypt/live/<YOUR_COTURN_DOMAIN>/privkey.pem
# /etc/turnserver.conf

server-name:stun.{{domain}}
#listening-port=3478
{% if not coturn_tls %}#{% endif %}tls-listening-port={{ coturn_tls_listening_port }}
listening-ip={{ ansible_host }}
relay-ip={{ ansible_host }}
fingerprint
use-auth-secret
static-auth-secret={{ coturn_static_auth_secret }}
realm={{ stundomain }}
total-quota=100
bps-capacity=0
no-udp
no-tcp
stale-nonce=600
cert={{ coturn_tls_cert }}
pkey={{ coturn_tls_key }}
cipher-list="ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
ec-curve-name=secp384r1
dh-file=/etc/coturn-dh-2048.pem
no-stdout-log
log-file=/var/log/turnserver.log
simple-log
no-multicast-peers
cli-port=5766
no-tlsv1
no-tlsv1_1
min-port=15000
max-port=25000

Coturn Service neu Starten nicht vergessen. Der Port muss ein anderer sein, wie der von ngnix und Jitsi. Sonst startet einer der Dienste nicht korrekt. Als {{ coturn_tls_listening_port }} eignet sich z.B. 444 oder 445, darf aber nicht 443 sein, da dieser bereits von ngnix verwendet wird. Es besteht die Möglichkeit, nginx als Load Ballancer und Reverse Proxy einzusetzten. Wir aber hier nicht weiter beschrieben.

Coturn Server testen : Kennwort für einen tem. Benutzer

Zum Testen des Coturn Servers steht das Tool Trickle ICE zur Verfügung. Dafür benötigt ihr noch ein Benutzername und ein Kennwort. Das Kennwort und der Benutzer sind für 48 Stunden gültig. So wie die dynamischen Benutzer in Coturn.

secret=mysecret && \
time=$(date +%s) && \
expiry=8400 && \
username=$(( $time + $expiry )) &&\
echo username:$username && \
echo password : $(echo -n $username | openssl dgst -binary -sha1 -hmac $secret | openssl base64)

Klicken Sie dann auf Server hinzufügen und dann auf die Schaltfläche Kandidaten sammeln. Wenn Sie alles richtig gemacht haben, sollten Sie als Endergebnis "Done" sehen. Wenn Sie keine Antwort erhalten oder wenn Sie Fehlermeldungen sehen, überprüfen Sie bitte, ob Sie diesen Leitfaden so befolgt haben, wie er ist.

Firewall einrichten

Am Schluss muss noch die Firewall eingerichtet werden. Wir verwenden iptables, da diese sehr schnell über Ansible einrichtet werden können.

Freigaben:

  • Verbundene Zulassen
  • Port 80 TCP
  • Port 443 TCP
  • Port 10000 UDP
  • Port TCP und UDP
  • Port < Coturn Bereich> TCP UDP
  • Evtl. Port 22 TCP für SSH
  • Rest Blocken

Wir sind für Sie da!

Benötigen Sie Unterstützung bei Ihrer Transformation?
Zögern Sie nicht mit uns Kontakt aufzunehmen.

Kontakt aufnehmen
Posted in Services 30.04.2020