Réflecteur mDNS pour chromecast

August 2016

linux

Sur mon réseau à plusieurs interfaces réseau, naturellement, impossible de faire fonctionner mon périphérique mDNS (chromecast) entre les différents réseaux.

Par exemple, connecté au réseau freebox, on peut voir le chromecast, mais si on est connecté sur mon wifi hors freebox, alors pas de discovery.

Cet article peut donner quelque astuces pour régler ce petit problème.

Spoiler alert: utiliser avahi avec la fonctionnalité “reflector”.

Introduction

Lorsque l’on a plusieurs réseaux interconnectés, mais que sur l’un deux, la configuration du routeur par défaut ne peut être altérée (FreeBOX), il peut parfois être nécessaire de bidouiller un peu.

La FreeBOX mini 4k (android tv) dispose d’une fonctionnalité ChromeCast.

La configuration d’un réflecteur mDNS permet d’utiliser l’appareil chromecast, alors que l’on est sur des interfaces réseau physiques différentes.

Mon réseau est séparé en plusieurs morceaux:

+------------------+                   +-----------------+
| FreeBOX (server) |  réseau free      | Freebox mini 4k |
| 192.168.2.254/24 | <---------------> | 192.168.2.XX/24 |
+------------------+                   +-----------------+
         |          +---------------------+
         +-->  eth1 | Routeur linux (APU) |           +----------------+
                    | 192.168.0.1/24      | wlan0 <-- | Réseau wifi    |
         +-->  eth2 |                     |           | 192.168.3.0/24 |
         |          +---------------------+           +----------------+
+-------------------------+
| Routeur autre opérateur | -> Internet 2
| 192.168.1.254/24        |
+-------------------------+

La version de chromecast installée sur la FreeBOX mini 4k utilise mDNS afin de faire fonctionner son système de découverte de périphériques. (discovery)

mDNS est un protocole réseau qui utilise multicast afin de propager a intervale régulier des informations sur les périphériques.

La configuration du routeur freebox serveur n’est pas modifiable, on ne peut pas l’informer que pour joindre 192.168.0.0/24 ou 192.168.3.0/24 il faut passer par mon routeur “APU” 192.168.2.1.

La propagation des paquets multicast ne se fera pas automatiquement entre les différentes interfaces réseau.

Il est possible de configurer un routage multicast afin de faire transiter les paquets multicast discovery entre les interfaces physiques, mais ce n’est pas la route que j’ai choisi de prendre.

Dans cet exemple, mon routeur fonctionne sous Debian GNU/Linux (jessie).

Avahi-daemon

apt install avahi-daemon

Ensuite, concernant la configuration de avahi-daemon, quelques paramètres nous intéressent:

# Cette configuration est incomplète
# Les paramètres par défaut ne sont pas mentionnés
[server]
use-ipv4=yes
allow-interfaces=eth0,eth1,eth2,wlan0

[reflector]
enable-reflector=yes
reflect-ipv=no

J’espère ne pas avoir a décrire ce que use-ipv4=yes fait..

Concernant allow-interfaces, cela permet a avahi-daemon de savoir sur quelles interfaces il peut travailler. Dans mon cas, toute les interfaces lui sont accessibles.

La section intéressante est [reflector].

Le paramétrage de enable-reflector=yes permet d’activer le relay des paquets entrants vers toute les intrafaces déclarées plus haut.

reflect-ipv permet de faire des transformations IPv6 -> IPv4 et vice versa.

Pour plus de détails, consulter la page de manuel avahi-daemon.conf(5).

Netfilter

Mais ce n’est pas tout. Comme décrit plus haut, la freebox ne connait pas 192.168.0.0/24 ou 192.168.3.0/24.

Il faut donc lui faire croire que toute les communications proviennent de 192.168.2.0/24. Rien de plus simple:

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -d 192.168.2.0/24 -j SNAT --to-source 192.168.2.1
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.3.0/24 -d 192.168.2.0/24 -j SNAT --to-source 192.168.2.1