我们有一个dockerized服务器应用程序,它通过在端口6969上侦听多播数据包来自动发现网络上的物理设备。所以我们需要我们的docker容器能够从主机外部的设备接收这些数据包,通过主机和容器。我见过some similar issues并完成a lot of reading但我仍然无法获得服务器响应这些组播数据包。
我坐在Wireshark上观看网络流量,但我不是专家。我知道Docker会创建一个MASQUERADE
地址,以使流量看起来像来自Docker网关,所以当我看到veth
时,我发现172.17.0.1
和172.17.0.2
之间的谈话主要是虽然我的服务器无法检索有关网络上设备的任何信息。 (如果我在码头工人外面跑,我当然没有问题。)
我无法使用--net=host
,因为与其他人一样,我们会使用--link
功能。我尝试了以下变化......
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
(这个我曾经发誓曾经工作一次,但现在却没有?)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
非常感谢您提供的任何帮助或见解。
答案 0 :(得分:4)
尝试在你的网上启用multicat:
ip link set eth0 multicast on
echo 1 >/proc/sys/net/ipv4/ip_forwarding
打开IP转发
您需要明确设置或至少检查它是否在相关接口上启用。
net.ipv4.conf.all.mc_forwarding = 1
net.ipv4.conf.eth0.rp_filter=0
允许多播流量:
iptables -I INPUT -d 224.0.0.0/4 -j ACCEPT
iptables -I FORWARD -d 224.0.0.0/4 -j ACCEPT
此外,您可能需要添加多播流量路由:
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
更改多播发送方的TTL:
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.
您也可以multicast proxy
开始PS:
您应该尝试(如果上面没有帮助)使用--net = none选项启动docker容器并使用pipework with follow命令:
pipework docker0 -i eth0 CONTAINER_ID IP_ADDRESS/IP_MASK@DEFAULT_ROUTE_IP
使用IFF_MULTICAST标志和已定义的IP地址在容器内创建eth0接口。