访问 qemu 多播网络(从 Docker 容器)

访问 qemu 多播网络(从 Docker 容器)

QEMU允许通过在启动时指定,使用基于公共多播地址的虚拟网络来连接不同的虚拟机-netdev socket,mcast=230.0.0.1:1234

通过这种方式,我可以轻松连接多个虚拟机并即时加入新虚拟机。

是否可以加入该网络没有使用QEMU?特别是是否可以将 docker 容器连接到该网络?

答案1

假设您在单个主机而不是多个主机上运行虚拟机,则在 QEMU 虚拟机和其他虚拟机(或真实主机)之间建立网络的最简单方法是使用 Tap 设备而不是多播,然后桥接 Tap 设备,并将您的 Docker 容器接口(或任何您喜欢的接口)添加到桥接器中。

顺便说一句,您提供的链接中的语法和网络描述是过时的并会在某个阶段消失。特别是 QEMU VLAN 的概念将消失。在当前语法中,使用类似

-netdev tap,ifname=qemu0

然后(作为 root)

ip link add br_qemu type bridge
ip link set br_qemu up
ip link set qemu0 master br_qemu
ip link set qemu1 master br_qemu

如果您在启动虚拟机之前创建桥接,您还可以使用-netdev bridge,br=br_qemuQEMU 将分接接口添加到桥接。

如果您因为虚拟机运行在不同的物理主机上而特别需要多播,那么情况会更加复杂。第一步是弄清楚 QEMU 发送数据包的格式(这不是原始数据包,但我没有进一步查看),第二步是编写一个加入多播组的代理,并在该组之间转发和一个点击界面。

或者(但效率较低),您可以运行一个带有两个网卡(一个多播和一个分路)的专用 QEMU 虚拟机,该虚拟机配置为除了在它们之间转发之外不执行任何操作。

更好的替代方案是以不同的方式(隧道、物理 LAN 上的 VLAN(真正的 801.q VLAN,而不是 QEMU VLAN))实现不同物理主机之间的通信,并坚持使用 Tap 接口。

编辑

要将 VLAN 添加到您的 LAN,请eth0在主机中添加,只需执行以下操作

ip link add link eth0 name eth0.5 type vlan id 5

其中5是您选择的 VLAN 标记。接下来,将此接口添加到网桥中

ip link set eth0.5 master br_qemu

现在就可以走了。您可以将这两个命令放入用于启动虚拟机的脚本中。或者,将等效内容放入/etc/network/interfaces(谷歌或阅读联机帮助页以获取详细信息)。是的,它确实需要在主机中进行一些配置。

编辑

好的,我查看了 QEMU 发送的多播数据包的格式,它只是以太网帧。因此,您可以执行以下操作

socat UDP4-DATAGRAM:230.0.0.1:1234,sourceport=1234,ip-add-membership=230.0.0.1:10.0.0.2 TUN:10.2.3.1/24,tun-type=tap,iff-no-pi,iff-up

在具有 docker 容器的主机上,其中10.0.0.2是该主机相对于多播组的有效 IP 地址,例如 的 IP 地址eth0。这将为您提供一个tap(2 级)接口,您可以在其中向多播组发送以太网数据包并从多播组接收以太网数据包。现在您只需将它们桥接/路由到您的 Docker 容器即可。

socat如果您愿意并且认为它更有效,您也可以编写自己的短 C 程序等来代替。

相关内容