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

时间:2017-07-02 23:58:35

标签: openvswitch

我有以下设置

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

其中1, 2, 3, 4是一个服务器中的OVS端口(所有都是名为ovs1的网桥端口),源s和目标t是另外两个服务器(已连接)在LAN上)。比如,数据包正在流过2(来自1),在某些时候,我希望通过端口1转发所有新的端口3流,同时保持旧流量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网络来实现这种“平滑”的链接切换。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我认为OVS gaurantees MBB不支持备份路径。理想情况下,您可以安装两个具有不同优先级的类似流,并通过更改优先级切换到您想要的流。在这种情况下,您可能不会破坏现有的流量。

答案 1 :(得分:0)

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

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

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

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