在 KVM 主机中使用 iptables 进行虚拟网络

在 KVM 主机中使用 iptables 进行虚拟网络

我正在设计一款基于 Linux 的设备,并希望使用 KVM 作为虚拟化层。该系统有 3 个 VM 以非常特定的方式互连。我收到的 fag 数据包图如下所示...

       www
        |
+------ | ------------+
|       |             |
|      |A|            |
|       |             |
|       |             |
|      |B|-----|C|    |
|       |             |
+------ | ------------+
        |
       dbs

这基本上反映了数据流 - 前端是 Web 服务器,后端是后端服务器,侧面是辅助服务。由于互联网距离等原因,A 和 C 必须位于“独立”网络上。这对于系统的大部分来说没问题,但这意味着虚拟机 A 和 C 的所有管理流量都需要通过虚拟机 B 才能到达外部系统日志服务器或类似服务器。类似地,对于 ssh 访问,我们需要在 B 上进行端口转发之类的操作。虽然与应用程序流量相比,这种流量的量微乎其微,但感觉相当糟糕,尤其是因为使用 kickstart 或类似程序自动构建这些虚拟机,这意味着我们不能在 B 完成之前开始构建 A 或 C。

因此,我正在考虑用以下方法让一切变得更加混乱:

     www
      |
+---- | ----------------------+
|     |                       |
|     |       +-----------+   |
|     |       |           |   |
|    |A|-----|B|-----|C|  |   |
|     |       |       |   |   |
|     |       b       |   |   |
|     +-----a x c-----+   |   |
|             d           |   |
|             |           |   |
+------------ | --------- | --+
              |           |
             mgt         dbs

因此,应用程序的 AB 和 C 之间的数据流大致相同(但此处绘制为平面),并且我们为连接到另一个桥接器的每个 VM 添加第二个管理 nic,该桥接器在主机上也有一个接口(a、b 和 c)。然后在这些虚拟主机接口和外部世界 (d) 之间使用 iptables 和转发,以确保虽然所有机器都可以直接访问环境中较低的外部服务,但它们无法以某种方式相互访问,这意味着虚拟机 A 的入侵不会在更大程度上降低安全性。我可以在添加中使用 ebtables 和单个桥接器,但我认为由于 A 和 C 仍然在同一个子网上,它看起来太微妙了。

公平地说,管理图表上的东西看起来是什么样子,以及事物的实际技术可信度(因此是“分离”与分离)有很大关系!简单性也是一个巨大的激励因素,但代价是将所有额外的流量都通过第二台虚拟机,这让人感觉非常不舒服,而且在时间敏感的环境中,构建时间可能要增加 5 到 10 分钟

那么从本质上来说,我疯了吗?

谢谢

克里斯

答案1

不,不是疯子。但我确实认为你把这个问题说得比实际更难。我读了你的问题好几遍,但仍然有几件事我不明白。机器 C 实际上做什么?你为什么需要它在那里?机器 A 和 B 做什么?

无论如何,如果我按照您的第一个图表操作,那么您只需要应用简单的 IP 路由就可以了。如果机器 C 与 B 形成一个单独的子网(以便与其他子网分开),那么为了到达它,必须按如下方式设置路由:

  • 在数据库上:通过 B 路由所有流量(这是默认网关,它知道如何路由
  • 流量到 C,因为它是直接连接的)。
  • 在 www 上:通过 A 路由 C 的所有流量(仅当 A 不是默认网关时才需要)
  • 在 A 上:通过 B 路由 C 的所有流量(仅当 B 不是默认网关时才需要)
  • 在 C 上将 B 设置为默认网关。

一旦路由到位,您就可以添加防火墙以确保流量只流向您希望它流向的地方。除非您对这类事情有经验,否则我建议先进行路由,然后再添加防火墙(一步一步,这样您就始终知道是什么破坏了它。因为您会破坏它)。

相关内容