如何要求所有网络活动在到达主机之前通过 KVM 客户防火墙?

如何要求所有网络活动在到达主机之前通过 KVM 客户防火墙?

我接触到的大多数信息都倾向于使用桥接连接来设置 KVM 防火墙。

据我所知,如果网络流量无需先通过防火墙即可到达主机,则存在安全风险。

我已看到将主 NIC(例如eth0)设置为虚拟机 NIC,但是这是否会排除主机访问eth0

我想到另一个选项是 NIC 的 PCI 直通,但是我在使用该方法时遇到了问题。

还有其他方法可以要求主机流量先通过防火墙吗?您建议使用哪种方法?

答案1

第一个想法是将用于添加虚拟机网络访问的接口与用于控制主机的接口区分开来。通常,第三组接口用于访问某种网络共享存储上的虚拟机映像。因此,理想情况下,您有 6 个接口:4 个千兆以太网接口和 2 个十千兆以太网接口。

第二个想法是,您可以为主机和虚拟机使用不同的 802.1q VLAN。我构建了一个网络,其中虚拟机位于三个不同的 VLAN 中,有时一个虚拟机可以参与多个 VLAN(通过创建多个虚拟网卡并将它们与主机上的几个不同 VLAN 桥接)

注意,服务器硬件通常有一个 BMC,用于带外控制主机。本质上,这是一台可以访问主机传感器的小型计算机,它可以看到数值(温度、风扇转速)、像按下按钮一样打开/关闭/重置主机,甚至具有 IP KVM 功能等,并且它有自己的网络地址。它通常还实现 IPMI 协议。它通常与 LAN1 共享(即像一个小型交换机,不是真正的交换机 - 主机和 BMC 无法通信,但它们都与外部设备通信)或独立的以太网插孔,专门路由到 BMC。刀片系统每个机箱可以有一个或两个(冗余)BMC,而不是每个刀片服务器都有。

安全设置如下:

bond0是由(eth0,eth1)通过LACP组合而成的,在主机上有IP地址,用于控制主机。

Bond1 由 LACP 组合而成(eth2、eth3)。它与 VLAN 分开,即主机具有 Bond1.10、Bond1.552 虚拟子接口等。已创建网桥:br10 桥接 Bond1.10 和参与 Vlan 10 的 VM 的所有 VM 主机端接口,br552 桥接 Bond1.552 和参与 Vlan 522 的所有 VM 主机端接口,等等。这两个接口都没有 IP 地址,因此 VM 无法与主机通信。

bond2 是 (eth4, eth5) 的组合,用于通过 iSCSI、CEPH 访问虚拟机磁盘映像,同步 DRBD 等。它在主机中有一个 IP,但连接到完全独立的存储网络,具有特殊要求。

建议将 bond0 和 bond1 物理上分开,因为虚拟机不仅无法与主机通信,甚至无法使主机的控制网络饱和。例如,该网络用于在实时迁移到其他主机时传输虚拟机的内存内容,并且没有虚拟机可以饱和此过程的性能。

即使您只构建一个小型系统,该系统只有一个物理接口来托管五台虚拟机,并且必须结合 bond0 和 bond1 的功能,您也可以只在物理接口(可作为默认/本机 VLAN 访问)上设置 IP 地址,并在参与桥接的子接口上设置 VM 主机端适配器,所有子接口均带标签。但虚拟机仍然无法直接访问主机,智能 L2 交换机和单独的防火墙设备或 L3 交换机可以单独进行 VLAN 间路由和流量过滤。

答案2

由于 Linux 桥接器会在主机上创建相应的网络接口(例如br0),因此我认为没有办法让桥接器完全无法从主机操作系统访问。在防火墙虚拟机运行时,brctl show会告诉您接口eth0vnet0已连接到它,但它实际上就像一个-port 交换机:一个端口通向eth0,一个端口通向vnet0(虚拟机),一个端口通向br0主机上的接口。

你可以设置一些ebtables规则来阻止所有进出主机br0接口的帧。这可能是最好的方法,但我对 ebtables 了解不够多,无法提供任何有关如何执行此操作的详细信息。

另一个选项是,不配置桥接接口上的任何 IP 地址,这样可以防止普通应用程序通过它进行通信。Wireshark 等应用程序仍可利用 root 权限访问它(这可能会派上用场)。

在基于 Debian 的系统(例如 Ubuntu)中,您可以将以下内容放入/etc/network/interfaces

auto br0
iface br0 inet manual
  bridge_ports eth0
  bridge_stp off

“手动”的意思是“启动接口时不要分配任何地址”;它适用于稍后由其他东西分配地址的设置,但当您根本不想要地址时它也可以工作。

唯一的例外是 IPv6 链路本地地址,它由内核自动分配,而不是由发行版的网络设置脚本分配,因此即使使用“手动”设置,您也会获得一个。您可以通过在接口上完全禁用 IPv6 来避免这种情况。创建一个文件并将/etc/sysctl.d以下内容放入其中:

net.ipv6.conf.br0.disable_ipv6=1

(如果您也可以完全禁用接口上的 IPv4 那就太好了,但没有相应的选项。)

相关内容