【问题标题】:Docker receiving multicast trafficDocker 接收多播流量
【发布时间】:2016-09-09 22:08:29
【问题描述】:

我们有一个 dockerized 服务器应用程序,它通过侦听端口 6969 上的多播数据包来自动发现网络上的物理设备。所以我们需要我们的 docker 容器能够接收来自主机外部设备的这些数据包,通过主机,并进入容器。我见过some similar issues 并完成a lot of reading 但我仍然无法让服务器响应这些多播数据包。

我坐在 Wireshark 上监视网络流量,但我不是专家。我知道 Docker 创建了一个MASQUERADE 地址以使流量看起来像是来自 Docker 网关,所以当我观看veth 时,我看到的大多是172.17.0.1172.17.0.2 之间的对话,尽管我的服务器无法检索任何内容有关网络上设备的信息。 (如果我在 docker 之外运行,当然没有问题。)

我不能使用--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

您可以提供的任何帮助或见解将不胜感激。

【问题讨论】:

    标签: networking docker wireshark multicast


    【解决方案1】:

    尝试在您的网卡上启用多播:

    ip link set eth0 multicast on
    

    echo 1 >/proc/sys/net/ipv4/ip_forward开启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 docker0 -i eth0 CONTAINER_ID IP_ADDRESS/IP_MASK@DEFAULT_ROUTE_IP 
    

    在容器内创建带有 IFF_MULTICAST 标志和定义 IP 地址的 eth0 接口。

    【讨论】:

    • 无法在 sysctl 中(或直接在 proc 中)设置 mc_forwarding。见this answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2012-10-26
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多