Cet article explique comment installer un serveur UPnP (Universal Plug and Play) sur une distribution Debian GNU/Linux 5.0 Lenny pour accéder à ses fichiers multimédia depuis l'interface de la Freebox HD.

Mon serveur est ici mon boîtier Linksys NSLU2 et le serveur multimédia UPnP est MediaTomb.

La première chose à faire a été de mettre à jour ma distribution Debian sur le serveur NSLU2 de la version 4.0 Etch à la version 5.0 Lenny (voir ce site) car les paquets mediatomb n'apparaissent qu'à partir de la version 5.0 Lenny.

Ensuite l'installation de MediaTomb depuis la console d'administration du NSLU2 est aussi simple qu'un :

# aptitude install mediatomb.

Pour configurer MediaTomb, il suffit ensuite de suivre les indications du blog de Yoann en accédant depuis votre navigateur internet à la console d'administration de MediaTomb à l'adresse http://<ipv4 du serveur>:49152.


Par contre, tout ce complique si comme moi vous utilisez un firewall pour protéger votre serveur. La suite de cet article se propose donc de vous expliquer comment configurer les règles netfilter/iptables pour permettre l'accès à votre serveur depuis la Freebox HD.

Avant toute chose, je tiens à préciser comme rappelé sur nombre de forums qu'il est inutile d'activer la fonction de routage de l'UPnP dans l'interface d'administration de la Freebox. L'usage que nous faisons de l'UPnP se limite ici au réseau local et n'a donc pas besoin d'être "routé" vers l'extérieur.

Le fonctionnement de l'UPnP est un peu particulier car les appareils UPnP annoncent leur présence sur le réseau en envoyant un message UDP sur le port 1900 à l'adresse IP 239.255.255.250, qui est une adresse fictive (aucun équipement sur le réseau local n'a effectivement cette adresse). Les clients UPnP se connectent ensuite en TCP sur le port 49152 du serveur UPnP. Une fois qu'on a compris ça, le reste devient plus logique.

  1. Créer la route vers le réseau virtuel 239.0.0.0 :
  2. Il suffit pour cela d'éditer le fichier /etc/default/mediatomb et de renseigner la ligne INTERFACE="eth0" en précisant l'interface réseau utilisée (ici eth0 pour moi). Si cette ligne n'est pas renseignée la route ne sera pas créée. Il faut ensuite relancer le service MediaTomb :

    # /etc/init.d/mediatomb restart

  3. Paramétrer le firewall pour permettre les connexions UPnP :
  4. Créons le fichier iptables.UPnP et définissons quelques variables :

    # Réseaux et hôtes
    NSLU2=192.168.0.128
    PC_ADMIN=192.168.0.1
    FREEBOX_ADSL=192.168.0.254
    #FREEBOX_HD=192.168.27.14
    LAN=192.168.0.0/16
    UPNP_Broadcast=239.255.255.250
    
    # Ports
    MEDIATOMB_port=49152
    SSDP_port=1900
    

    Permettons ensuite l'émission et la réception des messages d'annonce sur le port 1900 du poste virtuel 239.255.255.250 :

    # Autoriser le serveur à s'annoncer pour les services UPNP
    iptables -t filter -A OUTPUT -o eth0 -m state --state NEW -s ${NSLU2} -d ${UPNP_Broadcast} -p udp --sport 1024: --dport ${SSDP_port} -j ACCEPT
    #Autoriser le serveur à écouter les messages d'annonce pour les services UPNP
    iptables -t filter -A INPUT -i eth0 -m state --state NEW -s ${LAN} -d ${UPNP_Broadcast} -p udp --sport 1024: --dport ${SSDP_port} -j ACCEPT
    

    Autorisons maintenant la Freebox HD à se connecter à notre serveur sur le port UPnP 49152. Attention, ici ce n'est pas l'adresse IP de la Freebox HD que nous renseignons, mais celle de la Freebox ADSL. En effet, il semble que la Freebox HD ne se connecte pas directement sur notre serveur, mais qu'elle le fasse par l'intermédiaire de la Freebox ADSL.

    # Autoriser les connexions TCP UPNP depuis la Freebox HD via la Freebox ADSL
    iptables -t filter -A INPUT -i eth0 -m state --state NEW -s ${FREEBOX_ADSL} -d ${NSLU2} -p tcp --sport 1024: --dport ${MEDIATOMB_port} --syn -j ACCEPT

    Autorisons ensuite le PC d'administration à se connecter à l'interface WEB de MediaTomb :

    # Autoriser les connexions HTTP pour MEDIATOMB depuis le poste d'administration
    iptables -t filter -A INPUT -i eth0 -m state --state NEW -s ${PC_ADMIN} -d ${NSLU2} -p tcp --sport 1024: --dport ${MEDIATOMB_port} --syn -j ACCEPT
    

    Il est évident que ces règles iptables ne suffisent pas à elles seules et qu'il faut définir les politiques par défaut et permettre les connexions déjà établies en interdisant tout ce qui n'a pas été clairement autorisé. Pour un exemple complet, voir mon fichier iptables.UPnP.

Maintenant, votre serveur UPnP devrait être accessible depuis votre Freebox HD.