Le Pic
Projet Internet et Citoyenneté

Accueil > LES OUTILS > Audio-conférence avec MUMBLE > Installer un serveur mumble

Installer un serveur mumble


Installation, configuration et monitoring d’un serveur mumble sous debian 10

Mise à jour le 28/03/2020 -

Dans ce tuto, on supposera que :

  • On dispose d’un serveur avec accès root, en debian 10.
  • Le point d’entrée du serveur (un site web, peut-être juste une page html) est : https://audio.exemple.com
  • L’application web de connexion au serveur mumble est : https://blabla.exemple.com
  • Le serveur web apache2 ou nginx (v. 1.14 au moins) est installé

Installation du serveur Mumble : murmur (murmurd)

Le serveur mumble est disponible sous la forme d’un paquet pour Debian.
Sous la version de Debian 10, c’est Mumble 1.3 qui est disponible, soit la dernière version disponible mi 2019.

apt-get install mumble-server
dpkg-reconfigure mumble-server

1/ Activer le lancement du processus murmurd au lancement du système :

Sélectionner "Yes" puis valider.

2/ Placer le processus murmurd en priorité haute, de sorte à réduire la latence, ce qui améliore la qualité audio :


Sélectionner "Yes" puis valider.

3/ Saisir un mot de passe pour l’utilisateur SuperUser puis valider. La ligne de commande renvoie la confirmation de modification du mot de passe.

On peut vérifier par la commande suivante que le port 64738 est en écoute sur le serveur :

# ss -apn | grep 64738 | grep LISTEN
tcp   LISTEN    0      50        *:64738          *:*         users:(("murmurd",pid=10349,fd=12))

Si c’est le cas, on doit trouver le mot clef LISTEN devant le numéro de port concerné comme ci-dessus.

Pour changer ultérieurement si besoin le mot de passe de l’utilisateur SuperUser, la commande est :
murmurd -supw <nouveau_mot_de_passe>
A noter que lorsqu’on se connecte via ce compte Superuser, c’est uniquement pour administrer le service car il n’est possible ni de parler ni d’écouter.

4/Compléments pour personnaliser.
La configuration de mumble-server est dans /etc/mumble-server.ini
C’est ici par exemple que se modifie le nom du salon d’entrée par défaut (Root) par la variable ’registerName

Installer le certificat serveur

Il est important de remplacer le certificat de base autosigné par un certificat authentifié par une vraie autorité de certification. Le plus simple et le plus économique est d’utiliser les certificats letsencrypt.

Installer le logiciel dehydrated :

Ce qui suit est directement inspiré de https://technique.arscenic.org/ssl-securisation-des-communications-serveur-client/article/installer-et-configurer-un-certificat-let-s-encrypt#installer-et-configurer-dehydrated

On installe les dépendances, puis on va chercher le logiciel :

apt install git curl
cd /etc
git clone https://github.com/lukas2511/dehydrated letsencrypt
cd letsencrypt

On crée le répertoire dont le logiciel a besoin pour ses "challenges" [1]

cd /etc/letsencrypt
mkdir .acme-challenges
# echo 'ça marche !!!!' > .acme-challenges/test.txt
# chown -R www-data:www-data .acme-challenges

On crée un fichier de configuration minimal pour letsencrypt :

cat >/etc/letsencrypt/config << FIN
   CONTACT_EMAIL=un-adresse-mail@exemple.fr
   WELLKNOWN="${BASEDIR}/.acme-challenges"
FIN

Version avec apache2 : Configurer apache

# cd /etc/apache2/conf-available/
# nano letsencrypt.conf
             # /etc/apache2/conf-available/letsencrypt.conf
             Alias /.well-known/acme-challenge /etc/letsencrypt/.acme-challenges
   
             <Directory /etc/letsencrypt/.acme-challenges>
                       Options None
                       AllowOverride None
                        Require all granted
             </Directory>
# a2enconf letsencrypt
# systemctl reload apache2

Version avec nginx : Configurer nginx

IMPORTANT - Vous aurez besoin de définir plusieurs virtual hosts pour exécuter toute cette installation. Il vous faudra donc introduire ces quelques lignes dans tous les fichiers de configuration de votrs vhosts.

# cd /etc/ngcinx/sites-available/
# nano audio.exemple.com
            ...
            # pour dehydrated
             location /.well-known/acme-challenge {
                  alias /etc/letsencrypt/.acme-challenges;
             }
systemctl reload nginx

Tester la configuration du serveur web :

Pointez votre navigateur sur http://audio.exemple.com/.well-known/acme-challenge/test.txt, il doit vous répondre : ça marche !!!

Générer les certificats de letsencrypt :

On dit à dehydrated le nom du ou des domaines à certifier

# cd /etc/letsencrypt
# nano domains.txt
        audio.example.com

Ca y est, on peut générer le certificat !

./dehydrated  --register --accept-terms
./dehydrated -c

Le certificat se trouve dans /etc/letsencrypt/certs/audio.exemple.com, deux fichiers sont importants : fullchain.pem (la chaîne de certification complète) privkey.pem (la clé privée)

TODO - Un cron pour que la commande dehydrated -c soit exécutée tous les jours, afin de renouveler les certificats qui en ont besoin.

Installer le certificat pour utilisation par murmurd :

# cd /etc
# mkdir mumble-ssl
# cd mumble-ssl
# cat /etc/letsencrypt/certs/audio.exemple.com/fullchain.pem > fullchain.pem
# cat /etc/letsencrypt/certs/audio.exemple.com/privkey.pem > privkey.pem
# chmod go= *.pem
# chown mumble-server *.pem
# cd /etc
# nano +215 mumble-server.ini
          sslCert=/etc/mumble-ssl/fullchain.pem
          sslKey=/etc/mumble-ssl/privkey.pem
# systemctl stop mumble-server
# systemctl start mumble-server

Installer l’interface web

Le code de mumble-web et le readme pour l’installation se trouvent ici :
https://github.com/Johni0702/mumble-web

Installer npm

apt install npm

Cela installe une grand quantité de dépendances j’espère que vous avez de la place sur le disque...

Installer mumble-web

npm install -g mumble-web

Installer websockify

apt install websockify

Démarrer websockify

websockify --ssl-target 64737 <mumbleserver>:64738

TODO - Démarrer et arrêter websockify avec systemd !

Patcher mumble-web

Il faut ajouter une ligne dans un fichier .js afin de pouvoir utiliser les "tokens" avec l’interface web (possibilité de rejoindre une conférence).

Fichier /usr/local/lib/node_modules/mumble-web/dist/index.js
Ligne 535 (environ)
Séquence avant :

           // TODO: token
           _this5.connector.connect('wss://' + host + ':' + port, {
             username: username,
             password: password
           }).done(function (client) {
             log('Connected!');

Séquence après

           // TODO: token
           _this5.connector.connect('wss://' + host + ':' + port, {
             username: username,
             password: password,
             tokens: token.split(",") // correction by manu see github
           }).done(function (client) {
             log('Connected!');

Générer le certificat pour blabla.exemple.com

Écrire (sur une seule ligne) blabla.exemple.com dans le fichiers /etc/letsencrypt/domains.txt et tapez la commande :

cd /etc/letsencrypt;
dehydrated -c

Version apache : Configurer apache en mode proxy

<VirtualHost blabla.le-pic.org:443>
       ServerName exemple.com
       ProxyPreserveHost On
       ProxyRequests off
       ProxyPass /.wellknown !
       ProxyVia On
       RewriteEngine On
       RewriteCond %{HTTP:Connection} Upgrade [NC]
       RewriteCond %{HTTP:Upgrade} websocket [NC]
       
       # change the port to your websockify port
       RewriteRule /blabla ws://127.0.0.1:64737 [P,L]

       # change the ports below to your mumble-web host or serve it directly
       #ProxyPass / http://127.0.0.1:1235/
       #ProxyPassReverse / http://127.0.0.1:1235

       SSLEngine on

       SSLCertificateFile      /etc/letsencrypt/certs/blabla.exemple.com/cert.pem
       SSLCertificateKeyFile   /etc/letsencrypt/certs/blabla.exemple.com/privkey.pem
       SSLCertificateChainFile /etc/letsencrypt/certs/blabla.exemple.co/fullchain.pem
     
       DocumentRoot /usr/local/lib/node_modules/mumble-web/dist

       <Location / >
               require all granted
       </Location>
       
       ErrorLog ${APACHE_LOG_DIR}/mumble-web-error.log
       CustomLog ${APACHE_LOG_DIR}/mumble-web-access.log combined

</VirtualHost>

Version nginx : Configurer nginx en mode proxy

cd /etc/nginx/sites-available
nano blabla.exemple.com
     server {
          server_name blabla.exemple.com;
          listen 80 ;
          listen [::]:80 ;
          return 301 https://$host$request_uri;
  }
   server {
       listen 443 ssl;
       listen [::]:443 ssl;
       server_name blabla.exemple.com;
        ssl_certificate     /etc/letsencrypt/certs/blabla.exemple.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/certs/blabla.exemple.com/privkey.pem;

        # pour dehydrated
       location /.well-known/acme-challenge {
                alias /etc/letsencrypt/.acme-challenges;
       }

       location / {
                root /usr/local/lib/node_modules/mumble-web/dist;
       }
       location /blabla {
               proxy_pass http://localhost:64737;
               proxy_http_version 1.1;
               proxy_set_header Upgrade $http_upgrade;
               proxy_set_header Connection $connection_upgrade;
       }
  }

  map $http_upgrade $connection_upgrade {
       default upgrade;
       '' close;
  }

* Ne pas oublier d’ajouter la ligne listen [: :]:443 ssl ; pour écouter en ipv6.

Complément de personnalisation

Il est possible de personnaliser l’affichage de mumble-web :

  • pour personnaliser une configuration par défaut (mode Appuyer pour parler, champ à afficher sur la fenêtre de connexion ....) c’est dans /usr/local/lib/node_modules/mumble-web/dist/config.local.js
  • pour franciser les différents champs et menus, ou changer le message Indications dans la partie centrale de la colonne de gauche c’est dans /usr/local/lib/node_modules/mumble-web/dist/index.html
  • pour modifier les deux premières lignes de la partie haute de cette même colonne de gauche c’est dans /usr/local/lib/node_modules/mumble-web/dist/index.js
  • le Message de bienvenue sur la troisième ligne de cette colonne de gauche se modifie lui dans /etc/mumble-server.ini

[1Les challenges sont des actions que le serveur de letsencrypt va accomplir sur le domaine qui a demandé un certificat. Si le challenge est réussi, cela veut dire que l’on a la certitude que la personne qui a lancé la commande maîtrise bien le domaine (donc que ce n’est pas un pirate), et on peut dès lors lui délivrer un =certificat.