设置如下:我们有一个硬件(服务器),它向客户(或者“外部世界”,如果你愿意的话)提供服务。在内部,服务和功能分布在多个虚拟机(具有不同的角色)上。我们使用 kvm 进行虚拟化,使用 libvirt 进行管理。硬件有两个 NIC,它们都通过“单根 I/O 虚拟化”(Intel VT-D / AMD IOMMU)转发到其中一个虚拟机(称为 gateway-vm)。
我们在底层主机操作系统中使用 openvswitch 在所有虚拟机和主机之间创建一个具有私有地址的内部网络。这是因为我们在将网桥绑定到虚拟接口时遇到了问题。(与将其绑定到物理接口相反,操作/命令被接受,但网络通信不再可能)
这很好。网关虚拟机中的代理服务器向外界提供所有内部服务。很好,这很有效。
我们甚至有几台这样的机器。
为了实现冗余,我们希望其中一个内部虚拟机(当然不是网关虚拟机,我们将其称为数据库虚拟机)与另一个硬件的数据库虚拟机通信。因此,我们确保内部私有地址不会发生冲突,例如 10.10.1.5 和 10.10.2.5(每个 /24)。
我们的方法是在两个网关机器之间建立带有 ipsec 的 gre 隧道,这确实有效。10.10.1.1 可以 ping 10.10.2.1,反之亦然。
现在,我们陷入让一个硬件的数据库虚拟机与另一个硬件的另一个网关虚拟机通信/ping 的困境,反之亦然,最终让两个数据库虚拟机相互通信。
实现此目标的正确方法是什么?我们不确定是否需要在任一网关中使用 ip_forwarding,以及路由应该是什么样子。还是应该全部是一个没有路由的大子网?
我们目前正在使用 ovs v1.7.1、内核 3.2.6、libvirt v0.10.2、QEMU 1.1.1
答案1
因为您在网关虚拟机上运行代理服务器,所以大概它们没有在其上进行 IP 转发。
您可以在网关虚拟机上启用 ip 转发并路由流量,如下所示:数据库虚拟机 1 <-> 网关虚拟机 1 <-ipsec/gre-> 网关虚拟机 2 <-> 数据库虚拟机 2
您需要小心,不要启用流量转发来绕过代理服务器进行传出流量......不太可能,但在设置时需要注意一些事情。
正确设置路由可能有点棘手。如果您确实在数据库服务器所在的网络上使用 /16,那么您可能需要调整一些内容,因为 10.10.1.5 和 10.10.2.5 位于同一个 /16 中,这将使路由设置变得困难。也许如果您只是将网络掩码移至 /24,使它们位于不同的 IP 网络中,这将使路由更容易确定?
我在网络世界中有点怪异,因为我喜欢将路由决策推到更远的边缘,有时甚至推到主机中,所以我要说的是,你可能想看看运行 OSPF 的 quagga 之类的东西,也许可以简化其中的一些操作。也许你不会觉得它更简单,我不确定。
总体思路是,gateway-vm1 需要在其路由表中为 gateway-vm2<->database-vm2 链路设置路由,下一跳通过 IPSec/GRE 隧道到达 gateway-vm2。同样,gateway-vm2 需要在其路由表中为 gateway-vm1<->database-vm1 链路设置路由,下一跳通过 IPSec/GRE 隧道到达 gateway-vm1。
如果您使用 IPSec/GRE 互连...一个大子网并不完全不可能(理论上您可以在虚拟交换机和 GRE 链路之间的网关虚拟机中桥接),但我当然不想以这种方式进行设置。
如果我处于您的位置,我可能会重新考虑物理 NIC 的分配,并使用一个用于硬件之间的互连,这样您就不必使用 IPSec/GRE 进行交叉......这样,您可以在每个硬件上运行一个 ovs 实例,将交叉 NIC 连接到它并将其用作私有互连,然后数据库虚拟机可以通过这个私有互连“直接”相互通信。