我有以下设置
+---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网络来实现这种“平滑”的链接切换。
感谢任何帮助。
答案 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来响应建议的数据包输入事件。