连接到同一网桥的虚拟机无法互相 ping 通

连接到同一网桥的虚拟机无法互相 ping 通

我现在尝试直接通过 qemu 托管两个虚拟机,而不使用 libvirt 等任何工具。

我确实为每个人设置了桥接/分接接口,例如

ip link add br0 type bridge
ip addr add 192.168.122.1/24 dev br0
ip link set br0 up

ip tuntap add mode tap tap0
ip link set tap0 master br0
ip link set tap0 up             // tap1 as well

并通过命令启动虚拟机:

qemu-system-x86_64 -enable-kvm -m 1G \
-cdrom archlinux-2018.12.01-x86_64.iso \
-drive file=vm.raw,format=raw,id=hd0 \
-device virtio-net,netdev=network0 \
-netdev tap,id=network0,ifname=tap0,script=no,downscript=no \
-device virtio-net,netdev=network1 \
-netdev user,id=network1 \

请注意,我故意分配了两个网卡。该user网络确保虚拟机可以访问 Internet,并且我希望分接网络可用作子网。我在控制台中将手动 IP 分配给虚拟机的网络接口。

通过此设置,主机可以 ping 通每个虚拟机,每个虚拟机也可以 ping 通主机,但 VM0 无法 ping 通 VM1,反之亦然。我尝试使用 iptable 规则,例如

iptables -A FORWARD -i br0 -o br0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE

但仍然是徒劳。

澄清1.(对sourcejedi)

正如你所看到的,这个启动命令是 Arch Linux 的 liveCD。这样直接启动就进入shell了。默认情况下,tap 的接口没有 IP 或路由设置。

qemu 是 3.0.0。主机是Arch Linux。

澄清2。

结果发现,两者的默认MAC都是52:54:00:12:34:56,所以他们无法建立任何通信。

答案1

理论上,一旦两个分路器连接到虚拟机,并且它们都通过正确的 IP 设置(DHCP 或手动)连接到主机上的网桥,它们应该能够相互 ping 通,而无需进行 iptable 调整。

这个问题源于这样一个事实:我通过一个过于简化的命令启动每个虚拟机,该命令为所有网络设备分配相同的 MAC 地址。也就是说,人们应该始终为她的虚拟集群分配不同的 MAC 地址,例如对原始命令的简单扩充:

-device virtio-net,netdev=network0,mac=52:54:01:12:34:56

最后,感谢 Sourcejedi 的所有提示!

相关内容