我的环境是一个带有 OpenWRT 的路由器、一台通过跳线连接到路由器的笔记本电脑以及在路由器的该端口上配置了 VID 5 的未标记 VLAN,以及一台通过 Wi-Fi 连接到路由器的 MacBook M1 Pro。
在 MacBook 上,我通过指定 en0 (AirPort) 作为父接口创建了一个 VLAN 接口,然后使用带有 hvf 加速器的 QEMU 或带有 VZ 的 lima/UTM 创建了一个 VM,我观察到一个奇怪的情况:使用 arping,来自笔记本电脑的数据包有时会到达连接到 MacBook 上的 VLAN 接口的 VM,但 VM 上运行的 arping 只发送请求,而不会收到笔记本电脑的回复。如果我在 macOS 中为 VLAN 接口分配一个 IP 地址,数据包可以通过任一协议传输,没有任何问题。问题在于将数据包传送到虚拟机。
使用笔记本电脑上的 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-vmsocket_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 中,我创建了具有桥接模式接口的 VM,并在 VM 内部创建了 VLAN 接口。我将笔记本电脑切换到 Wi-Fi 并尝试 ping MacBook 的 VM。数据包正在离开笔记本电脑 VM,但没有进入 MacBook VM。
所以它不依赖于操作系统,问题是当它连接到 Wi-Fi 接口时,数据包不会被发送到虚拟机本身。
我想弄清楚这一点。这对我来说并不透明。VLAN 标头只有 4 个字节,因此在桥接模式下在 VM 接口和 Wi-Fi 接口之间传递该帧有什么问题?但是,如果您在操作系统中为 VLAN 接口分配 IP 地址,并且它以 Wi-Fi 接口作为其父接口,则一切都会正常工作。
UPD:感谢 AB 的评论,它们帮助我了解了是什么阻止了 VM 接收数据包。