通过 MacVTap 在 KVM 内部中继 802.1Q

通过 MacVTap 在 KVM 内部中继 802.1Q

我目前有以下设置,vm其中一个 KVM 客户机通过以桥接模式运行的 MacVTaphost连接到其中一个网络接口。host

               |---------------|
               |  ___________  |
switch ======= |  |   vm    |  |
               |  -----------  |
               |____ host _____|

在里面vm,我设置了几个 VLAN 接口以及一个未标记的接口:

3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:00:00:02 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
4: enp2s0.2@enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:00:00:02 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 0 maxmtu 65535 
    vlan protocol 802.1Q id 2 <REORDER_HDR> addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
...

host没有任何 VLAN 接口。

未标记的流量可以正常进出enp2s0,但标记的流量似乎在host和之间的某个地方被丢弃vm。我通过将一台机器插入 所代表的接口enp2s0、通过 创建新的标记接口、分配 IP 地址,然后 ping对应于我正在 ping 的标记 VLANiproute2的 IP 地址来测试这一点。vm

有趣的是,tcpdump在原始备份接口上运行host允许标记数据包通过,但仅限于tcpdump运行时。下图显示了这种奇怪的效果。(从上到下:host,正在运行tcpdump;机器插入enp2s0,正在 ping vm;,vm正在 ping 所述机器)

终端显示运行 tcpdump 对 VLAN 数据包的影响

将中继流量发送到 MacVTap 接口是否正确,还是我应该在主机上创建不同的接口并将它们传递到虚拟机中?我在主机或虚拟机上设置接口的方式是否存在某种问题?

答案1

将原始支持接口设置为host混杂模式似乎可以让一切始终正常工作(即ip link set dev enp2s0 promisc on& 在 中添加相应的行/etc/network/interfaces)。我不确定这是否是正确的做法,但由于没有其他可尝试的方法,所以对我来说,这很有效,直到出现更好的解决方案。

相关内容