当前位置:网站首页 > 技术博客 > 正文

openvswitch教程



Open vSwitch 入门实践(1)简介

来源 https://zhuanlan.zhihu.com/p/

Open vSwitch(以下简称OVS)是一个用C语言开发的多层虚拟交换机,使用Apcahe 2开源许可证,现如今基本上已经成为了开源SDN(软件定义网络)基础设施层的事实标准。

  • 支持NetFlow、sFlow(R)、IPFIX、SPAN、RSPAN和GRE隧道镜像等多种流量监控协议
  • 支持LACP (IEEE 802.1AX-2008)
  • 支持标准802.1Q VLAN协议,允许端口配置trunk模式
  • 支持组播
  • 支持BFD和802.1ag链路监控
  • 支持STP(IEEE 802.1D-1998)和RSTP(IEEE 802.1D-2004)
  • 支持细粒度的QoS(服务质量)配置
  • 支持HFSC qdisc
  • 支持接管每一个虚拟机的流量
  • 支持基于源MAC的负载均衡、主备模式和L4哈希的端口绑带
  • 支持OpenFlow协议(包含了很多对虚拟化的扩展)
  • 支持IPv6
  • 支持多种隧道协议(GRE、VXLAN、STT、Geneve和IPsec)
  • 支持C和Python的远程配置协议
  • 支持内核和用户空间的转发引擎选项
  • 具有流缓存引擎的多表转发管道
  • 转发层抽象以简化向新软件和硬件平台的移植

中文名称网桥,一个Bridge代表一个以太网交换机(Switch),一台主机中可以创建一个或多个Bridge,Bridge可以根据一定的规则,把某一个端口接收到的数据报文转发到另一个或多个端口上,也可以修改或者丢弃数据报文。

中文名称端口,需要注意的是它和TCP里面的端口不是同样的概念,它更像是物理交换机上面的插口,可以接水晶头的那种。Port隶属于Bridge,必须先添加了Bridge才能在Bridge上添加Port。Port有以下几种类型:

  • Normal
    用户可以把操作系统中已有的网卡添加到Open vSwitch上,Open vSwitch会自动生成一个同名的Port开处理这张网卡进和出的数据报文。
    不过需要注意的是这种方式添加的Port不支持分配IP地址,如果之前网卡上配置的有IP,挂载到OVS上面之后将不可访问。此类型的Port常用于VLAN模式的多台物理主机相连的那个口,交换机一端属于Trunk模式。

  • Internal
    当Port的类型是Internal时,OVS会自动创建一个虚拟网卡(Interface),此端口收到的数据报文都会转发给这块网卡,从这块网卡发出的数据报文也会通过Port交给OVS处理。当OVS创建一个新的网桥时,会自动创建一个与网桥同名的Internal Port,同时也会创建一个与网桥同名的Interface,因此可以通过ip命令在操作系统中查看到这张虚拟网卡,但是状态是down的。
  • Patch
    Patch Port和veth pair功能相同,总是成双成对的出现,在其中一端收到的数据报文会被转发到另一个Patch Port上,就像是一根网线一样。Patch Port常用于连接两个Bridge,这样两个网桥就和一个网桥一样了。
  • Tunnel
    OVS 支持 GRE、VXLAN、STT、Geneve和IPsec隧道协议,这些隧道协议就是overlay网络的基础协议,通过对物理网络做的一层封装和扩展,解决了二层网络数量不足的问题,最大限度的减少对底层物理网络拓扑的依赖性,同时也最大限度的增加了对网络的控制。

(iface/接口)接口是OVS与操作系统交换数据报文的组件,一个接口即是操作系统上的一块网卡,这个网卡可能是OVS生成的虚拟网卡,也有可能是挂载在OVS上的物理网卡,操作系统上的虚拟网卡(TUN/TAP)也可以被挂载在OVS上。

OpenFlow控制器,OVS可以接收一个或者多个OpenFlow控制器的管理,功能主要是下发流表,控制转发规则。

流表是OVS进行数据转发的核心功能,定义了端口之间转发数据报文的规则,一条流表规则主要分为匹配和动作两部分,匹配部分决定哪些数据报文需要被处理,动作决定了匹配到的数据报文该如何处理。

如果当前软件源中没有openvswitch,可以通过下载和操作系统版本对应的rpm包到本地再安装。 示例命令:

添加网桥

查询网桥列表

删除网桥

  • Normal Port
  • Internal Port
  • Patch Port
  • Tunnel Port
  • 其他基本操作

接下来我们将使用OVS来实现单机和多台物理服务器下的虚拟VLAN网络。

Open vSwitch 入门实践(2)使用OVS构建隔离网络

来源 https://zhuanlan.zhihu.com/p/

在前面我们已经使用Linux Bridge完成了多台网络设备的通信,但是它对于网络隔离的支持不是很好,长期以来,在Linux平台上缺少一个功能完备的虚拟交换机,直到OVS的出现。

接下来我们来尝试完成两个实验,单机无隔离网络、单机隔离网络。

使用ovs构建无隔离网络非常简单,只需要添加一个网桥,然后在这个网桥上再增加几个内部端口,最后把端口移动到netns中即可。

测试

测试和能否通信

测试和能否通信

根据测试结果可以看到,三台设备都是可以互相访问的,这样我们就成功搭建了一个无隔离的二层互通网络。

使用ovs构建隔离网络也很简单,只需要给相应的端口设置上VLAN标签,就能实现网络的隔离。

使用命令查看VLAN tag是否配置成功

测试

测试与的能否通信

测试与的能否通信

测试与的能否通信

测试与的能否通信

根据测试结果可以看出,是无法访问到和的,和可以互相访问。这是因为端口的数据报文发出后被OVS修改了包头,增加了VLAN 标签,与、的VLAN 标签不匹配,OVS交换机便不再将的数据报文发送给其他两个端口,由此便实现了网络隔离。

清理实验环境

Open vSwitch 入门实践(3)使用OVS构建分布式隔离网络

来源 https://zhuanlan.zhihu.com/p/

使用OVS构建分布式隔离网络

上一节我们使用OVS构建了单机隔离网络,但是随着网络规模的扩张,单节点已经不再能满足业务的需要,分布式网络成了必不可少的环节。分布式网络与单节点网络在细节实现上基本一致,只有物理环境网络连线上的一点区别。

网络拓扑如下图所示,我们每一台节点都有两张网卡,一张用于管理,一张用于业务。之所以使用两张网卡有两个原因:

  1. 管理网卡用于日常的维护登录,业务网卡用于传输虚拟节点的数据报文,避免相互之间影响。
  2. 我们要将业务网卡绑定到OVS网桥上,也就是类型的。这种方式添加的不支持分配IP地址,如果之前网卡上配置的有IP,挂载到OVS上面之后将不可访问。
需要注意的是,如果是使用物理环境搭建网络拓扑,需要把业务网卡对应的交换机端口配置为模式。如果是使用VmWare搭建网络拓扑,业务网卡需要配置网络类型为。

  • 配置环境
  • 配置环境
  • 测试
  • 测试
  • 测试结果
主机A主机Bping 结果

根据测试结果可以看到我们使用OVS成功的联通了分布在不同主机上的虚拟网络设备。

构建分布式隔离网络和单节点的操作方法一致,即给对应的端口配置VLAN tag。如下图所示,我们分别给主机A、B上的端口配置VLAN tag为100和200。

  • 配置环境
  • 配置环境
  • 测试
  • 测试
  • 测试结果
主机A主机Bping 结果

根据测试结果可以看到我们使用OVS成功的隔离了分布在不同主机上的虚拟网络设备。

Open vSwitch 入门实践(4)使用OVS配置端口镜像

来源 https://zhuanlan.zhihu.com/p/

当我们想要在不影响虚拟网络设备数据报文收发的情况下获取对应虚拟网络设备的流量时,端口镜像是一个很好的选择。端口镜像是指将经过指定端口(镜像端口)的报文复制一份到另一个指定端口(观察端口),通过观察端口接收到的数据报文,就可以有效识别虚拟网络的运行情况。

OVS提供了相关命令来配置或删除端口镜像,下面我们来实验一下。

端口镜像分为镜像源和镜像目的两部分。

  • select_all:布尔类型(true,false)。设置为 true 时,表示此网桥上的所有流量。
  • select_dst_port:字符串(端口名称)。表示此端口接收的所有流量。
  • select_src_port:字符串(端口名称)。表示此端口发送的所有流量。
  • select_vlan:整形(1-4096)。表示携带此VLAN标签的流量。
  • output_port:字符串(端口名称)。接收流量报文的观察端口。
  • output_vlan:整形(1-4096)。表示只修改VLAN标签,原VLAN标签会被剥离。

新增端口镜像

这行命令会输出一个镜像ID

删除端口镜像

在原端口镜像的基础上增加一个镜像源

在原端口镜像的基础上删除一个镜像源

清空端口镜像

查看端口镜像

关闭端口的MAC地址学习

实验拓扑分为一个网桥,三个虚拟网络设备,

执行以下命令产生流量

重新打开一个终端执行以下命令抓包

需要安装tcpdump才能使用

输出

============= End

  • 上一篇: 如何使用断点调试
  • 下一篇: xhp98
  • 版权声明


    相关文章:

  • 如何使用断点调试2025-01-28 12:30:01
  • srtedit怎么做字幕2025-01-28 12:30:01
  • getchar gets2025-01-28 12:30:01
  • python安装win322025-01-28 12:30:01
  • c++ map和multimap2025-01-28 12:30:01
  • xhp982025-01-28 12:30:01
  • jinja2是什么2025-01-28 12:30:01
  • sql游标的使用方法2025-01-28 12:30:01
  • 移动端ui框架(一篇文章搞懂!vue中pc端与移动端适配解决方案(亲测有效))2025-01-28 12:30:01
  • hadoop倒排索引例子2025-01-28 12:30:01