我的环境是一个带有 OpenWRT 的路由器、一台通过跳线连接到路由器的笔记本电脑以及在路由器的该端口上配置了 VID 5 的未标记 VLAN,以及通过 Wi-Fi 连接到路由器的 MacBook M1 Pro。
在 MacBook 上,我通过指定 en0 (AirPort) 作为父接口创建了一个 VLAN 接口,然后使用带有 hvf 加速器的 QEMU 或带有 VZ 的 lima/UTM 创建了一个虚拟机,我观察到一个奇怪的情况:使用 arping,有时会收到来自笔记本电脑的数据包到达与 macbook 上的 VLAN 接口连接的虚拟机,但虚拟机上运行的 arping 只发送请求,但没有收到笔记本电脑的回复。如果我将 IP 地址分配给 macOS 中的 VLAN 接口,则数据包可以通过任一协议传输,不会出现任何问题。问题是将数据包传送到虚拟机。
使用笔记本电脑上的 tcpdump,我可以看到它回复 arp 请求,我还可以在路由器上看到回复通过 Wi-Fi 接口传递的 arp 请求,但我在 macbook 上 en0 上的 tcpdump 中看不到它们,这也很奇怪。但正如我之前所写,如果我在 MacBook 的 VLAN 接口上分配来自同一网络的地址,则任何数据包都会在笔记本电脑和 MacBook 之间传递。
- 笔记本电脑:192.168.24.50
- MacBook:192.168.24.20(vlan5接口)。
- 虚拟机:192.168.24.10
对于lima-vm,我在桥接模式下使用socket_vmnet 。对于 QEMU,我使用vmnet-bridged。
➜ ~ ifconfig vlan5
vlan5: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1496
options=6063<RXCSUM,TXCSUM,TSO4,TSO6,PARTIAL_CSUM,ZEROINVERT_CSUM>
ether f0:2f:4b:xx:xx:xx
inet 192.168.24.20 netmask 0xffffff00 broadcast 192.168.24.255
vlan: 5 parent interface: en0
media: autoselect
status: active
➜ ~ ping 192.168.24.50 -c2
PING 192.168.24.50 (192.168.24.50): 56 data bytes
64 bytes from 192.168.24.50: icmp_seq=0 ttl=64 time=5.241 ms
64 bytes from 192.168.24.50: icmp_seq=1 ttl=64 time=5.429 ms
--- 192.168.24.50 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 5.241/5.335/5.429/0.094 ms
➜ ~ sudo arping -c 5 -i vlan5 192.168.24.50
ARPING 192.168.24.50
60 bytes from 10:e7:c6:xx:xx:xx (192.168.24.50): index=0 time=6.061 msec
60 bytes from 10:e7:c6:xx:xx:xx (192.168.24.50): index=1 time=6.084 msec
60 bytes from 10:e7:c6:xx:xx:xx (192.168.24.50): index=2 time=5.945 msec
60 bytes from 10:e7:c6:xx:xx:xx (192.168.24.50): index=3 time=3.092 msec
60 bytes from 10:e7:c6:xx:xx:xx (192.168.24.50): index=4 time=3.848 msec
--- 192.168.24.50 statistics ---
5 packets transmitted, 5 packets received, 0% unanswered (0 extra)
rtt min/avg/max/std-dev = 3.092/5.006/6.084/1.278 ms
➜ ~ ifconfig bridge100
bridge100: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1496
options=3<RXCSUM,TXCSUM>
ether f2:2f:4b:xx:xx:xx
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x0
member: vlan5 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 22 priority 0 path cost 0
member: vmenet0 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 23 priority 0 path cost 0
Address cache:
10:e7:c6:xx:xx:xx Vlan1 vlan5 326 flags=0<>
52:55:55:ae:36:b4 Vlan1 vmenet0 1172 flags=0<>
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
[root@VM1 ~]# arping 192.168.24.50 -c5
ARPING 192.168.24.50 from 192.168.24.10 lima0
Sent 5 probes (5 broadcast(s))
Received 0 response(s)
[root@VM1 ~]#
[root@laptop ~]# arping 192.168.24.10 -c5
ARPING 192.168.24.10 from 192.168.24.50 eth0
Unicast reply from 192.168.24.10 [52:55:55:AE:36:B4] 2.492ms
Unicast reply from 192.168.24.10 [52:55:55:AE:36:B4] 1.791ms
Unicast reply from 192.168.24.10 [52:55:55:AE:36:B4] 3.059ms
Sent 5 probes (1 broadcast(s))
Received 3 response(s)
[root@laptop ~]#
我还在笔记本电脑上进行了测试,在 VirtualBox 中我创建了具有桥接模式接口的虚拟机,并在虚拟机内部创建了一个 VLAN 接口。我将笔记本电脑切换到 Wi-Fi,并尝试 ping MacBook 的虚拟机。数据包正在离开笔记本电脑虚拟机,但不会到达 MacBook 虚拟机。
因此,它与操作系统无关,问题是当虚拟机连接到 Wi-Fi 接口时,数据包不会发送到虚拟机本身。
我想弄清楚这一点。这对我来说并不是很透明。VLAN 标头只有 4 个字节,那么以桥接模式在 VM 接口和 Wi-Fi 接口之间传递该帧有什么问题呢?但是,如果您在操作系统中将 IP 地址分配给 VLAN 接口,并且该接口具有 Wi-Fi 接口作为其父接口,则一切都会正常工作。
UPD:感谢 AB 的评论,他们帮助我了解了是什么阻止了虚拟机接收数据包。
您可以在本文中找到此问题的解决方案及其确切原因。
简短回答:要添加 MAC NAT,请运行命令 -
sudo ifconfig bridge10X macnat vlanX