web-dev-qa-db-fra.com

Docker recevant du trafic multicast

Nous avons une application serveur dockée qui effectue la découverte automatique des appareils physiques sur le réseau en écoutant les paquets de multidiffusion sur le port 6969. Nous avons donc besoin de notre conteneur Docker pour pouvoir recevoir ces paquets à partir de périphériques en dehors de l'hôte, via l'hôte, et dans le conteneur. J'ai vu certainssimilaireproblèmes et fait alotoflecture mais je ne parviens toujours pas à faire répondre le serveur à ces paquets de multidiffusion.

Je suis assis sur Wireshark à regarder le trafic réseau, mais je ne suis pas un spécialiste. Je sais que Docker crée une adresse MASQUERADE pour que tout le trafic semble provenir de la passerelle Docker, donc quand je regarde veth je vois surtout parler entre 172.17.0.1 et 172.17.0.2 bien que mon serveur ne puisse pas récupérer d'informations sur les périphériques du réseau. (Si je cours en dehors de Docker, je n'ai bien sûr aucun problème.)

Je ne peux pas utiliser --net=Host comme, comme d'autres, nous utilisons --link fonctionnalité. J'ai essayé les variantes suivantes ...

  • docker run --name app -p 6969:6969 -d me/app:latest
  • docker run --name app -p 0.0.0.0:6969:6969 -d me/app:latest (Celui que j'aurais juré a travaillé une fois mais maintenant non?)
  • docker run --name app -p 0.0.0.0:6969:6969/udp -d me/app:latest
  • docker run --name app -p 255.255.255.255:6969:6969 -d me/app:latest

Toute aide ou information que vous pourriez fournir serait grandement appréciée.

14
DTI-Matt

Essayez d'activer multicat sur vos cartes réseau:

ip link set eth0 multicast on

echo 1 >/proc/sys/net/ipv4/ip_forwarding pour activer le transfert IP

Vous devez définir explicitement ou au moins vérifier qu'il est activé sur les interfaces pertinentes.

net.ipv4.conf.all.mc_forwarding = 1
net.ipv4.conf.eth0.rp_filter=0

Autorisez le trafic de multidiffusion:

iptables -I INPUT -d 224.0.0.0/4 -j ACCEPT
iptables -I FORWARD -d 224.0.0.0/4 -j ACCEPT

Vous devrez peut-être également ajouter l'itinéraire pour le trafic de multidiffusion:

route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 

Modifiez le TTL de l'expéditeur de multidiffusion:

iptables -t mangle -A OUTPUT -d <group> -j TTL --ttl-set 128
Where group is the multicast group address of the stream you want to change the TTL of.

Vous pouvez également démarrer proxy multicast

PS:

Vous devriez essayer (si cela ne vous aide pas) de démarrer le conteneur Docker avec l'option --net = none et d'utiliser la tuyauterie avec la commande follow:

pipework docker0 -i eth0 CONTAINER_ID IP_ADDRESS/IP_MASK@DEFAULT_ROUTE_IP 

qui crée l'interface eth0 à l'intérieur du conteneur avec l'indicateur IFF_MULTICAST et l'adresse IP définie.

5
Valeriy Solovyov