多层虚拟交换机 Open vSwitch

Open vSwitch 是一个多层虚拟交换机,可以很好地实现交换机的功能。

我的新书《LangChain编程从入门到实践》 已经开售!推荐正在学习AI应用开发的朋友购买阅读!
LangChain编程从入门到实践

SDN

SDN 全称 Software Defined Network,软件定义网络,它是一种新的网络设计理念,即控制与转发分离、集中控制并且开放 API。一般称控制器开放的 API 为北向接口,而控制器与底层网络之间的接口为南向接口。OpenFlow 是第一个开放的南向接口协议,也是目前最流行的协议,它提出了控制与转发分离的架构,规定了 SDN 转发设备的基本组件和功能要求,以及与控制器通信的协议。
SDN 三个基本特征:

  1. 控制与转发分离:转发平面由受控转发的设备组成,转发方式以及业务逻辑由运行在分离出去的控制面上的控制应用所控制。
  2. 开放 API:通过开放的南向和北向 API,能够实现应用和网络的无缝集成。
  3. 集中控制:逻辑上集中的控制平面能够获得网络资源的全局信息并根据业务需求进行全局调配和优化。

SDN 的优势包括:

  1. 灵活性,动态调整网络设备的配置,再也不需要人工去配置每台设备
  2. 网络硬件简化(如白牌交换机等),只需要关注数据的处理和转发
  3. 网络的自动化部署和运维、故障诊断

Open vSwitch

Open vSwitch 是一种支持 OpenFlow 协议的虚拟交换机,提供一套纯软件实现的路由交换协议栈。

Open vSwitch 中几个非常重要的概念

  1. Bridge: Bridge 代表一个以太网交换机(Switch),一个主机中可以创建一个或者多个 Bridge 设备。
  2. Port: 端口与物理交换机的端口概念类似,每个 Port 都隶属于一个 Bridge。
  3. Interface: 连接到 Port 的网络接口设备。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,Port 和 Interface 是一对多的关系。
  4. Controller: OpenFlow 控制器。OVS 可以同时接受一个或者多个 OpenFlow 控制器的管理。
  5. Flow table: 每个 datapath 都和一个“flow table”关联,当 datapath 接收到数据之后, OVS 会在 flow table 中查找可以匹配的 flow,执行对应的操作, 例如转发数据到另外的端口

重点说下 datapath
datapath 是执行数据交换的内核模块,当 openvswtich.ko 加载到内核里面的时候,会在网卡上注册一个函数,每当有网络包到达网卡的时候,这个函数就会被调用。这个函数将网络包开始层层拆包,然后查看是否有已经定义好的策略(修改 MAC,修改 IP,修改 TCP 端口,从哪个网卡发出去等)来处理网络包,如果找到策略,则直接就从网卡发出去了。因为处理过程全部在内核里面,非常快,称为 fastpath。
但内核态能够保持的策略是很少的,往往有新的策略到来,老的策略就丢弃了,当在内核态找不到策略,就需要到用户态去寻找,将包通过 netlink (一种内核态和用户态交互的机制)发送给 vswitchd,vswitchd 有一个线程一直在监听,发现有从内核态发过来的包,就进入了自己的处理流程,称为 slow path。
fastpath vs slowpath.jpg
vswtichd 里面就包含了所有的策略,这些策略都是 controller 通过openflow 协议下发的,vswtichd 会根据网络包的信息层层匹配,总能(一般会有一个默认策略)找到一款策略进行处理。当找到了一个策略匹配之后,为了下一个相同类型的包能够从内核就匹配到,则通过 netlink 协议,将这个策略下发给内核。

Open vSwitch中报文的转发流程

OpenStack-neutron-share-figure-5.png

物理网口eth1挂在网桥br-eth1上,接收来自外界的网络报文,假设报文的vlan ID为101,经过网桥br-eth1转发至网桥br-int上的端口int-br-eth1,同时原报文根据网桥br-eth1上的流表指令,将vlan ID由101转变成1(这种操作是由流表控制的)。报文到达网桥br-int后,会根据br-int上的流规则将报文送至vlan Id为1的端口,报文经过端口时一般都会将vlan标签剥离,然后报文将进入linux内核的qbrXXX网桥,最后经过内核网桥转发,报文被传送至目标虚拟机。

虚拟机会根据接收到的报文,做出相应的动作。回应报文经过内核网桥首先进入br-int网桥,此时回应报文会依照流表被封装成vlan ID为1的vlan报文,然后转发至br-eth1网桥,在依照br-eth1网桥上面的流表,修改vlan ID为101,最后通过物理网口eth1发送出去。至此,OVS组网下,一条简单、完整的网络报文收发过程完成。

实际操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Open Vswitch安装
sudo apt install openvswitch-switch
# 查看当前ovs版本
sudo ovs-vsctl show

# create a new bridge named 'br-int'
sudo ovs-vsctl add-br br-int
# delete 'br-int' and all of its ports
sudo ovs-vsctl del-br br-int

# 启动指定的网络设备
sudo ifconfig br-int up
# print the names of all the bridges
sudo ovs-vsctl list-br

# add network device 'enp5s0' to 'br-int'
sudo ovs-vsctl add-port br-int enp5s0
# print the names of all the ports on 'br-int'
sudo ovs-vsctl list-ports br-int
# print the names of all interfaces on 'br-int'
sudo ovs-vsctl list-ifaces br-int

# 连接到IP为192.168.1.55,端口为6633的控制器
sudo ovs-vsctl set-controller br-int tcp:192.168.1.55:6633
# 删除连接的控制器
sudo ovs-vsctl del-controller br-int
# 列出br-int所连接的控制器
sudo ovs-vsctl get-controller br-int

参考链接

openvSwitch mirror
SDN
Openvswitch原理与代码分析(1):总体架构

多层虚拟交换机 Open vSwitch

https://liduos.com/openvswitch-start.html

作者

莫尔索

发布于

2020-03-03

更新于

2024-05-19

许可协议

评论