其他分享
首页 > 其他分享> > OVS 文档

OVS 文档

作者:互联网

OVS 文档

原文链接:ovs 2.15.0


1. 项目

2. 起步

3. 教程

3.1. ov水龙头教程

3.1.1. 创建 OVS

3.1.2. 建立 Faucet

3.1.3. 概述

3.2. OVS 高级特性

3.2.1. 起步

要开始,启动 ovs-sandbox。在它启动的交互式 shell 中,运行以下命令:

sudo ovs-vsctl add-br br0 -- set Bridge br0 fail-mode=secure

这条命令创建一个网桥 br0,并将 br0 设置为所谓的 fail-mode 模式。对我们来说,这只是意味着 OpenFlow 流表开始是空的。

注意:如果我们不这么做,那么流表将从执行“normal”动作的单个流开始。我们可以使用该特性来生成一个与我们当前正在构建的交换机行为相同的交换机,但是到目前为止,新网桥上只有一个端口,即“本地端口”br0。 我们需要添加 p1、p2、p3 和 p4。 shell for 循环是一种方法:

for i in 1 2 3 4; do
    ovs-vsctl add-port br0 p$i -- set Interface p$i ofport_request=$i
    ovs-ofctl mod-port br0 p$i up
done

除了增加一个端口,上述 ovs-vsctl 命令设置其 ofport_request 列以确保端口 p1 被分配了 OpenFlow 端口1,p2 被分配了 OpenFlow 端口2,依此类推。

注意:我们可以省略设置 ofport_request 并让 Open vSwitch 为我们选择端口号,但对于本教程的目的来说很方便,因为我们可以谈论 OpenFlow 端口 1 并知道它对应于 p1。

上面的 ovs-ofctl 命令使用 OpenFlow 请求启动模拟的接口,这些接口最初是关闭的。其效果类似于 ip link up,但是沙箱的接口对操作系统是不可见的,因此 ip 不会影响它们。我们没有配置任何与 vlan 或 MAC 学习相关的东西。这是因为我们将在流表中实现这些特性。要了解到目前为止我们为设置该场景所做的工作,可以运行类似 sudo ovs-vsctl showsudo ovs-ofctl show br0 的命令。

3.2.2. 实施表 0:准入控制

表0 是数据包进入交换机的位置。我们使用这个阶段来丢弃由于某种原因或其他原因无效的数据包。例如,具有多播源地址的数据包是无效的,因此我们可以添加一个流以在交换机的入口处将它们丢弃:

sudo ovs-ofctl add-flow br0 \
"table=0, dl_src=01:00:00:00:00:00/01:00:00:00:00:00, actions=drop"

交换机也不应该转发 IEEE 802.1D 生成树协议 (STP) 数据包,因此我们还可以添加一个流以使用保留的多播协议丢弃这些数据包和其他数据包:

sudo ovs-ofctl add-flow br0 \
"table=0, dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0, actions=drop"

我们可以添加流来删除其他协议,但这些协议演示了这种模式。我们还需要一个优先级低于默认值的流,这样那些不匹配我们上面添加的“drop”流的流就会进入 OpenFlow 表1中的管道阶段1:

sudo ovs-ofctl add-flow br0 "table=0, priority=0, actions=resubmit(,1)"

注意:“重新提交”操作是 OpenFlow 的 Open vSwitch 扩展。

3.2.3. 实施表 0

如果我们使用 Open vSwitch 来设置物理或虚拟交换机,那么我们自然会通过以一种或另一种方式通过它发送数据包来测试它,可能使用常见的网络测试工具(如 ping 和 tcpdump)或更专业的工具(如 Scapy)。这对于我们的模拟交换机来说很困难,因为它对操作系统不可见。

但是我们的模拟交换机有一些专门的测试工具。这些工具中最强大的是 ofproto/trace。给定一个交换机和一个流的规范,ofproto/trace 会一步一步地显示这样一个流在它通过交换机时将如何被处理。

示例 1

sudo ovs-appctl ofproto/trace br0 in_port=1,dl_dst=01:80:c2:00:00:05

输出如下所示:

Flow: in_port=1,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=01:80:c2:00:00:05,dl_type=0x0000

bridge("br0")
-------------
 0. dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0, priority 32768
    drop

Final flow: unchanged
Megaflow: recirc_id=0,eth,in_port=1,dl_src=00:00:00:00:00:00/01:00:00:00:00:00,dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0,dl_type=0x0000
Datapath actions: drop

第一行显示了正在跟踪的流,比命令行中指定的要详细一些。它主要是零,因为未指定的字段默认为零。

第二组行显示数据包通过网桥 br0 的行程。 我们在表 0 中看到字段匹配的 OpenFlow 流,以及它的优先级,然后是它的动作,每行一个。在这种情况下,我们看到这个具有保留多播目标地址的数据包与丢弃这些数据包的流相匹配。

最后一行总结了结果,这些结果这里不是很有趣。

示例 2

命令如下:

sudo ovs-appctl ofproto/trace br0 in_port=1,dl_dst=01:80:c2:00:00:10

输出如下:

Flow: in_port=1,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=01:80:c2:00:00:10,dl_type=0x0000

bridge("br0")
-------------
 0. priority 0
    resubmit(,1)
 1. No match.
    drop

Final flow: unchanged
Megaflow: recirc_id=0,eth,in_port=1,dl_src=00:00:00:00:00:00/01:00:00:00:00:00,dl_dst=01:80:c2:00:00:10/ff:ff:ff:ff:ff:f0,dl_type=0x0000
Datapath actions: drop

这次我们交给 ofproto/trace 的流与表 0 中的任何“丢弃”流都不匹配,因此它落入了低优先级的“重新提交”流。“重新提交”导致在 OpenFlow 表 1 中进行第二次查找,由以“1”开头的文本块描述。我们还没有向 OpenFlow 表 1 添加任何流,因此在第二次查找中实际上没有流匹配。因此,数据包实际上仍然被丢弃,这意味着外部可观察到的结果将与我们的第一个示例相同。

3.2.4. 实施表 1:VLAN 输入处理

3.2.5. 实施表 1

4. 操作指南

5. 深入探究

5.1. OVS

5.1.1. OVS 中的设计决策

5.1.1.1. 异步消息

5.1.1.2. VLAN 匹配

5.1.1.3. 多表支持

5.1.2. OVS 数据路径开发指南

5.1.3. 模糊测试

5.1.4. 集中控制集成指南

5.1.5. 将 OVS 移植到新的软件或硬件

5.1.6. OVS 中对 OpenFlow 的支持

5.1.7. 绑定

绑定允许两个或多个接口(其“成员”)共享网络流量。从高级角度来看,绑定接口就像一个端口,但它们具有多个网络设备的带宽,例如,两个1 GB物理接口就像一个2 GB接口。Bonds 也增加了健壮性:只要至少有一个成员是 up 的,bond 端口就不会下降。

5.1.8. Linux 上的 OVS 网络命名空间

Open vSwitch 在 Linux 上具有网络命名空间的基本支持。这允许 ovs-vswitchd 守护进程在将端口移动到另一个网络命名空间后继续跟踪状态和统计信息。

5.1.8.1. 如何工作

守护进程 ovs-vswitchd 在所谓的父网络命名空间上运行。它侦听来自所有网络命名空间 (netns) 的 netlink 事件消息,并在父级上带有标识符。每个 netlink 消息都包含网络命名空间标识符 (netnsid) 作为辅助数据,用于将事件与相应的端口进行匹配。

ovs-vswitchd 使用扩展的 OVS 内核 API 从特定端口获取当前 netnsid(存储在 struct netdev_linux 中)和统计信息。netnsid 会一直缓存在用户空间中,直到收到更改事件为止,例如,当端口移动到另一个网络命名空间时。

使用另一个扩展内核 API,守护进程从另一个命名空间中的端口获取端口信息,例如标志、MTU、MAC 地址和 ifindex。 上游内核 4.15 包括基本支持的必要更改。如果正在运行的内核不提供 API,守护进程会回退到之前的行为。

5.1.8.2. 限制

目前只能检索上一节中列出的信息。 大多数其他操作,例如查询 MII 或设置 MTU,在内核中缺少适当的 API,因此它们仍然不受支持。

在大多数需要将端口移动到另一个网络命名空间的用例中,应该使用 veth 对,因为它提供了一个更清晰、更健壮的解决方案,并且不会明显降低性能。

5.1.9. OVSDB 复制实现

5.1.10. DPDK 支持

5.1.11. 在 Open vSwitch 中跟踪数据包

6. 参考指南

7. Open vSwitch交流

8. 问答

标签:OVS,00,ovs,dl,br0,5.1,文档,ff
来源: https://blog.csdn.net/diligent_lee/article/details/123615540