OpenvSwitch概念和原理的理解与使用技巧

OpenvSwitch概念和原理的理解与使用技巧  


什么是OpenvSwitch

OpenvSwitch,简称OVS是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer, KVM, and VirtualBox多种虚拟化技术。

在这种某一台机器的虚拟化的环境中,一个虚拟交换机(vswitch)主要有两个作用:传递虚拟机VM之间的流量,以及实现VM和外界网络的通信。

整个OVS代码用C写的。目前有以下功能:

  • Standard 802.1Q VLAN model with trunk and access ports
  • NIC bonding with or without LACP on upstream switch
  • NetFlow, sFlow(R), and mirroring for increased visibility
  • QoS (Quality of Service) configuration, plus policing
  • GRE, GRE over IPSEC, VXLAN, and LISP tunneling
  • 802.1ag connectivity fault management
  • OpenFlow 1.0 plus numerous extensions
  • Transactional configuration database with C and Python bindings
  • High-performance forwarding using a Linux kernel module

OpenvSwitch的组成

  • ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-based switching。
  • ovsdb-server:轻量级的数据库服务,主要保存了整个OVS的配置信息,包括接口啊,交换内容,VLAN啊等等。ovs-vswitchd会根据数据库中的配置信息工作。
  • ovs-dpctl:一个工具,用来配置交换机内核模块,可以控制转发规则。
  • ovs-vsctl:主要是获取或者更改ovs-vswitchd的配置信息,此工具操作的时候会更新ovsdb-server中的数据库。
  • ovs-appctl:主要是向OVS守护进程发送命令的,一般用不上。
  • ovsdbmonitor:GUI工具来显示ovsdb-server中数据信息。
  • ovs-controller:一个简单的OpenFlow控制器
  • ovs-ofctl:用来控制OVS作为OpenFlow交换机工作时候的流表内容。

OpenvSwitch和其他vswitch

这里其他的vswitch,包括VMware vNetwork distributed switch以及思科的Cisco Nexus 1000V。

VMware vNetwork distributed switch以及思科的Cisco Nexus 1000V这种虚拟交换机提供的是一个集中式的控制方式,。而OVS则是一个独立的vswitch,他运行在每个实现虚拟化的物理机器上,并提供远程管 理。OVS提供了两种在虚拟化环境中远程管理的协议:一个是OpenFlow,通过流表来管理交换机的行为,一个是OVSDB management protocol,用来暴露sietch的port状态。

概念及工作流程

vswitch、Bridge、Datapath

          在网络中,交换机和桥都是同一个概念,OVS实现了一个虚拟机的以太交换机,换句话说,OVS也就是实现了一个以太桥。那么,在OVS中,给一个交换机,或者说一个桥,用了一个专业的名词,叫做DataPath!

         要了解,OVS如何工作,首先需要知道桥的概念。

          网桥也叫做桥接器,连接两个局域网的设备,网桥工作在数据链路层,将两个LAN连接,根据MAC地址来转发帧,可以看成一个“低层的路由器”(路由器工作在网络层,根据IP地址进行转发)。

***************************************网桥的工作原理***********************************

网桥处理包遵循以下几条规则:

  • 在一个接口上接收到的包不会再往那个接口上发送此包。
  • 每个接收到的包都要学习其源MAC地址。
  • 如果数据包是多播或者广播包(通过2层MAC地址确定)则要向接收端口以外的所有端口转发,如果上层协议感兴趣,则还会递交上层处理。
  • 如果数据包的地址不能再CAM表中找到,则向接收端口以外的其他端口转发。
  • 如果CAM表中能找到,则转发给相应端口,如果发送和接收都是统一端口,则不发送。

注意,网桥是以混杂模式工作的。

   ::OVS中的bridge

上面,说到,一个桥就是一个交换机。在OVS中,

ovs-vsctl add-br brname(br-int)

root@Compute2:~# ifconfig
      br-int......
      RX bytes:316502 (316.5 KB)  TX bytes:468 (468.0 B)

       当我们创建了一个交换机(网桥)以后,此时网络功能不受影响,但是会产生一个虚拟网卡,名字就是brname,之所以会产生一个虚拟网卡,是为了实现接下 来的网桥(交换机)功能。有了这个交换机以后,我还需要为这个交换机增加端口(port),一个端口,就是一个物理网卡,当网卡加入到这个交换机之后,其 工作方式就和普通交换机的一个端口的工作方式类似了。

ovs-vsctl add-port brname port

       这里要特别注意,网卡加入网桥以后,要按照网桥的工作标准工作,那么加入的一个端口就必须是以混杂模式工作,工作在链路层,处理2层的帧,所以这个port就不需要配置IP了(不过要与netfilter一起工作的时候还是考虑加入noarp的ip为好)。

      那么接下来你可能会问,通常的交换机不都是有一个管理接口,可以telnet到交换机上进行配置吧,那么在OVS中创建的虚拟交换机有木有这种呢,有的! 上面既然创建交换机brname的时候产生了一个虚拟网口brname,那么,你给这个虚拟网卡配置了IP以后,就相当于给交换机的管理接口配置了IP, 此时一个正常的虚拟交换机就搞定了。

ip address add 192.168.1.1/24 dev brname

      最后,我们来看看一个br的具体信息:

Bridge   "br0"  
Port   "eth0"  
Interface   "eth0"  
Port   "br0"  
Interface   "br0"  
type :   internal  
ovs_version :   "1.4.0+build0"

        首先,这里显示了一个名为br0的桥(交换机),这个交换机有两个接口,一个是eth0,一个是br0,上面说到,创建桥的时候会创建一个和桥名字一样的 接口,并自动作为该桥的一个端口,那么这个虚拟接口的作用,一方面是可以作为交换机的管理端口,另一方面也是基于这个虚拟接口,实现了桥的功能。

  概念及工作流程的例子:虚拟化环境中OpenvSwitch的典型工作流程

         OVS主要是用来在虚拟化环境中。实现虚拟机之间的通信以及虚拟机与外界网络的通信.如下是一个典型的结构图.通常情况下的工作流程如下:


v-switch的包工作流程图示
 

  • VM实例instance产生一个数据包并发送至实例内的虚拟网络接口VNIC,图中就是instance中的eth0.
  • 这个数据包会传送到物理节点上的VNIC接口,如图就是vnet接口vnet1。
  • 数据包从vnet NIC出来,到达桥(虚拟交换机)br100上.
  • 数据包经过交换机的处理,从物理节点上的物理接口发出,如图中物理节点上的eth0.
  • 数据包从eth0出去的时候,是按照物理节点上的路由以及默认网关操作的,这个时候该数据包其实已经不受我们的linux-box的控制了,进入报文的传输环节。
****************************************
附注:openswitch与cloud
****************************************

::什么是Open vSwitch?它能给云带来什么?

       Open vSwitch的目标,是做一个具有产品级质量的多层虚拟交换机。通过可编程扩展,可以实现大规模网络的自动化(配置、管理、维护)。它支持现有标准管理接口和协议(比如netFlowsFlowSPANRSPANCLILACP802.1ag等,熟悉物理网络维护的管理员可以毫不费力地通过Open vSwitch转向虚拟网络管理)。

 

 

图一:Open vSwitch示意图

     官网的描述精准而抽象,来点通俗的,Open vSwitch是一个由Nicira Networks主导的开源项目,通过运行在虚拟化平台上的虚拟交换机,为本台物理机上的VM提供二层网络接入, 跟云中的其它物理交换机一样工作在Layer 2层。Open vSwitch充分考虑了在不同虚拟化平台间的移植性,采用平台无关的C语言开发。最为人民群众喜闻乐见的是,它遵循Apache2.0许可,不论你是自用还是商用都OK。而它的同类产品VMwarevDSvSphere Distributed VirtualSwitch),CiscoNexus 1000V都是收费的。更重要的是,虽然免费,其产品质量却深得信赖。在2010Open vSwitch 1.0.0发布之前,Citrix就宣布在XenServer中将其作为默认组件。关于这一点,也许Nicira的身世可以给出一些解释,它的投资人里有Diane GreeneVMware联合创始人)和Andy RachleffBenchmark Capital联合创始人),经常听朋友谈起的几个VMware网络大牛也加盟其中,是目前硅谷最炙手可热的SDN创业公司之一。

既然Citrix的企业级虚拟化产品都装备了Open vSwitch,我们还有什么理由怀疑它的可靠性呢?更何况它还是开源的!

::它能给我们云带来什么?

       如果你只是自己搞一台Host,在上面虚拟几台VM做实验。或者小型创业公司,通过在五台十台机器上的虚拟化,创建一些VM给公司内部开发测试团队使用。那么对你而言,网络虚拟化的迫切性并不强烈。也许你更多考虑的,是VM的可靠接入:和物理机一样有效获取网络连接,能够RDP访问。Linux Kernel自带的桥接模块就可以很好的解决这一问题。原理上讲,正确配置桥接,并把VMvirtual nic连接在桥接器上就OK啦。很多虚拟化平台的早期解决方案也是如此,自动配置并以向用户透明的方式提供虚拟机接入。如果你是OpenStackfans,那Nova就更好地帮你完成了一系列网络接入设置。Open vSwitchWHY-OVS这篇文章中,第一句话就高度赞扬了Linux bridge

We love the existing network stack in Linux.  It is robust, flexible, and feature rich.  Linux already contains an in-kernel L2 switch (the Linux bridge) which can be used by VMs for inter-VM communication.  So, it is reasonable to ask why there is a need for a new network switch.

    传统数据中心中,网络管理员习惯了每台物理机的网络接入均可见并且可配置。通过在交换机某端口的策略配置,可以很好控制指定物理机的网络接入,访问策略,网络隔离,流量监控,数据包分析,Qos配置,流量优化等。

    有了云,网络管理员仍然期望能以per OS/per port的方式管理。如果没有网络虚拟化技术的支持,管理员只能看到被桥接的物理网卡,其上川流不息地跑着nVM的数据包。仅凭物理交换机支持,管理员无法区分这些包属于哪个OS哪个用户,只能望云兴叹乎?简单列举常见的几种需求,Open vSwitch现有版本很好地解决了这些需求。

   需求一:网络隔离。物理网络管理员早已习惯了把不同的用户组放在不同的VLAN中,例如研发部门、销售部门、财务部门,做到二层网络隔离。Open vSwitch通过在host上虚拟出一个软件交换机,等于在物理交换机上级联了一台新的交换机,所有VM通过级联交换机接入,让管理员能够像配置物理交换机一样把同一台host上的众多VM分配到不同VLAN中去;

   需求二:QoS配置。在共享同一个物理网卡的众多VM中,我们期望给每台VM配置不同的速度和带宽,以保证核心业务VM的网络性能。通过在Open vSwitch端口上,给各个VM配置QoS,可以实现物理交换机的traffic queuingtraffic shaping功能。

   需求三:流量监控,NetflowsFlow物理交换机通过xxFlow技术对数据包采样,记录关键域,发往Analyzer处理。进而实现包括网络监控、应用软件监控、用户监控、网络规划、安全分析、会计和结算、以及网络流量数据库分析和挖掘在内的各项操作。例如,NetFlow流量统计可以采集的数据非常丰富,包括:数据流时戳、源IP地址和目的IP地址、 源端口号和目的端口号、输入接口号和输出接口号、下一跳IP地址、信息流中的总字节数、信息流中的数据包数量、信息流中的第一个和最后一个数据包时戳、源AS和目的AS,及前置掩码序号等。

xxFlow因其方便、快捷、动态、高效的特点,为越来越多的网管人员所接受,成为互联网安全管理的重要手段,特别是在较大网络的管理中,更能体现出其独特优势。

没错,有了Open vSwitch,作为网管的你,可以把xxFlow的强大淋漓尽致地应用在VM上!

   需求四:数据包分析,Packet Mirror物理交换机的一大卖点,当对某一端口的数据包感兴趣时(for trouble shooting , etc),可以配置各种spanSPAN, RSPAN, ERSPAN),把该端口的数据包复制转发到指定端口,通过抓包工具进行分析。OpenvSwitch官网列出了对SPAN, RSPAN, and GRE-tunneled mirrors的支持。

     关于具体功能,可以参考官网功能列表:http://openvswitch.org/features/

::::只是在Open vSwitch上实现物理交换机的现有功能?

     云中的网络,绝不仅仅需要传统物理交换机已有的功能。云对网络的需求,推动了Software Defined Network越来越火。而在各种SDN解决方案中,OpenFlow无疑是最引人瞩目的。FlowTable + Controller的架构,为新服务新协议提供了绝佳的开放性平台。Nicira把对Openflow的支持引入了OpenvSwitch。主要引入主要功能模块:

·         ovs-openflowd  ---  OpenFlow交换机;

·         ovs-controller  --- OpenFlow控制器;

·         ovs-ofctl  --- Open Flow 的命令行配置接口;

·         ovs-pki  --- 创建和管理公钥框架;

·         tcpdump的补丁 --- 解析OpenFlow的消息;

 

Open Flow示意图 -- 摘自Open Flow白皮书

      需求决定产品,正是由于在企业级云中,需要各种丰富的网络功能,VMwaren年前就推出了vSwitchvDS等虚拟交换机。正是看到了云中的网络是一块大市场,Cisco才与VMware紧密合作,以partner的形式基于VMware kernel API开发出了自己的分布式虚拟交换机Nexus 1000V(功能对应于VMwarevDS)。可惜的是,这两款产品都是收费的。Citrix倒是基于Open vSwitch快速追赶,推出了自己的Distributed Virtual Switch解决方案。开源云的标杆OpenStack去年下半年推出了一项宏大的计划,启动了Quantum项目,志在通过引入Open vSwitch,为Open Stack Network模块勾勒出“Connectivity as a service”的动人前景。

      **************************
     使用技巧举例
     **************************

Open vSwitch 使用技巧举例

1)添加名为br0的网桥

ovs-vsctl add-br br0

2)删除名为br0的网桥

ovs-vsctl del-br br0

3)列出所有网桥

ovs-vsctl list-br

4)判断网桥br0是否存在

ovs-vsctl br-exists br0

5)列出挂接到网桥br0上的所有网络接口

ovs-vsctl list-ports br0

6)将网络接口eth0挂接到网桥br0上

ovs-vsctl add-port br0 eth0

7)删除网桥br0上挂接的eth0网络接口

ovs-vsctl del-port br0 eth0

8)列出已挂接eth0网络接口的网桥

ovs-vsctl port-to-br eth0

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

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


数据库操作的一般格式为:

ovs-vsctl list/set/get/add/remove/clear/destroy table record column [value]

默认情况下ovsdb中有以下数据表:

bridge, controller,interface,mirror,netflow,open_vswitch,port,qos,queue,ssl,sflow

即table可为上面的任一个。record为数据表中name字段的值,column为数据表任一个字段的字段名,value字段值。

基本操作:

查看bridge数据表中的所有记录


获得bridge数据表_uuid字段的值


设置bridge数据表datapath_type字段的值


清除bridge数据表flood_vlans字段的值

ovs-vsctl remove bridge xenbr0 flood_vlans 23

或者

ovs-vsctl clear bridge xenbr0 flood_vlans

删除uuid为69ee0c09-9e52-4236-8af6-037a98ca704d的qos记录

ovs-vsctl destroy qos 69ee0c09-9e52-4236-8af6-037a98ca704d

应用场景设置:

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"

端口映射

将发往eth0端口和从eth1端口发出的数据包全部定向到eth2端口

(假设eth0、eth1、eth2端口的uuid分别为:

69ee0c09-9e52-4236-8af6-037a98ca704d

69ee0c09-9e52-4236-8af6-037a98ca704e

69ee0c09-9e52-4236-8af6-037a98ca704f

端口的uuid可以通过ovs-vsctl list port命令查看)

ovs-vsctl -- set bridge xenbr0 mirrors=@m

-- --id=@m create mirror name=mymirror

select-dst-port=69ee0c09-9e52-4236-8af6-037a98ca704d

select-src-port=69ee0c09-9e52-4236-8af6-037a98ca704e

output-port=69ee0c09-9e52-4236-8af6-037a98ca704f

流规则管理

流规则组成

每条流规则由一系列字段组成,分为基本字段、条件字段和动作字段三部分:

基本字段包括生效时间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等,一条流规则可有多个动作,动作执行按指定的先后顺序依次完成。

基本操作

查看虚拟交换机xenbr0的信息


显示的xenbr0信息中网络接口名称前的数字为该网络接口挂接到Open vSwitch上的端口号,如1(vif0.0): 中的1为网络接口vif0.0对应的端口号,在添加包含in_port字段的流规则时可通过该命令查看网络接口对应的端口号。

查看xenbr0上各交换机端口的状态


输出的结果中包含了各网络接口上收到的数据包数,字节数,丢包数,错误数据包数等信息

查看xenbr0上的所有流规则


输出结果中共有两条流规则,第一条为默认的流规则,即对所有数据包进行正常转发,为普通二层交换机完成的功能,优先级为0,最低,永不超时。

第二条为手动添加的流规则,基本字段中不包含idle_timeout字段,表示永不超时,优先级为32768,Open vSwitch将先根据该条流规则处理收到的数据包,如从数据包中提取出的特征与条件字段不符,则该用第一条流规则处理收到的所有数据包。

添加一条流规则:丢弃从2号端口发来的所有数据包


删除一条流规则:删除条件字段中包含in_port=2的所有流规则



流规则中可包含通配符和简写形式,任何字段都可等于*或ANY,如:

丢弃所有收到的数据包

ovs-ofctl add-flow xenbr0 dl_type=*,nw_src=ANY,actions=drop

简写形式为将字段组简写为协议名,目前支持的简写有ip,arp,icmp,tcp,udp,与流规则条件字段的对应关系如下:

dl_type=0x0800 <=>ip
dl_type=0x0806 <=>arp
dl_type=0x0800,nw_proto=1 <=> icmp
dl_type=0x0800,nw_proto=6 <=> tcp
dl_type=0x0800,nw_proto=17 <=> udp


(1.1.0 即以后版本支持)

dl_type=0x86dd. <=> ipv6
dl_type=0x86dd,nw_proto=6. <=> tcp6
dl_type=0x86dd,nw_proto=17. <=> udp6
dl_type=0x86dd,nw_proto=58. <=> icmp6


应用场景设置

网站屏蔽

屏蔽由Open vSwitch管理的任何主机对主机119.75.213.50的访问,但只屏蔽ip数据包(由dl_type=0x0800指定),即所有主机将无法访问该主机上所有基于IP协议的服务,如万维网服务、FTP访问等

ovs-ofctl add-flow xenbr0 idle_timeout=0,dl_type=0x0800,nw_src=119.75.213.50,actions=drop

数据包重定向

将交换机中所有的icmp协议包(有dl_type=0x0800,nw_proto=1指定)全部转发到4号端口,包括4号端口自己发出的 icmp包,该流规则将导致由Open vSwitch管理的主机间以及与外部网络间都将访问ping通,但可以使用万维网、FTP等服务。

ovs-ofctl add-flow xenbr0 idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:4

去除VLAN tag

去除从3号端口发来的所有VLAN数据包中的tag,然后转发

ovs-ofctl add-flow xenbr0 idle_timeout=0,in_port=3,actions=strip_vlan,normal

更改数据包源IP地址后转发

将从3号端口收到的所有IP包的源IP字段更改为211.68.52.32

ovs-ofctl add-flow xenbr0 idle_timeout=0,in_port=3,actions=mod_nw_src:211.68.52.32,normal

内核模块中flow操作

查看内核模块flow
ovs-dpctl dump-flows xenbr0

后台模块控制,如日志系统、后台模块退出

查看后台模块支持的appctl命令

查看ovsdb-server支持的appctl命令,ovs-appctl必须在后台模块运行后才能针对后台模块使用,默认情况下,所有运行的后 台模块都会在/usr/local/var/run/openvswitch/目录下创建一个与ovs-appctl通信的socket文件


更改Open vSwitch各后台的模块的日志级别

更改ovs-vswitchd模块的日志级别info,“ANY:ANY:info”中的前一个“ANY”代表ovs-vswitchd中的任何模块组件,“ovs-appctl --target=/usr/local/var/run/openvswitch/

ovs-vswitchd.29384.ctl vlog/list”命令输出的第一列将为ovs-vswitchd包含的所有模块组件。“ANY:ANY:info”中的后一个“ANY”代表日志的任 何方式的输出,日志的输出方式有三种,分别为:console,syslog,file,分别代表将日志输出到控制台、写入到系统日志系统和写入到 ovs-vswitchd启动时由—log-file参数指定的文件。“ANY:ANY:info”中的“info”表示日志级别,共有emer、 err、warn、info、dbg五个日志级别,dbg为最低级别,指定为dbg时,所有的日志信息都将输出,但此时可能导致日志系统迅速膨胀,而占用 越来越多的硬盘存储空间。

ovs-appctl --target=/usr/local/var/run/openvswitch/ovs-vswitchd.29384.ctl vlog/set

ANY:ANY:info

退出后台模块

让ovs-vswitchd停止运行

ovs-appctl --target=/usr/local/var/run/openvswitch/ovs-vswitchd.29384.ctl exit

你可能感兴趣的:(网络)