Outils pour utilisateurs

Outils du site


installer_un_serveur_stun_turn_bigbluebutton

Installer un serveur TURN/STUN pour BigBlueButton

Un serveur TURN/STUN permet à ceux qui se connectent aux Internets à travers un firewall restrictif (comme dans les entreprises ou les administrations de manière générale) d'accéder à un serveur BigBlueButton (entre autres) en faisant relai.

Normalement, l'accès à un serveur BigBlueButton implique l'accès à des ports rarement ouverts dans les firewall. Le serveur TURN/STUN permet de passer par les ports généralement ouverts 443 et 3478, relayés ensuite vers le serveur BigBlueButton et ses ports.

Dans ce tutoriel, traduit, adapté et augmenté à partir du tutoriel original, on utilisera une Ubuntu 20.04 server permettant d'installer le package coturn dans sa version 4.5.1 minimum.

On considère que le nom de domaine coturn.mondomaine.org pointe sur le serveur.

Installation

Certificat TLS

Certbot permet de générer des certificats SSL/TLS et s'installe de préférence via le gestionnaire de paquets Snap, préinstallé sur Ubuntu.

On installe et met à jour snap :

snap install core; sudo snap refresh core

On installe certbot :

snap install --classic certbot

On fait un lien symbolique vers l’exécutable de certbot pour disposer de la commande dans le PATH :

ln -s /snap/bin/certbot /usr/bin/certbot

On crée le certificat pour le nom de domaine coturn.mondomaine.org :

certbot certonly --standalone --preferred-challenges http -d coturn.mondomaine.org

Coturn

On installe le paquet coturn :

apt install coturn

Le serveur coturn écoutera sur les ports :

  • 443 (TCP/UDP) : accès au certificat TLS
  • 3478 (TCP/UDP) : port d'écoute de coturn

Et communiquera avec les ports du serveur BigBlueButton via l'interval de ports 32768-65535 (UDP).

Le serveur coturn fonctionne en tant que l’utilisateur turnserver et il devra être en mesure d'accéder aux clefs TLS générées par Certbot, notamment lorsque les clefs seront renouvellées.

On crée un dossier /etc/turnserver dans lequel on copiera les clefs automatiquement à chaque renouvellement.

Aller dans le dossier /etc/letsencrypt/renewal-hooks/deploy, et créer un fichier coturn dans lequel on met :

#!/bin/bash -e
for certfile in fullchain.pem privkey.pem ; do
	cp -L /etc/letsencrypt/live/coturn.mondomaine.org/« ${certfile}" /etc/turnserver/"${certfile}".new
	chown turnserver:turnserver /etc/turnserver/"${certfile}".new
	mv /etc/turnserver/"${certfile}".new /etc/turnserver/"${certfile}"
done
systemctl kill -sUSR2 coturn.service

Rendre ce fichier executable :

chmod 0755 coturn

Configuration

Le fichier de configuration de coturn est /etc/turnserver.conf.

Dans ce fichier, on va modifier plusieurs variables et paramètres tel que montré ci-dessous.

  • Remplacer <IP> par l'IP du serveur sur lequel coturn fonctionne, pas celle du serveur BigBlueButton.
  • Remplacer <VALEUR_SECRETE> par une chaine de caractères, par exemple créé via la commande openssl rand -hex 16
listening-port=3478
tls-listening-port=443
 
listening-ip=<IP>
relay-ip=<IP>
 
min-port=32769
max-port=65535
 
static-auth-secret=<VALEUR_SECRETE>
realm=coturn.mondomaine.org
 
cert=/etc/turnserver/fullchain.pem
pkey=/etc/turnserver/privkey.pem
# From https://ssl-config.mozilla.org/ Intermediate, openssl 1.1.0g, 2020-01
cipher-list="ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
dh-file=/etc/turnserver/dhp.pem
 
# If running coturn version older than 4.5.2, uncomment these rules and ensure
# that you have listening-ip set to ipv4 addresses only.
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=::1
# Private (LAN) addresses
# If you are running BigBlueButton within a LAN, you might need to add an "allow" rule for your address range.
# IPv4 Private-Use
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.168.0.0-192.168.255.255
# Other IPv4 Special-Purpose addresses
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
# IPv6 Unique-Local
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
# IPv6 Link-Local Unicast
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff
# Other IPv6 Special-Purpose assignments
denied-peer-ip=::ffff:0:0-::ffff:ffff:ffff
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=64:ff9b:1::-64:ff9b:1:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2001:db8::-2001:db8:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff

Il faut aussi décommenter les paramètres suivants :

verbose
fingerprint
lt-cred-mech
use-auth-secret
keep-address-family
no-cli
no-tlsv1
no-tlsv1_1
# Block connections to IP ranges which shouldn't be reachable
no-multicast-peers

Sauver le fichier.

Fichier dhp.pem

On voit qu'on a besoin de créer le fichier de clef custom DH TLS /etc/turnserver/dhp.pem :

openssl dhparam -dsaparam -out /etc/turnserver/dhp.pem 2048

Configuration du démarrage du service

Quand le service coturn démarrera, il faut qu'il se lie (bind) au port 443. Il faut aussi augmenter le nombre de fichier que le service peut gérer. On crée un dossier /etc/systemd/system/coturn.service.d :

mkdir -p /etc/systemd/system/coturn.service.d

Dedans, on crée un fichier override.conf dans lequel on met :

[Service]
LimitNOFILE=1048576
AmbientCapabilities=CAP_NET_BIND_SERVICE
ExecStart=
ExecStart=/usr/bin/turnserver --daemon -c /etc/turnserver.conf --pidfile /run/turnserver/turnserver.pid --no-stdout-log --simple-log --log-file /var/log/turnserver/turnserver.log
Restart=always

Logs (et rotation)

On crée le dossier de logs de coturn en lui donnant les bons droits : mkdir -p /var/log/turnserver && chown turnserver:turnserver /var/log/turnserver

Puis on configure la rotation en créant un fichier /etc/logrotate.d/coturn dans lequel on met :

/var/log/turnserver/*.log
{
	rotate 7
	daily
	missingok
	notifempty
	compress
	postrotate
		/bin/systemctl kill -s HUP coturn.service
	endscript
}

Redémarrer le serveur coturn ! (voir ci-dessous)

Commandes

A faire la 1ère fois seulement, on copie les clefs TLS dans le dossier /etc/turnserver en utilisant le script créé plus haut pour le renouvellement du certificat par certbot :

/etc/letsencrypt/renewal-hooks/deploy/coturn

On s’assure que le daemon prend en compte le fichier override.conf créé plus haut :

systemctl daemon-reload

On redémarre le service :

systemctl restart coturn

Lier BigBlueButton au serveur coturn

Sur le serveur qui héberge BigBlueButton, modifier le fichier /usr/share/bbb-web/WEB-INF/classes/spring/turn-stun-servers.xml tel que ci-dessous.

Remplacer <VALEUR_SECRETE> par la valeur donnée àa la variable static-auth-secret dans le fichier /etc/turnserver.conf précédemment configuré.

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            ">
 
    <bean id="stun1" class="org.bigbluebutton.web.services.turn.StunServer">
        <constructor-arg index="0" value="stun:coturn.mondomaine.org"/>
    </bean>
 
    <!--bean id="stun2" class="org.bigbluebutton.web.services.turn.StunServer">
        <constructor-arg index="0" value="stun:stun2.example.com"/>
    </bean-->
 
    <!--bean id="iceCandidate1" class="org.bigbluebutton.web.services.turn.RemoteIceCandidate">
        <constructor-arg index="0" value="192.168.0.1"/>
    </bean-->
 
    <!-- Turn servers are configured with a secret that's compatible with
         http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00
         as supported by the coturn and rfc5766-turn-server turn servers -->
 
    <bean id="turn1" class="org.bigbluebutton.web.services.turn.TurnServer">
        <constructor-arg index="0" value="<VALEUR_SECRETE>"/>
        <constructor-arg index="1" value="turns:coturn.mondomaine.org:443?transport=tcp"/>
        <constructor-arg index="2" value="86400"/>
    </bean>
 
    <bean id="turn2" class="org.bigbluebutton.web.services.turn.TurnServer">
        <constructor-arg index="0" value="09142235c7f1fd5ed4197cdef7363ebb"/>
        <constructor-arg index="1" value="turn:coturn.mondomaine.org?transport=tcp"/>
        <constructor-arg index="2" value="86400"/>
    </bean>
 
    <bean id="stunTurnService" class="org.bigbluebutton.web.services.turn.StunTurnService">
        <property name="stunServers">
            <set>
                <ref bean="stun1" />
                <!--ref bean="stun2" /-->
            </set>
        </property>
        <property name="turnServers">
            <set>
                <ref bean="turn1" />
                <ref bean="turn2" />
            </set>
        </property>
        <property name="remoteIceCandidates">
            <set>
                <!--ref bean="iceCandidate1" /-->
                <!--ref bean="iceCandidate2" /-->
            </set>
        </property>
    </bean>
</beans>

Redémarrer BigBlueButton :

bbb-conf --restart

Pour tester si le serveur coturn jour son rôle de relay, utiliser la méthode décrite dans le tutoriel original.

installer_un_serveur_stun_turn_bigbluebutton.txt · Dernière modification: 2021/05/10 00:28 de n1c0