Bonjour à tous
Ceci est mon premier tuto, donc je vous demande d'être indulgent
Après avoir passé une nuit à écumer internet à la recherche d'une réponse claire à ce que je cherche, j'ai galéré à regrouper de nombreuse information éparse pour avoir la solution. Du coup je fais un tuto car ça peut valoir le coup de garder une réponse simple et complète à la problématique (précise) suivante:
Comment faire que la freebox HD accède au serveur DLNA derrière un routeur personnalisé, quand la freebox v5 est en mode bridge
Pour commencer, cela concerne tous ceux qui ont une architecture réseau comme suit:
internet ---- Freebox v5 --------- routeur (dd-wrt) -+---- PC (enfin réseau interne)
| |
+--- Freebox HD +----- NAS (serveur DLNA)
| etc.
|
En détail:
- vous avez une Freebox v5 configuré en mode bridge
- vous avez confié la sécurité et le routage à un autre routeur plus performant flashé avec un firmware dd-wrt (un Belkin dans mon cas)
- vous avez un seul serveur DLNA qui partage toute vos donnés multimédia et qui vous intéresse (en général c'est un NAS, un DNS-320 dans mon cas)
Votre tripe ?
- Accéder depuis la freebox HD au serveur DLNA de ce petit cachotier de NAS planqué derrière votre réseau privé
Alors en fait, les problèmes réseau sont assez nombreux et j'ai donc décidé de tous les regrouper ici ainsi que les solutions que j'ai utilisé.
1. Premier problème: Identifier sa freebox HD
Aussi curieux qu'il n'y parait, la freebox HD à une IP propre qui est donné par la box et qui ne correspond pas, mais alors vraiment pas du tout à l'IP que l'on a sur internet.
Pour la trouver, il sufit dans une console (Windows+R puis cmd dans windows) de taper un simple:
ping mafreebox.freebox.fr
PING mafreebox.freebox.fr (212.27.38.253): 56 data bytes
64 bytes from 212.27.38.253: seq=0 ttl=63 time=4.390 ms |
Et voila, j'ai l'IP de ma freebox. Dans mon cas 212.27.38.253. Je suppose que cette IP ne change pas souvent et beaucoup de monde doit avoir la même IP.
2. Second problème: Router le protocole DLNA depuis la freebox HD vers le serveur
Ca c'est assez simple, et je pense que la majorité d'entre vous a déjà tenté cela.
Une fois que l'on connait l'IP de sa freebox, il faut connaitre les règles de routages à appliquer. Il n'y a au final que 2 règles.
Dans l'interface de dd-wrt, allez dans les options du NAT et ajouter les 2 règles suivantes:
règle: DLNA-1 type: UDP | source IP: 212.27.38.253 port: 1900 | destination IP: 192.168.24.150 port:1900
règle: DLNA-2 type: Both | source IP: 212.27.38.253 port: 49200 | destination IP: 192.168.24.150 port:49200 |
(j'ajouterai une image quand j'aurais le temps)
Évidemment, ces règles sont spécifiques à votre réseau et à votre serveur DLNA.
L'IP source dépend du retour que vous avez eu sur le point 1.
L'IP destination correspond à l'IP de votre serveur DLNA (mon NAS étant à l'IP 192.168.24.150). Je vous conseille d'affecter une IP fixe à votre serveur.
Et concernant le port 49200, il s'agit le plus souvent d'un réglage dans votre serveur DLNA. Le port 49200 est le port par défaut utilisé par minidlna par exemple.
Il faut toujours garder le port 1900.
Bien, la plupart d'entre vous a essayé cela, et là: ça ne marche pas !
Mais pourquoi est-ce que la freebox est si méchante ???
Est bien c'est parce que le protocole DLNA utilise une saleté de truc qui s'appel le multicast. Et ce truc là, c'est une horreur à configurer.
3. Configurer le multicast
3.a Autoriser le multicast à passer
Tout d'abord, il faut commencer par ouvrir une brèche dans la sécurité de son système (même s'il faudra un jour m'expliquer en quoi c'est une brèche).
Il faut autoriser le multicast. Et donc il faut aller dans l'interface de dd-wrt, onglet "Security", et désactiver l'option "Filter IP multicast" (TODO: image à insérer).
Concrètement, désactiver cette option fait que le routeur lance automatiquement un deamon qui s'appelle "igmprt". Celui-ci laisse passer les requêtes multicast depuis le WAN vers le LAN.
Attention, le deamon n'autorise que les requêtes provenant du réseau de l'interface WAN à passer. Qu'est ce que cela signifie concrètement ? Et bien tout simplement que les seules requêtes multicast autorisées à passer doivent venir de 82.xx.xx.xx (mon IP sur internet). Et donc que seules des requêtes venant d'internet peuvent passer.
3.b Mais la freebox HD, elle n'a pas une IP sur internet ! Comment je fais
Et là commence la bidouille ! Le freebox HD ayant une IP en 212.27.38.253, igmprt ne daignera même pas regarder la requête.
Heureusement il est possible de dire à igmprt qu'au final le réseau "légal" vient de 212.27.38.xx. Il faut modifier son fichier de configuration et ajouter "altnet 212.27.38.0/24" sur l'option qui configure l'interface du WAN. Cela indique que les requêtes multicast peuvent venir d'un réseau "alternatif", entre autre de toute IP 212.27.38.xxx.
Mais comment configurer igmprt avec l'interface de dd-wrt ? C'est simple: on peut pas !
Il va falloir utiliser les scripts.
Dans "admin->scripts", ajouter le texte suivant:
sleep 20
killall igmprt
cat <<EOF> /tmp/igmpproxy.conf
quickleave
phyint vlan2 upstream ratelimit 0 threshold 1 altnet 212.27.38.0/24
phyint br0 downstream ratelimit 0 threshold 1
phyint eth0 disabled
phyint eth1 disabled
phyint eth2 disabled
phyint vlan0 disabled
phyint vlan1 disabled
phyint lo disabled
EOF
/usr/sbin/igmprt /tmp/igmpproxy.conf & |
Puis cliquez sur "Custom".
Attention, adaptez bien le script en fonction de votre réseau (chez moi, le WAN = vlan2, et j'ai 2 interfaces wifi).
Pour être sur de bien modifier le fichier, vous pouvez faire un
Et modifiez le script en fonction de votre réseau. L'option "altnet" devant être ajouté à l'interface contenant "upstream".
Je ne suis pas sur qu'il soit nécessaire de faire un "killall". Peut-être juste qu'un "killall -HUP" suffit. Mais bon, c'est un bidouillage qui fonctionne chez moi.
Pourquoi avoir choisit "Custom" au lieu de firewall ? Et bien parce que dans firewall cela n'a pas l'air de fonctionner (et je ne sais pas pourquoi). A chaque changement de réglage du firewall, le fichier "/tmp/igmpproxy.conf" est recréé, et le deamon relancé. Quoi qu'il en soit, le premier "sleep 20" n'est là que pour s'assurer que le firewall a bien tout remit en place avant d'écraser la configuration par notre configuration personnalisé.
Après, il faut mettre un :
que l'on enregistre dans "firewall". Ainsi, à chaque changement de règle du firewall, on relance notre script custom qui modifie la configuration de "igmprt" avant de le relancer.
C'est un peu tordu mais ça marche chez moi. Si quelqu'un a une autre façon de faire, je veux bien qu'il lève la main
3.c Bon, tout est là mais ça ne marche toujours pas ! Pourquoi
Bon, on est heureux, les requêtes multicast doivent passer, on fait donc l'essai et puis . Ça ne marche toujours pas !
Avant d'envisager le meurtre il est bon de voir que le multicast venant de la freebox est POURRIE.
C'est là on j'ai commencer à déprimer jusqu'à ce que je trouve une explication vers 2h du mat': non seulement l'IP de la freebox HD est pourrite, mais en plus son TTL est à 1 !
Qu'est ce que le TTL ? Et bien c'est un compteur qui est diminué de 1 à chaque fois qu'un paquet traverse un routeur. Et s'il vaut 1, et bien le routeur qui reçoit la requête, avant de le faire passer de l'autre côté, décrémente sa valeur, voit que le TTL vaut zéro. Et là le routeur dit "tiens, je ne t'envoie pas parce que tu vaux 0".
Alors si jamais le serveur DLNA c'est vôtre routeur, mettre un TTL à 1 se tient. Ça évite de propager l'information au delà du premier routeur de Free. Mais dans notre cas c'est un peu gênant car il y a au moins un routeur à traverser.
Heureusement, la solution pour cela est un peu plus simple. Il suffit de dire au routeur de forcer le TTL à une autre valeur (moi j'ai choisi 4) sur les requêtes multicast.
Cela se fait avec la commande:
iptables -A PREROUTING -t mangle -i vlan2 -d 239.255.255.250 -j TTL --ttl-set 4 |
On doit ajouter cela dans le script configurant le firewall. Au final votre script pour le firewall doit ressembler à ça:
iptables -A PREROUTING -t mangle -i vlan2 -d 239.255.255.250 -j TTL --ttl-set 4
/tmp/custom.sh & |
Ouf ! On voit le bout du tunnel !
Normalement, une fois arrivé ici, cela doit fonctionner pour la plupart d'entre vous. Vous pouvez rebooter le routeur et vérifier que la configuration se réapplique bien à chaque fois.
4. Mais pourquoi chez moi ça ne marche pas ???
Il reste quand même un dernier petit souci à régler pour certain. Avant d'envisager de tuer votre famille et de les manger assaisonné d'une sauce au routeur cuit sur un feu fait de vos neveux, sachez qu'il existe encore des petits détails développés exprès pour névroser les gens.
Chez moi ça n'a pas marché. Pourtant tout était correcte ! Je voyais bien les paquets multicast traverser le routeur dans la joie et la bonne humeur, et arriver sur le NAS.
Malheureusement, j'ai découvert (à 3h du mat') que minidlna (qui est mon serveur DLNA) possède une "sécurité":
- il filtre les requêtes multicast ne venant pas du réseau de l'interface (192.168.24.xxx chez moi).
Alors pour ce dernier problème, je n'ai trouvé qu'une seule solution: recompiler minidlna avec le patch suivant:
https://svn.redports.org/lippe/net/ [...] er-subnets
Une fois fait, ça fonctionne chez moi.
J'ignore ce qu'il en est des autres serveur DLNA. Mais sachez que ce dernier problème ne peut venir que de votre serveur DLNA.
Et voila..
Bonne chance !