Open vSwitch介绍

Open vSwitch介绍

  • 1 vSwitch功能
  • 2 OvS架构
  • 3 OvS报文处理
    • 3.1 传统OvS方式
    • 3.2 OvS+DPDK处理方式
  • 4 OvS补充说明
    • 4.1 基本概念
    • 4.2 匹配项与规则
      • 4.2.1 匹配项
      • 4.2.2 动作

本节主要介绍Open vSwitch(OvS)的基本概念、架构、报文处理流程。

1 vSwitch功能

vSwitch(Virtual Switch)指虚拟交换机或虚拟网络交换机,工作在二层数据网络,通过软件方式实现物理交换机的二层(和部分三层)网络功能。通过运行在虚拟化平台上的虚拟交换机,为本台物理机上的VM(Virtual Machine,虚拟机)提供二层网络接入和部分三层网络功能。VM通过vSwitch来连接网络,vSwitch则通过物理主机上的物理网卡作为上行链路与外界网络进行连接,如下图所示。
Open vSwitch介绍_第1张图片
跟物理主机一样,每个VM有自己的虚拟网卡(virtual NIC),每个虚拟网卡有自己的MAC地址和IP地址。ABCDE是vSwitch上的虚拟端口vPort(virtual Port),该虚拟交换机连接虚拟网卡和物理网卡,将虚拟机上的数据报文从物理网卡转发出去,并从物理网卡上接收报文转发给对应的虚拟网卡。根据需要,vSwitch还可以支持安全控制、VLAN、网络监控、端口镜像、QoS、自动化网管等功能。

每个vSwitch与物理交换机一样,包含一定数量的端口,相同特性的虚拟端口vPort集合就是VLAN(或称端口组),不同VLAN内的报文在传输时是相互隔离的,各VLAN内的用户不能和其它VLAN内的用户直接通信。如果不同VLAN要进行通信,则需要通过路由器、三层交换机等三层设备。

2 OvS架构

Open-vSwitch是支持openFlow协议的虚拟交换机,所谓OpenFlow协议,是一套SDN控制协议,不同厂商使用该标准实现的交换机和controller能够相互兼容,从而便于实现SDN。OvS是一个支持多层数据转发的高质量虚拟交换机,主要部署在服务器上,相比传统交换机具有很好的编程扩展性,同时具备传统交换机实现的网络隔离和数据转发功能,运行在每个实现虚拟化的物理机器上,并提供远程管理。

OvS的架构如下图所示,OvS包含三个基本组件:ovs-vswtichd、ovsdb-server、openvswitch.ko,各个组件的作用如下:

  • ovs-vswitchd组件是交换机的主要模块,运行在用户态,其主要负责基本的转发逻辑、地址学习、外部物理端口绑定等。还可以运用OvS自带的ovs-ofctl工具采用OpenFlow协议对交换机进行远程配置和管理。
  • ovsdb-server组件是存储OvS的网桥配置、日志以及状态的轻量级数据库。它与ovs-vswitchd都是以一个单独的进程存在于系统中。ovsdb是一个可提供持久化存储的数据库,可借助ovs-vsctl工具配置OvS交换机,配置信息将保存在ovsdb中,设备重启后,相关OvS配置不会丢失。ovs-vswitchd组件与ovsdb-server组件间的通信采用OVSDB管理协议,通信内容包括加载配置信息,同时将运行过程中变化的OvS的配置信息保存到数据库中。
  • openvswitch.ko组件运行在内核态,属于快速转发平面,主要负责流表匹配、报文修改、隧道封装、转发或者上送,并且维护底层转发表。在OvS中,报文首先经过该组件完成报文解析和封装、转发规则匹配,若找到转发规则不再经过用户空间,直接转发。否则转交用户空间的ovs-vswitchd组件进行处理。ovs-vswitchd组件与openvswitch.ko组件之间采用netlink执行进程间的通信。netlink是一种进程间通信机制,可用于处理用户态和内核态的通信。

Open vSwitch介绍_第2张图片
OvS提供一些管理和配置工具,本文主要介绍常用的ovs-vsctl、ovs-ofctl、ovsdb-tool和ovsdb-client,详细说明如下:

  • ovs-vsctl是一个管理或配置ovs-vswitchd的高级命令行工具
    • 查看OvS信息:ovs-vsctl show
    • 添加网桥br0:ovs-vsctl add-br br0
    • 删除网桥br0:ovs-vsctl del-br br0
    • 列出所有网桥:ovs-vsctl list-br
    • 新增internal端口p1并添加到网桥br0:ovs-vsctl add-port br0 p1 – set interface p1 type=internal
    • 添加端口p1到网桥br0:ovs-vsctl add-port br0 p1
    • 删除网桥br0上的端口p1:ovs-vsctl del-port br0 p1
    • 查看网络br0上所有端口:ovs-vsctl list-ports br0
    • 设置端口p1的类型为patch,并与p0连接:ovs-vsctl set interface p1 type=patch options:peer=p0
    • 设置OpenFlow控制器:ovs-vsctl set-controller br0 tcp:192.168.1.10:6633 (控制器地址为192.168.1.10,端口为6633)
    • 移除controller:ovs-vsctl del-controller br0
    • 获取br0网桥的Openflow控制器地址,没有控制器则返回空:ovs-vsctl get-controller br0
    • 设置端口p1的vlan tag为100:ovs-vsctl set Port p1 tag=100
    • 设置端口p0类型为internal:ovs-vsctl set Interface p0 type=internal
  • ovs-ofctl是专门管理配置OpenFlow交换机的命令行工具,可以用它手动配置OvS中的流表项
    • 查看网桥br0中流表项:ovs-ofctl dump-flows br0
    • 查看网桥br0的端口信息:ovs-ofctl show br0
    • 添加流表项:ovs-ofctl add flow br0 in_port=vnet0,actions=normal(从vnet0端口进入的报文进行常规2、3层处理)
    • 添加流表项:ovs-ofctl add-flow br0 in_port=vnet0,actions=output:vnet1 (从vnet0端口进入的报文从vnet1端口出)
    • 添加流表项:ovs-ofctl add-flow br0 dl_dst=52:54:00:23:0a:40,actions=output:vnet1 (目的mac为52:54:00:23:0a:40的报文从vnet1端口出)
    • 添加流表项:ovs-ofctl add-flow br0 ip,nw_dst=10.159.11.21,actions=output:vnet1 (目的ip为10.159.11.21的报文从vnet1端口出)
    • 删除网桥br0上的所有流表项:ovs-ofctl del-flows br0
    • 删除网桥br0上入端口为vnet0的所有流表项:ovs-ofctl del-flows br0 in_port=vnet0
  • ovsdb-tool是一个专门管理OvS数据库文件的工具,不常用,它不直接与ovsdb-server进程通信。
    • 创建并初始化database文件:ovsdb-tool create [db][schema]
    • 查看数据库更改记录:ovsdb-tool show-log -m
  • ovsdb-client是ovsdb-server进程的命令行工具,主要是从正在运行的ovsdb-server中查询信息,操作的是数据库。
    • 列出主机上的所有数据库:ovsdb-client list-dbs
    • 列出指定数据库的所有表:ovsdb-client list-tables [DATABASE]
    • 列出指定数据库指定表的所有数据:ovsdb-client dump [DATABASE] [TABLE]
    • 监控指定数据库中的指定表记录改变:ovsdb-client monitor [DATABASE] [TABLE]
    • 获取指定数据库的schema信息:ovsdb-client get-schema [DATABASE]

3 OvS报文处理

3.1 传统OvS方式

在传统OvS中,网卡在加载网络过程中被绑定到OvS端口上,数据包接送和发送函数在datapath中定义,因此报文的接收和发送统一由位于内核空间的datapath进行,内核空间负责报文的解析封装、流表匹配、流表匹配失败上送、报文转发或丢弃等报文处理操作,如下图所示。在OvS中有两个流表,一个为位于内核空间的内核态流表,另一个是位于用户空间的用户态流表。内核态流表主要是存储近期匹配过的流表项,用户态流表主要由控制器或人为通过OvS提供的ovs-ofctl工具下发。用户空间只在内核空间将报文上送用户空间时,对报文进行流表匹配操作,根据匹配结果通知内核datapath报文该如何处理,并下发匹配到的流表项至内核态流表,以备后续类似报文匹配。
Open vSwitch介绍_第3张图片

  • 接收报文处理机制
    • 当报文到达网卡设备,网卡将接收到的报文交给该网卡绑定的端口在OvS中定义的数据包接收函数处理。在datapath中首先进行报文头信息的获取,根据报文头信息生成匹配流表项的key值,得到key值后进行内核态流表匹配。
    • 当数据包的key值在内核态流表中匹配到流表项,数据包将不经过用户空间,直接由内核进行action操作并将报文转发或丢弃。若未匹配到内核态流表项,将使用Linux系统的Netlink通信机制实现内核进程和用户进程的通信,把数据包上送到用户空间。
    • 在用户空间进行用户态流表匹配。若命中用户态流表项,将命中到的用户态流表项以内核态流表的规则生成对应的内核态流表项下发至内核态流表,内核根据匹配到的规则将数据包转发出去。若未命中,则将数据包丢弃或者上送至控制器,由控制器决定如何转发该数据包。
  • 发送报文处理机制
    • OvS接收到数据包后对数据包的处理主要分为修改数据包后转发出去,向上层应用发送、丢弃三种情况。当需要将修改的数据包转发出去时,首先也是进行流表匹配,匹配过程与接收报文一致。通过命中的流表项获得要转发出去的端口号,最终将报文从OvS端口号绑定的网卡发送出去。

3.2 OvS+DPDK处理方式

DPDK平台提供的接口库,可以将底层环境资源做抽象,即在系统中新增了环境抽象层(EAL),将网卡驱动在用户态实现,系统只需在网卡初始化时设置网卡驱动接口即可将网卡收到的报文直接交给用户空间进程进行处理,网卡发送报文时也通过调用用户态定义的发送报文接口将报文直接发送到对应网卡。在OvS的vswitchd进程中新起一个数据收发接管线程(TO-Thread)用于接管系统的OvS中由datapath执行的数据包接收和发送的功能。数据包的流表匹配则直接进行用户态流表匹配,如下图所示。
Open vSwitch介绍_第4张图片

  • 接收报文处理机制
    当报文到达网卡,EAL层根据网卡初始化和驱动层初始化中绑定的用户态网卡驱动,将报文发送到用户空间交给TO-Thread线程进行接管,在该线程中将进行报文的解析、与内核协议栈通信和获取报文key值的操作,然后在vswitchd进程中凭借报文key值完成用户态流表匹配。用户态流表匹配的操作与传统的OvS一样,但若命中流表项本系统将直接交由TO-Thread线程进行action处理,最终将报文通过该接管线程转发出去或丢弃。接收报文的过程中不经过OvS内核态的datapath进程的处理和内核态流表的匹配。
  • 发送报文处理机制
    发送报文时,先经过协议栈的封装处理,将封装好的报文匹配用户态流表,获取action操作。若为隧道转发则还需进行隧道头封装,将报文发往对应的VTEP端口。在隧道转发过程中可能涉及OvS中内部端口多次转发,并在相应端口做报文处理,报文最终要发出的端口通过流表匹配获得。TO-Thread线程将报文直接发往OvS出端口绑定的网卡,由网卡发送到网络中。

4 OvS补充说明

4.1 基本概念

  • Bridge
    代表一个以太网交换机(Switch),一个主机中可以创建一个或者多个Bridge。Bridge的功能是根据一定规则,把从端口收到的数据包转发到另一个或多个端口。
  • Port
    端口Port与物理交换机的端口概念类似,Port是OvS Bridge上创建的一个虚拟端口,每个Port都隶属于一个Bridge。Port有Normal、Internal、Patch和Tunnel四种类型,Normal和Internal这两种Port类型区别在于,Internal类型会自动创建接口(Interface),而Normal类型是把主机中已有的网卡接口添加到OvS中。
    • Normal
      可以把操作系统中已有的网卡(物理网卡em1/eth0,或虚拟机的虚拟网卡tapxxx)挂载到OvS上,OvS会生成一个同名Port处理这块网卡进出的数据包,此时端口类型为Normal。有一点要注意的是,挂载到OvS上的网卡设备不支持分配IP地址,因此若之前eth1配置有IP地址,挂载到OvS之后IP地址将不可访问。
    • Internal
      类型是OvS内部创建的虚拟网卡接口,每创建一个Port,OvS会自动创建一个同名接口(Interface)挂载到新创建的Port上。当OvS创建一个新网桥时,默认会创建一个与网桥同名的Internal Port。在OvS中,只有Internal类型的设备才支持配置IP地址信息。
    • Patch
      当主机中有多个OvS网桥时,可以使用Patch Port把两个网桥连起来。Patch Port总是成对出现,分别连接在两个网桥上,从一个Patch Port收到的数据包会被转发到另一个Patch Port,使用Patch连接的两个网桥跟一个网桥没什么区别。
    • Tunnel
      OvS中支持添加隧道(Tunnel)端口,常见隧道技术有两种gre或vxlan。隧道技术是在现有的物理网络之上构建一层虚拟网络,上层应用只与虚拟网络相关,以此实现的虚拟网络比物理网络配置更加灵活,并能够实现跨主机的L2通信以及必要的租户隔离。不同隧道技术其大体思路均是将以太网报文使用隧道协议封装,然后使用底层IP网络转发封装后的数据包,其差异性在于选择和构造隧道的协议不同。Tunnel在OpenStack中用作实现大二层网络以及租户隔离,以应对公有云大规模,多租户的复杂网络环境。
      OpenStack是多节点结构,同一子网的虚拟机可能被调度到不同计算节点上,因此需要有隧道技术来保证这些同子网不同节点上的虚拟机能够二层互通,就像他们连接在同一个交换机上,同时也要保证能与其它子网隔离。OvS在计算和网络节点上建立隧道Port来连接各节点上的网桥br-int,这样所有网络和计算节点上的br-int互联形成了一个大的虚拟的跨所有节点的逻辑网桥(内部靠tunnel id或VNI隔离不同子网),这个逻辑网桥对虚拟机和qrouter是透明的,它们觉得自己连接到了一个大的br-int上。从某个计算节点虚拟机发出的数据包会被封装进隧道,通过底层网络传输到目的主机然后解封装。
  • Interface
    Interface是连接到Port的网络接口设备,是OvS与外部交换数据包的组件,在通常情况下,Port和Interface是一对一的关系,只有在配置Port为 bond模式后,Port和Interface是一对多的关系。这个网络接口设备可能是创建Internal类型Port时OvS自动生成的虚拟网卡,也可能是系统的物理网卡或虚拟网卡(TUN/TAP)挂载在OvS上。 OvS中只有”Internal”类型的网卡接口才支持配置IP地址。
    Interface是一块网络接口设备,负责接收或发送数据包,Port是OvS网桥上建立的一个虚拟端口,Interface挂载在Port上。一个接口就是操作系统的一块网卡。当Open vSwitch创建一个新网桥时,默认会创建一个与网桥同名的Internal Port,同时也创建一个与Port同名的Interface。三位一体,所以操作系统里就多了一块网卡,但是状态是down的。
  • Controller
    OvS可以同时接受一个或者多个OpenFlow控制器的管理。主要作用是下发流表(Flow Tables)到OvS,控制OvS数据包转发规则。控制器与OvS通过网络连接,不一定要在同一主机上。

4.2 匹配项与规则

低版本的流表由匹配域、计数器和动作组成,本节介绍流表中各项的内容和作用。匹配域用来匹配流量的特征,例如传统交换机能够根据mac地址转发,路由器能够根据ip地址转发。mac,ip都是流量的特征。动作是匹配项匹配到数据之后采取的动作,包括转发和丢弃等常见的动作。

4.2.1 匹配项

低版本的流表可以匹配OSI模型的1层至4层,如下图所示,对匹配到的流表做转发、丢弃或者更复杂的操作。具体的匹配项如下图所示。
Open vSwitch介绍_第5张图片

匹配项 说明
in_port 报文进入的端口编号或名称
table 指定要使用的流表的编号,范围是 0-254
在不指定的情况下,默认值为0
通过使用流表编号,可以创建或者修改多个Table中的Flow
dl_src/dl_dst 匹配源/目的MAC
地址01:00:00:00:00:00/01:00:00:00:00:00 代表广播
地址00:00:00:00:00:00/01:00:00:00:00:00 代表单播
dl_type 匹配以太网协议类型
dl_type=0x0800 代表 IPv4 协议
dl_type=0x086dd 代表 IPv6 协议
dl_type=0x0806 代表 ARP 协议
dl_vlan 数据包的 VLAN Tag 值,范围是 0-4095
0xffff 代表不包含 VLAN Tag 的数据包
dl_vlan_pcp VLAN 优先级,改值取值区间为[0-7]
数字越大,表示优先级越高
nw_src/nw_dst 当 dl_typ=0x0800 时,匹配源或者目标的 IPv4 地址
nw_proto 和 dl_type 字段协同使用
当dl_type=0x0800、nw_proto=0时,匹配IP协议
当dl_type=0x086dd、nw_proto=0时,匹配IPv6 协议
当dl_type=0x0800、nw_proto=1时,匹配ICMP协议
当dl_type=0x0800、nw_proto=6时,匹配TCP协议
当dl_type=0x0800、nw_proto=17时,匹配UDP协议
reg 交换机中的寄存器的值
当一个数据包进入交换机时,所有的寄存器都被清零
用户可以通过 Action 的指令修改寄存器中的值
tp_src/tp_dst TCP/UDP/SCTP 源/目的端口

4.2.2 动作

数据包匹配到流表中的流表项后可以执行下表所述的动作

动作 说明
normal 使数据包经过设备的常规L2/L3处理
output:port 将数据包输出到OpenFlow端口号port。
drop 丢弃数据包,因此不会进行进一步的处理或转发。
local 在与本地网桥名称相同的网络设备对应的“本地端口”上输出数据包
in_port 在接收数据包的端口上输出数据包
mod_dl_src:mac 将源以太网地址设置为mac
mod_dl_dst:mac 将目标以太网地址设置为mac
mod_nw_src:ip 将IPv4源地址设置为ip
mod_nw_dst:ip 将IPv4目标地址设置为ip
mod_tp_src:port 将TCP或UDP或SCTP源端口设置为port
mod_tp_dst:port 将TCP或UDP或SCTP目标端口设置为port
mod_vlan_vid:vlan_vid 修改报文的VLAN ID
mod_vlan_pcp:vlan_pcp 修改报文的VLAN优先级

你可能感兴趣的:(Open,vSwitch介绍和测试,网络,智能路由器)