open vswitch

  • 部分转载自: sdnlan
  • csdn
  • IBM Open vSwitch

Open vSwitch 概述

  • Open vSwitch(下面简称为 OVS)是由 Nicira Networks 主导的,运行在虚拟化平台(例如 KVM,Xen)上的虚拟交换机。在虚拟化平台上,OVS 可以为动态变化的端点提供 2 层交换功能,很好的控制虚拟网络中的访问策略、网络隔离、流量监控等等。
  • OVS 遵循 Apache 2.0 许可证, 能同时支持多种标准的管理接口和协议。OVS 也提供了对 OpenFlow 协议的支持,用户可以使用任何支持 OpenFlow 协议的控制器对 OVS 进行远程管理控制。
  • 在 OVS 中, 有几个非常重要的概念:
  • Bridge: Bridge 代表一个以太网交换机(Switch),一个主机中可以创建一个或者多个 Bridge 设备。
  • Port: 端口与物理交换机的端口概念类似,每个 Port 都隶属于一个 Bridge。
  • Interface: 连接到 Port 的网络接口设备。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,Port 和 Interface 是一对多的关系。
  • Controller: OpenFlow 控制器。OVS 可以同时接受一个或者多个 OpenFlow 控制器的管理。
  • datapath: 在 OVS 中,datapath 负责执行数据交换,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。
  • Flow table: 每个 datapath 都和一个“flow table”关联,当 datapath 接收到数据之后, OVS 会在 flow table 中查找可以匹配的 flow,执行对应的操作, 例如转发数据到另外的端口。

安装

  • ovs-vsctl 直接用的是 mininet, 刚开始再虚拟机里玩一下,也可以自己装
  • sudo apt-get install openvswitch-switch
  • ps -e | grep ovs
  • 产看版本
  • ovs-appctl –version
  • 查看 支持 openflow 的版本
  • sudo apt-get update && sudo apt-get install qemu-kvm

ovs-vsctl add-port br0 eth1 的警告

  • 我将 eth1 挂到了 br0(mininet 中自带的网桥)上,然后 mininet 就不能 ssh 上了
  • ovs-vsctl del-port br0 eth1 之后能 ssh 上了,但是,速度慢了好多
  • ovs-vsctl show 看到 eth0 也挂在 br0 网桥下.soga
  • ovs-vsctl del-port br0 eth0 ,又能 愉快的 sshxm 了

网桥和交换机的区别

  • 局域网交换机的基本功能与网桥一样,具有帧转发、帧过滤和生成树算法功能。但是,交换机与网桥相比还是存在以下不同:
1、交换机工作时,实际上允许许多组端口间的通道同时工作。
  • 所以,交换机的功能体现出不仅仅是一个网桥的功能,而是多个网桥功能的集合。即网桥一般分有两个端口,而交换机具有高密度的端口。
2、分段能力的区别
  • 由于交换机能够支持多个端口,因此可以把网络系统划分成为更多的物理网段,这样使得整个网络系统具有更高的带宽。而网桥仅仅支持两个端口,所以,网桥划分的物理网段是相当有限的。
3、传输速率的区别
  • 交换机与网桥数据信息的传输速率相比,交换机要快于网桥。
4、数据帧转发方式的区别
  • 网桥在发送数据帧前,通常要接收到完整的数据帧并执行帧检测序列FCS后,才开始转发该数据帧。交换机具有存储转发和直接转发两种帧转发方式。直接转发方式在发送数据以前,不需要在接收完整个数据帧和经过32bit循环冗余校验码CRC的计算检查后的等待时间。

open vswitch简介

  • Open vSwitch是一个高质量的、多层虚拟交换机,使用开源Apache2.0许可协议,由Nicira Networks开发,主要实现代码为可移植的C代码。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议(例如NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag)。此外,它被设计位支持跨越多个物理服务器的分布式环境,类似于VMware的vNetwork分布式vswitch或Cisco Nexus 1000 V。Open vSwitch支持多种linux 虚拟化技术,包括Xen/XenServer, KVM和irtualBox。当前最新代码包主要包括以下模块和特性:
ovs-vswitchd 主要模块,实现switch的daemon,包括一个支持流交换的Linux内核模块;
ovsdb-server 轻量级数据库服务器,提供ovs-vswitchd获取配置信息;
ovs-brcompatd 让ovs-vswitch替换Linuxbridge,包括获取bridge ioctls的Linux内核模块;
ovs-dpctl 用来配置switch内核模块;
  • 一些Scripts and specs 辅助OVS安装在Citrix XenServer上,作为默认switch;
ovs-vsctl 查询和更新ovs-vswitchd的配置;
ovs-appctl 发送命令消息,运行相关daemon;
ovsdbmonitor GUI工具,可以远程获取OVS数据库和OpenFlow的流表。
  • 此外,OVS也提供了支持OpenFlow的特性实现,包括
ovs-openflowd:一个简单的OpenFlow交换机;
ovs-controller:一个简单的OpenFlow控制器;
ovs-ofctl 查询和控制OpenFlow交换机和控制器;
ovs-pki :OpenFlow交换机创建和管理公钥框架;
ovs-tcpundump:tcpdump的补丁,解析OpenFlow的消息;
  • 内核模块实现了多个“数据路径”(类似于网桥),每个都可以有多个“vports”(类似于桥内的端口)。每个数据路径也通过关联一下流表(flow table)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息。当有一个匹配的流时它执行对应的操作。如果没有匹配,它会将数据包送到用户空间的处理队列中(作为处理的一部分,用户空间可能会设置一个流用于以后碰到相同类型的数据包可以在内核中执行操作)。

网桥管理

  • 这里的一些命令写的不祥细, 可以参考第二个链接 csdn

远程连接 Controller

  • ovs-vsctl set-controller ovs-switch tcp:9.181.137.182:6633

添加网桥:

  • #ovs-vsctl add-br br0

列出open vswitch中的所有网桥:

  • #ovs-vsctl list-br

判断网桥是否存在

  • #ovs-vsctl br-exists br0

将物理网卡挂接到网桥:

  • #ovs-vsctl add-port br0 eth0

列出网桥中的所有端口:

  • #ovs-vsctl list-ports br0

列出所有挂接到网卡的网桥:

  • #ovs-vsctl port-to-br eth0

查看open vswitch的网络状态:

  • #ovs-vsctl show

删除网桥上已经挂接的网口:

  • #vs-vsctl del-port br0 eth0

删除网桥:

  • #ovs-vsctl del-br br0

网桥管理(ovsdb数据库操作)

  • ovsdb是一个非常轻量级的数据库,与其说它是一个数据库,不如说它是一个提供增删查改等功能的临时配置缓存,之所以这么说,是因为ovsdb数据库的根本就未使用多少数据库技术,如SQL语言查询、存储过程等等。ovsdb 数据库通过模式文件“openvswitch-1.1.0pre2/vswitchd/vswitch.ovsschema”,如要定制ovsdb数据库,可通过更改 vswitch.ovsschema 文件实现,不过以下姑且仍以数据库称之。
  • ovs-vsctl list bridge

QoS设置

  • 针对网络接口的设置:设置网络接口vif0.0的带宽为1000±100kbps
ovs-vsctl set interface vif0.0 ingress_policing_rate=1000
ovs-vsctl set interface vif0.0 ingress_policing_burst=100
ingress_policing_rate:最大发送速率(单位均为kbps)
ingress_policing_burst:超过ingress_policing_rate的最大浮动值
  • 针对交换机端口的设置:创建在vif0.0端口上的linux-htb QoS,linux-htb QoS可以针对具有指定特征的数据包流设置最大最小带宽,且在最大带宽范围内,某一特征的数据包流可以借用其他特征数据包流未用完的带宽。
ovs-vsctl -- set port vif0.0 qos=@newqos
-- --id=@newqos create qos type=linux-htb other-config:
max-rate=100000000 queues=0=@q0,1=@q1
-- --id=@q0 create queue other-config:min-rate=100000000 other-config:max-rate=100000000
-- --id=@q1 create queue other-config:min-rate=500000000
  • 将带宽限制加于某特征数据包流上
(假设vif0.0的接在交换机1号端口上,ovs-ofctl命令的使用见2.2.3)
ovs-ofctl add-flow xenbr0 "in_port=2,idle_timeout=0,actions=enqueue:1:0"

流规则管理

流规则组成

  • 每条流规则由一系列字段组成,分为基本字段、条件字段和动作字段三部分:
  • 基本字段包括生效时间duration_sec、所属表项table_id、优先级priority、处理的数据包数n_packets,空闲超时时间idle_timeout等,空闲超时时间idle_timeout以秒为单位,超过设置的空闲超时时间后该流规则将被自动删除,空闲超时时间设置为0表示该流规则永不过期,idle_timeout将不包含于ovs-ofctl dump-flows brname的输出中。
  • 条件字段包括输入端口号in_port、源目的mac地址dl_src/dl_dst、源目的ip地址nw_src/nw_dst、数据包类型dl_type、网络层协议类型nw_proto等,可以为这些字段的任意组合,但在网络分层结构中底层的字段未给出确定值时上层的字段不允许给确定值,即一条流规则中允许底层协议字段指定为确定值,高层协议字段指定为通配符(不指定即为匹配任何值),而不允许高层协议字段指定为确定值,而底层协议字段却为通配符(不指定即为匹配任何值),否则,ovs-vswitchd 中的流规则将全部丢失,网络无法连接。
  • 动作字段包括正常转发normal、定向到某交换机端口output:port、丢弃drop、更改源目的mac地址mod_dl_src/mod_dl_dst等,一条流规则可有多个动作,动作执行按指定的先后顺序依次完成。

基本操作

  • 暂时忘了在那遇到过, 见到后再去看 第二个链接 吧

内核模块中flow操作

查看内核模块flow

  • ovs-dpctl dump-flows xenbr0

五种方法使用open vswitch构建虚拟网络

  • 具体见第一个链接

构建物理机和物理机相互连接的网络

  • 在安装open vswitch的主机上有两块网卡,分别为eth0、eth1,把这两块网卡挂接到open vswitch的网桥上,然后有两台物理机host1、host2分别连接到eth0和eth1上,实现这两台物理机的通信。构建结果图如下:
  • 图参见 sdnlab 上的图,链接见最上面,大神可以直接看代码
  • 执行以下命令:
#ovs-vsctl add-br br0 //建立一个名为br0的open vswitch网桥
#ovs-vsctl add-port br0 eth0 //把eth0挂接到br0中
#ovs-vsctl add-port br0 eth1 //把eth1挂接到br0中
构建虚拟机与虚拟机相连的网络
  • 在安装open vswitch的主机上安装两个虚拟机,把两个虚拟机的网卡都挂接在open vswitch的网桥上,实现两台虚拟机的通信,构建结果图如下:
  • 执行以下命令:
  • # ovs-vsctl add-br br0 //建立一个名为br0的open vswitch网桥
  • 如果使用vbox或virt-manager把bridge设置为br0即可,如果使用cli kvm则先创建两个文件,用于虚拟网卡的添加于删除。假设这两个文件分别为/etc/ovs-ifup和/etc/ovs-ifdown,则向这两个文件中写入以下内容
  • /etc/ovs-ifup
#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 up
ovs-vsctl add-port ${switch} $1
  • /etc/ovs-ifdown
#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1
  • 使用以下命令建立虚拟机
kvm -m 512 -net nic,macaddr=00:11:22:33:44:55-net \
tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\
file=/path/to/disk-image,boot=on
kvm -m 512 -net nic,macaddr=11:22:33:44:55:66-net \
tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\
file=/path/to/disk-image,boot=on

构建虚拟机与物理机相连的网络

  • 在装有open vswitch的主机上有一个物理网卡eth0,一台主机通过网线和eth0相连,在open vswitch的主机上还装有一台虚拟机,把此虚拟机和连接到eth0的主机挂接到同一个网桥上,实现两者之间的通信,构建结果图如下:
  • 执行命令:
# ovs-vsctl add-br br0 //建立一个名为br0的open vswitch网桥
# ovs-vsctl add-port br0 eth0 //把eth0挂接到br0中
# kvm -m 512 -net nic,macaddr=00:11:22:33:44:55-net \
tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\
file=/path/to/disk-image,boot=on //ovs-ifup和ovs-ifdown和上一节中相同

构建网桥和网桥相连的网络

  • 以上操作都是将多个主机(物理机或虚拟机)连接到同一个网桥上,实现它们之间的通信,但是要构建复杂的网络,就需要多个网桥,在装有open vswitch的主机上建立两个网桥,实现它们之间的连接,构建结果如下:
  • 执行命令:
ovs-vsctl add-br br  添加一个名为br1的网桥
ovs-vsctl add-br br1    //添加一个名为br1的网桥
ovs-vsctl add-port br1 patch-to-br1    //为br0添加一个虚拟端口
ovs-vsctl set interface patch-to-br1type=patch      //把patch-to-br1的类型设置为patch
ovs-vsctl set interface patch-to-br1 options:peer=patch-to-br0     把对端网桥和此网桥连接的端口名称设置为patch-to-br0
ovs-vsctl add-port br1 patch-to-br0    //为br0添加一个虚拟端口
ovs-vsctl set interface patch-to-br0type=patch      //把patch-to-br0的类型设置为patch
ovs-vsctl set interface patch-to-br0options:peer=patch-to-br1     //把对端网桥和此网桥连接的端口名称设置为patch-to-br1
ovs-vsctl set interface patch-to-br0type=patch 和ovs-vsctl set interface patch-to-br0 options:peer=patch-to-br1是对ovs-database的操作,有有兴趣的同学可以参考ovs-vswitchd.conf.db.5

在不同的主机之间构建网桥之间的连接

  • 在两台机器上分别安装上open vswitch并创建网桥,分别为两个网桥添加物理网卡,然后通过网线连接两个网桥,实现两个网桥之间的互通。构建结果图如下:
  • 执行命令:
  • host1
#ovs-vsctl add-br br0           //添加名为br0的网桥
#ovs-vsctl add-port br0 eth0    //把eth0挂接到br0上
  • host2
#ovs-vsctl add-br br0             //添加名为br0的网桥
#ovs-vsctl add-port br0 eth0      //把eth0挂接到br0上
  • 然后使用网线把host1的eth0和host2的eth0相连即可。
  • 使用上边五种方法的组合就可以构建出各种复杂的网络,为各种实验提供网络的支持。

你可能感兴趣的:(open vswitch)