我已经在 KVM 上设置了 pfSense 客户端,并尝试将标记和未标记的流量传递到 VM,原因显而易见。我的设置如下所示 -->
KVM 有 2 个 NIC(均为 virtio 类型):
- 第一个(对于未标记和标记的流量):macvtap(vepa)链接到 enp1s0f0。
- 第二个(仅适用于未标记的数据):macvtap(passthrough)链接到 enp1s0f3。
- Wire1(未标记 10 + 标记 vlan 28) ==> 主机的 enp1s0f0。
- Wire2(未标记)==> 主机的 enp1s0f3。
VM 配置了 2 个静态 IP,分别为 10.10.10.1 和 10.10.28.1,并在第二个 NIC 上配置了 DHCP。
现在,问题是:所有未标记的 VLAN 上的流量都可以顺利进出,但标记的流量却在某处完全丢失。例如,在 10.10.10.1 和同一 VLAN 上的其他主机之间 ping 通很容易,但 10.10.28.1 根本无法访问。
现在我尝试在 enp1s0f0 上使用 Wireshark 混杂模式,当 Wireshark 运行时,标记数据会通过。最后发现,混杂模式对传递标记数据有影响,但这不是永久的解决方案。
我读了很多 wiki 和博客,没有一个有针对类似要求的明确设置配置。我不确定我的设置哪里出了问题?
答案1
好吧,经过几次尝试,我终于找到了解决方法。我按照桥接方式操作,最后成功了。我有一种印象,这比让端口混杂要好得多,因为那会增加 CPU 开销。
如果有人按照这里的说明进行操作,请遵循设置桥接器的快速指南:创建桥接器 --> 将 eth 端口添加到桥接器 --> 为桥接器添加手动 IP --> 将桥接器接口设置为 KVM nic。
我仍会寻找 macvtap 方式。如果有人有任何见解,谢谢分享。
答案2
经过大量测试后,我发现 KVM 客户机中标记流量有以下有效选项:
桥
众所周知且有据可查的方法。与其他替代方案相比,会产生更多负载。
SRIOV
设置此设置需要相当多的步骤。这里将真实 NIC 硬件的一部分传递为虚函数给客户机。客户机使用本机驱动程序,并具有完整功能。包括使用操作系统本机功能进行标记/取消标记。
CPU、主板/BIOS 和 NIC 硬件必须支持此功能。此功能实际上在配备英特尔 i350-t4 的 hp z420 上运行。
苹果电脑
在客户机内部标记对我来说也不起作用。在主机上创建标记链接(例如 eth0.100),并通过以下方式将它们作为未标记链接传递:苹果电脑进入客人使得他们作为独立链接出现在那里。
这些链路的行为就像它们连接到支持 VLAN 的交换机上的访问端口一样。我可以在来宾中以未标记的方式使用它们,VM 主机执行标记/取消标记,并且网络会看到标记的流量。
结论
这三种方案都提供了接近原生 1 GBe 的性能。在我的系统上,Bridge 的 CPU 开销更大(1.3 核 vs 0.8 核),macvtap 和 sr-iov 的表现相当。
在主机上标记并通过 macvtap 传递会禁止客户机自由选择 VLAN,因此标记和物理端口路由保留在主机上。这是我目前连接客户机的方式。
然而,对于 10 GBe + IMHO,sr-iov 是唯一可行的方法。