2016-05-13 103 views
7

我們有一個dockerized服務器應用程序,它通過偵聽端口6969上的多播數據包來自動發現網絡上的物理設備。因此,我們需要我們的docker容器能夠從外部設備接收這些數據包主機,通過主機,並進入容器。我見過somesimilarissues並完成alotofreading但我仍然無法讓服務器響應這些組播數據包。Docker接收多播流量

我坐在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

任何幫助或見解,你可以提供將不勝感激。

+0

@ValeriySolovyov的答案是否適合您? – blz

回答

2

嘗試在你的網卡啓用多巨災:

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. 

你也可以sta RT multicast proxy

PS:

你應該嘗試(如果上面沒有幫助)與--net = none選項啓動泊塢窗容器和管道使用其後續命令:

pipework docker0 -i eth0 CONTAINER_ID IP_ADDRESS/[email protected]_ROUTE_IP 

它創建容器中的eth0接口,帶有IFF_MULTICAST標誌和已定義的IP地址。