Raspberry Pi Radio partie 3 : ouverture au monde

Ici, nous allons faire en sorte que notre super radio puisse être accédée de l’extérieur de notre réseau local.

Objectifs

Créer un serveur HTTPS sur Nginx (et non Apache! Il vous faudra un autre tutoriel pour Apache!) afin d’accéder à votre stream musical de l’extérieur

Prérequis

Avoir un serveur HTTP tournant sur le Pi avec Nginx proprement configuré (suivez donc ce tuto!)
Avoir un nom de domaine et généré vos certificats – suivez donc ce tuto!
Avoir réussi la configuration d’un serveur HTTPS (même avec une page par défaut)suivez cet autre tuto!
Avoir ouvert et forwardé le port 443 de votre box (chose que, si vous avez suivi les tutos, devrait être faite).
Avoir réussi à faire tourner une radio dans les étapes précédentes de ce tutoriel. Le port 8000 sera celui utilisé (pas besoin de l’ouvrir sur votre box!) et la mount sera /radio.ogg.

Petite précision

Nous allons faire en sorte que la radio soit streamée via un serveur dédié, ce qui signifie que, si vous avez bien configuré un éventuel autre serveur Nginx, même HTTPS, sur votre Raspberry Pi, la radio et le site tourneront chacun de leur côté. C’est pas beau, ça?!

J’en profite pour préciser qu’il a fallu de bonnes heures de galère pour trouver les réglages qui marchent pour moi sur divers forums, et c’est la raison pour laquelle je remercie ces anonymes de leurs efforts et me permets de compulser tout ceci pour mon usage.

Procédure

Tout va se passer dans Nginx, en créant un fichier dédié à notre serveur.

sudo touch /etc/nginx/sites-available/radio
sudo ln -ls /etc/nginx/sites-available/radio /etc/nginx/sites-enabled/radio

Avec les deux précédentes commandes, nous avons créé un fichier vide, ainsi que le lien symbolique pour l’activation du site qu’il contient.

sudo nano /etc/nginx/sites-available/radio

Dans le premier bloc, nous allons rediriger toutes les connexions non-sécurisées vers notre domaine vers le port 443. Copiez donc :

server {
if ($host = domaine.linkpc.net) {
return 301 https://$host$request_uri;
} # managed by Certbot

listen 80;
listen [::]:80;
server_name domaine.linkpc.net www.domaine.linkpc.net;

# Renvoi vers le port 443
location / {
return 301 https://$server_name$request_uri;
}
}

Ensuite, le “vrai” bloc server, que voici :

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name domaine.linkpc.net www.domaine.linkpc.net;

    index index.php index.html;

    root /var/www/domaine/www;
    access_log /var/www/domaine/access.log;
    error_log  /var/www/domaine/error.log;

# EN AVANT POUR SSL!
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers     ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
    ssl_ecdh_curve      secp384r1;

    ssl_session_cache   shared:SSL:4m;
    ssl_session_timeout 1440m;
    ssl_stapling        on;
    ssl_stapling_verify on;

    resolver        8.8.8.8 8.8.4.4;

    add_header      Strict-Transport-Security max-age=31536000;

    # Les certificats n'existent que si la procédure avec Certbot a été suivie!
    ssl_certificate /etc/letsencrypt/live/domaine.linkpc.net/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domaine.linkpc.net/privkey.pem; # managed by Certbot

    # FIN DE SSL

    # ICECAST
    # Ajout d'en-têtes spécifiques
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;

    # Redirection vers notre radio locale
    location /radio {
        proxy_pass http://127.0.0.1:8000/radio.ogg;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    # FIN DE ICECAST
}

Alors alors, que venons-nous de faire? En fait, j’ai repris simplement ce qui était indiqué dans le tutoriel HTTPS indiqué plus haut pour la gestion du SSL, et seules lignes de la section ICECAST sont le vrai coeur du problème.
Je ne vais pas vous mentir, je n’ai rien compris aux add-header ni aux set_header, mais c’est la seule configuration que j’ai trouvée qui fonctionne.

Pour le reste, le proxy_pass est excessivement simple et renvoie toute connexion à destination de https://domaine.linkpc.net/radio vers [votre ip locale]:8000/radio.ogg.

Ceci fait, enregistrez et quittez, puis :

sudo service nginx reload

Si vous n’avez rien oublié, tout devrait fonctionner du premier coup!

Conqueluzion

Nous avons maintenant une radio qui tourne en HTTPS via un domaine extérieur et ça, c’est une bonne nouvelle.
Dans la prochaine partie, nous allons voir comment rajouter un autre stream à Icecast!

Leave a Reply

Your email address will not be published. Required fields are marked *