将新流转发到另一个 OVS 端口



我有以下设置

+---2---+
s---1  OVS  4---t
+---3---+

其中1, 2, 3, 4是一台服务器中的 OVS 端口(所有端口都是称为ovs1的网桥端口(,源s和目标t是另外两台服务器(通过 LAN 连接(。假设,数据包流经2(从1(,在某些时候,我想通过端口3转发端口1的所有新流,而旧流保留在2上(直到终止(。

我可以用这个 OVS 命令突然做到这一点

ovs-ofctl del-flows ovs1 in_port=1
ovs-ofctl del-flows ovs1 in_port=2
ovs-ofctl add-flow ovs1 in_port=1,action=output:3
ovs-ofctl add-flow ovs1 in_port=3,action=output:1

这迫使所有流量都通过3而不是2.但是我需要旧流量保留在2上,只有新流量通过3.这在 OVS 中可能吗?

理想情况下,我想用 OVS。如果这是不可能的,我可以摆脱它并使用 Linux 网络来实现这种"平滑"的链接切换。

任何帮助,不胜感激。

我不认为 OVS 为备份路径提供 MBB。理想情况下,您可以做的是安装 2 个具有不同优先级的类似流,并通过更改优先级切换到您想要的流。在这种情况下,您可能不会中断现有的流量。

在与我的朋友交谈后,我得到了这个问题的几个解决方案(关闭 StackOverflow(。我分享两种不同的解决方案,供将来参考。

第一个基于连接跟踪(如@pchaigno和@karthik-prasad所建议的那样(。我认为这是对解决方案的更详细的描述(他们想到了(。因此,我们安装了一个默认规则来将所有连接转发到端口2并为2启用连接跟踪。现在,在将流重定向到3之前,我们安装完整的 IP 元组规则(匹配 src、dst、端口等(以将现有流转发到端口2。换句话说,如果在(端口3(故障转移之前端口2有 100 个 conntrack 条目,我们将安装 100 个特定规则将数据包转发到端口2。这将确保所有现有流将继续通过端口2

要将新流转发到端口3,我们覆盖从端口2到端口3的默认转发规则。当我们这样做时,现有流将与更具体的规则(之前建立(匹配,并转到端口2.新流将与通配符规则匹配并转到端口3。请注意,即使这样,开关也不会是原子的。迁移到3时,我们可能会丢失一些流(取决于我们如何安装更新的规则(。

解决这个问题的另一种方法,也许更优雅,是利用OpenFlow控制器。我们将OpenFlow控制器插入交换机并跟踪端口2中的流量,并在数据包传入事件上安装端口2转发规则(每当新流量到达时(。当我们想要故障转移时,我们会更改 OpenFlow 控制器行为,以开始将新流转发到端口3(每当发生新的数据包传入事件时(。这会将旧流保留在端口2中。例如,您可以使用 Ryu 控制器并编写 Ryu 应用程序来响应建议的数据包传入事件。

最新更新