Outils pour utilisateurs

Outils du site


installer_un_serveur_stun_turn_bigbluebutton

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
installer_un_serveur_stun_turn_bigbluebutton [2021/05/07 16:15] – créée n1c0installer_un_serveur_stun_turn_bigbluebutton [2023/04/11 21:50] (Version actuelle) – [Lier BigBlueButton au serveur coturn] Benjamin Labomedia
Ligne 1: Ligne 1:
-====== Installer un serveur STUN/TURN pour 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 [[https://bigbluebutton.org/|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 [[https://docs.bigbluebutton.org/admin/setup-turn-server.html|tutoriel original]], on utilisera une [[https://www.ubuntu-fr.org/|Ubuntu 20.04 server]] permettant d'installer le package [[https://packages.ubuntu.com/groovy/coturn|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 ====
 +
 +[[https://certbot.eff.org|Certbot]] permet de générer des certificats SSL/TLS et s'installe de préférence via le gestionnaire de paquets [[https://snapcraft.io/|Snap]], préinstallé sur Ubuntu.
 +
 +On installe et met à jour snap :
 +
 +<code bash>
 +snap install core; sudo snap refresh core
 +</code>
 +
 +On installe certbot :
 +
 +<code bash>
 +snap install --classic certbot
 +</code>
 +
 +On fait un lien symbolique vers l’exécutable de certbot pour disposer de la commande dans le PATH :
 +
 +<code bash>
 +ln -s /snap/bin/certbot /usr/bin/certbot
 +</code>
 +
 +On crée le certificat pour le nom de domaine coturn.mondomaine.org, **attention** il faut arrêter apache qui écoute sur le port 80 et empêchera certbot d'utiliser le plugin standalone qui va écouter aussi sur le 80 :
 +
 +<code bash>
 +certbot certonly --standalone --preferred-challenges http -d coturn.mondomaine.org
 +</code>
 +
 +==== Coturn ====
 +
 +On installe le paquet **coturn** :
 +
 +<code bash>
 +apt install coturn
 +</code>
 +
 +Le serveur **coturn** écoutera sur les ports :
 +  * 443 (TCP/UDP) : accès au certificat TLS
 +  * 3478 (TCP/UDP) : port d'écoute de coturn
 +  * 5349 (TCP/UDP) : port d'écoute TLS 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 :
 +
 +<code bash>
 +#!/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
 +</code>
 +
 +Rendre ce fichier executable : 
 +
 +<code bash>
 +chmod 0755 coturn
 +</code>
 +
 +===== 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''
 +
 +<code bash>
 +listening-port=3478
 +tls-listening-port=5349
 +
 +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
 +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
 +</code>
 +
 +Il faut aussi décommenter les paramètres suivants :
 +
 +<code bash>
 +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
 +</code>
 +
 +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** :
 +
 +<code bash>
 +openssl dhparam -dsaparam -out /etc/turnserver/dhp.pem 2048
 +</code>
 +
 +==== Configuration du démarrage du service ====
 +
 +Quand le service **coturn** démarrera, il faut qu'il se lie (bind) au port 5349 (TLS). 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** : 
 +
 +<code bash>
 +mkdir -p /etc/systemd/system/coturn.service.d
 +</code>
 +
 +Dedans, on crée un fichier override.conf dans lequel on met :
 +
 +<code bash>
 +[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
 +</code>
 +
 +==== Logs (et rotation) ====
 +
 +On crée le dossier de logs de coturn en lui donnant les bons droits :
 +
 +<code bash>
 +mkdir -p /var/log/turnserver && chown turnserver:turnserver /var/log/turnserver
 +</code>
 +
 +Puis on configure la rotation en créant un fichier **/etc/logrotate.d/coturn** dans lequel on met :
 +
 +<code bash>
 +/var/log/turnserver/*.log
 +{
 + rotate 7
 + daily
 + missingok
 + notifempty
 + compress
 + postrotate
 + /bin/systemctl kill -s HUP coturn.service
 + endscript
 +}
 +</code>
 +
 +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 :
 +
 +<code bash>
 +/etc/letsencrypt/renewal-hooks/deploy/coturn
 +</code>
 +
 +On s’assure que le daemon prend en compte le fichier override.conf créé plus haut :
 +
 +<code bash>
 +systemctl daemon-reload
 +</code>
 +
 +On redémarre le service :
 +
 +<code bash>
 +systemctl restart coturn
 +</code>
 +
 +===== 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 à la variable **static-auth-secret** dans le fichier **/etc/turnserver.conf** précédemment configuré. 
 +
 +<code xml>
 +<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="<VALEUR_SECRETE>"/>
 +        <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>
 +</code>
 +
 +Redémarrer BigBlueButton :
 +
 +<code bash>
 +bbb-conf --restart
 +</code>
 +
 +Pour tester si le serveur coturn jour son rôle de relay, utiliser la méthode décrite dans le [[https://docs.bigbluebutton.org/admin/setup-turn-server.html#test-your-turn-server|tutoriel original]].
 +
 +{{tag>n1c0 serveur streaming tutoriel futuretic }}
installer_un_serveur_stun_turn_bigbluebutton.1620404121.txt.gz · Dernière modification : 2021/05/07 16:15 de n1c0