libvirt TCP 隧道网络仅适用于 2 个虚拟机

libvirt TCP 隧道网络仅适用于 2 个虚拟机

我正在使用 libvirt(qemu 驱动程序)设置一些虚拟机。其中一个虚拟机用作网关,因此配置了两个网络接口。一个接口桥接到我的真实 LAN,另一个使用 TCP 隧道(服务器模式):

<!-- External interface - i.e. facing the Internet -->
<interface type='direct' trustGuestRxFilters='no'>
  <source dev='eth0' mode='vepa'/>
</interface>

<!-- Virtual network -->
<interface type='server'>
  <source address='0.0.0.0' port='5558'/>
</interface>

然后,我还有另外两台虚拟机(分别称为 test_1 和 test_2),它们实际上完全相同(当然,UUID、MAC 和主机名除外)。它们只有使用虚拟 TCP 隧道网络的网络接口:

<interface type='client'>
  <source address='127.0.0.1' port='5558'/>
</interface>

现在网关虚拟机应该向虚拟网络上的所有虚拟机分发 IP 地址 - 但它只向首先启动的测试虚拟机分发 IP 地址。此外,如果两个虚拟机都在运行,并且我关闭了当前具有 IP 的虚拟机,则另一个虚拟机将获得 IP。

我不认为这是 DHCP 的问题,因为我可以看到第二台测试虚拟机甚至没有向网关发送 DHCP 请求。在第二台虚拟机上设置静态 IP 也无济于事。

毕竟,看起来只能有一个虚拟机作为虚拟网络的客户端,而另一个虚拟机根本没有连接到虚拟网络。但检查主机上的连接后,我可以看到测试虚拟机的两个 qemu 进程都打开了通往网关主机进程的 TCP 隧道。

我真的一无所知。有什么建议可以告诉我哪里出了问题或者我下一步该怎么做吗?

编辑:看看主机系统上的实际连接很有趣:

qemu-syst 2900 libvirt-qemu   12u  IPv4  22574      0t0  TCP *:5558 (LISTEN)
qemu-syst 2900 libvirt-qemu   17u  IPv4  22639      0t0  TCP localhost:5558->localhost:38714 (ESTABLISHED)
qemu-syst 2946 libvirt-qemu   12u  IPv4  21820      0t0  TCP localhost:38714->localhost:5558 (ESTABLISHED)
qemu-syst 2967 libvirt-qemu   12u  IPv4  21835      0t0  TCP localhost:38717->localhost:5558 (ESTABLISHED)

看起来服务器(进程 2900)只接受来自第一个虚拟机(进程 2949)的连接

答案1

在研究了 libvirt 和 qemu 的代码后,我发现这是预期的行为(至少 qemu 是这样的)。libvirt 将 TCP 隧道选项传递给 qemu 的 -net 开关。单客户端行为似乎是由这个补丁 [1] 引入的。此外,qemu 的代码显然一次只接受一个客户端。

尽管如此,libvirt 的文档听起来好像可能有多个客户端。因此,开发人员必须实现该功能,或者必须调整文档。

[1]https://libvirt.org/formatdomain.html#elementsNICSTCP

相关内容