![在 KVM 主机中使用 iptables 进行虚拟网络](https://linux22.com/image/524129/%E5%9C%A8%20KVM%20%E4%B8%BB%E6%9C%BA%E4%B8%AD%E4%BD%BF%E7%94%A8%20iptables%20%E8%BF%9B%E8%A1%8C%E8%99%9A%E6%8B%9F%E7%BD%91%E7%BB%9C.png)
我正在设计一款基于 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 设置为默认网关。
一旦路由到位,您就可以添加防火墙以确保流量只流向您希望它流向的地方。除非您对这类事情有经验,否则我建议先进行路由,然后再添加防火墙(一步一步,这样您就始终知道是什么破坏了它。因为您会破坏它)。