openvswitch:使用gre / ipsec连接两台不同机器上的两个虚拟专用networking

这里是设置:我们有一个硬件(服务器),提供服务给客户(或“外部世界”,如果你愿意的话)。 在内部,服务和function分布在多个虚拟机(不同angular色)上。 我们使用kvm来pipe理虚拟化和libvirt。 硬件有两个NIC,通过“单根I / O虚拟化”(Intel VT-D / AMD IOMMU)的方式被转发到其中一个虚拟机(称为gateway-vm)。

我们在底层主机操作系统中使用openvswitch来创build一个在所有虚拟机和主机之间都有私有地址的内部networking。 这是因为我们遇到了将网桥绑定到虚拟接口的问题。 (而不是绑定到一个物理接口,操作/命令被接受,但networking通信不可能了)
这工作正常。 gateway-vm中的代理服务器向外界提供所有的内部服务。 好的,这是有效的。

我们甚至有几台这样的机器。

为了冗余,我们希望内部虚拟机(不是gateway-vm,当然,我们称之为database-vm)与另一个硬件的数据库虚拟机进行通信。 因此,我们确保内部私有地址不会发生冲突,例如10.10.1.5和10.10.2.5(每个/ 24)。
我们的方法是在两台网关机之间build立一个ipsec的gre隧道,这已经可以工作了。 10.10.1.1可以ping 10.10.2.1,反之亦然。

现在我们不得不让一个硬件的数据库-vm与另一个硬件的另一个gateway-vm进行通话/ ping,反之亦然,并最终让两个数据库-vm相互通信。

什么是适当的方法来实现这一目标? 我们不确定我们是否需要在任何一个网关中使用ip_forwarding,以及路由应该如何。 还是应该都是一个没有路由的大型子网?

我们目前正在使用ovs v1.7.1,kernel 3.2.6,libvirt v0.10.2,QEMU 1.1.1

因为你在gateway-vm(s)上运行一个代理服务器,可能他们没有对它们进行ip-forwarding。

您可以在您的gateway-vm(s)上启用ip-forwarding并路由stream量,如:database-vm1 < – > gateway-vm1 <-ipsec / gre-> gateway-vm2 < – > database-vm2

你应该要小心,你不要启用stream量转发绕过你的代理服务器的传出stream量…可能不太可能,但有一点要注意,因为你设置了。

获得路由的权利可能有点棘手。 如果你真的在数据库服务器所在的networking上使用/ 16s,那么你可能需要调整一些东西,因为10.10.1.5和10.10.2.5是相同的/ 16,这将使得路由设置困难。 也许如果你只是把你的networking掩码改为/ 24,这样他们就可以在不同的IPnetworking中,这样就可以使路由更容易理解了。

在networking世界里,我有点奇怪,因为我喜欢把路由决策推到更远的地方,甚至有时候把它们放到主机中去,所以我会提到你可能想看看类似于运行quagga的东西OSPF或许可以简化这一些。 也许你不会发现它更简单,我不确定。

总的想法是,gateway-vm1需要在其路由表中为gateway-vm2 < – > database-vm2链路build立一条路由,并通过IPSec / GRE隧道向gateway-vm2下一跳。 同样,gateway-vm2需要在其路由表中为gateway-vm1 < – > database-vm1链接创build路由,并通过IPSec / GRE隧道向gateway-vm1下一个跃点。

如果你正在使用IPSec / GRE互连…一个大的子网不是严格的表外(理论上你可以在虚拟交换机和GRE链路之间的网关-vms中桥接),但是我当然不希望这样设置它。

如果我在你的位置上,我可能会重新考虑分配物理网卡,并使用硬件之间的互连,所以你不必为交叉而使用IPSec / GRE …就可以运行每个硬件上的ovs实例,将交叉网卡连接到它并将其用作专用互连,然后数据库-vms可以在该专用互连上“直接”互相通话。