openvswitch 使用

https://www.cnblogs.com/wanstack/p/7606416.html

https://my.oschina.net/u/4402258/blog/3869065

https://blog.51cto.com/11555417/2163495

https://www.cnblogs.com/xiao987334176/p/11405416.html

https://blog.csdn.net/chenleiking/article/details/88142580

https://blog.csdn.net/ztejiagn/article/details/8755085?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.control

https://blog.csdn.net/yzg2010a/article/details/38611223?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-3&spm=1001.2101.3001.4242

https://blog.csdn.net/zcq8989/article/details/50346503?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

1 什么是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

 

2 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交换机工作时候的流表内容。

3 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状态。

 

(二)-概念及工作流程1

1 vswitch、Bridge、Datapath

 

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

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

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

 

1.1 网桥的工作原理

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

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

注意,网桥是以混杂模式工作的。关于网桥更多,请查阅相关资料。

2 OVS中的bridge

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

[root@localhost ~]# ovs-vsctl add-br brname(br-int)
 
[root@localhost ~]#  ifconfig
      br-int    Link encap:Ethernet  HWaddr 1a:09:56:ea:0b:49  
      inet6 addr: fe80::1809:56ff:feea:b49/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:1584 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 

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

ovs-vsctl add-port brname port

这里要特别注意,网卡加入网桥以后,要按照网桥的工作标准工作,那么加入的一个端口就必须是以混杂模式工作,工作在链路层,处理2层的帧,所以这个port就不需要配置IP了。(你没见过哪个交换的端口有IP的吧)

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

ip address add 192.168.1.1/24 dev brname

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

 
  1. [root@localhost ~]# ovs-vsctl show
    
    bc12c8d2-6900-42dd-9c1c-30e8ecb99a1b
    
    Bridge "br0"
    
    Port "eth0"
    
    Interface "eth0"
    
    Port "br0"
    
    Interface "br0"
    
    type: internal
    
    ovs_version: "1.4.0+build0"

     

  2.  

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

OpenvSwitch完全使用手册(二)-概念及工作流程2

这一部分我以一个简单的例子,说明在虚拟化环境中OpenvSwitch的典型工作流程。

前面已经说到,OVS主要是用来在虚拟化环境中。虚拟机之间一个虚拟机和外网之间的通信所用,如下是一个典型的结构图:

那么,通常情况下的工作流程如下:

  • 1 VM实例instance产生一个数据包并发送至实例内的虚拟网络接口VNIC,图中就是instance中的eth0.
  • 2 这个数据包会传送到物理节点上的VNIC接口,如图就是vnet接口。
  • 3 数据包从vnet NIC出来,到达桥(虚拟交换机)br100上.
  • 4 数据包经过交换机的处理,从物理节点上的物理接口发出,如图中物理节点上的eth0.
  • 5 数据包从eth0出去的时候,是按照物理节点上的路由以及默认网关操作的,这个时候该数据包其实已经不受你的控制

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

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

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

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

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

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

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

   需求四:数据包分析,Packet Mirror。物理交换机的一大卖点,当对某一端口的数据包感兴趣时(for trouble shooting , etc),可以配置各种span(SPAN, 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的消息;

 需求决定产品,正是由于在企业级云中,需要各种丰富的网络功能,VMware于n年前就推出了vSwitch、vDS等虚拟交换机。正是看到了云中的网络是一块大市场,Cisco才与VMware紧密合作,以partner的形式基于VMware kernel API开发出了自己的分布式虚拟交换机Nexus 1000V(功能对应于VMware的vDS)。可惜的是,这两款产品都是收费的。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 br0 flood_vlans 23

或者

ovs-vsctl clear bridge br0 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 br0 "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 br0  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等,一条流规则可有多个动作,动作执行按指定的先后顺序依次完成。

 

基本操作

查看虚拟交换机br0的信息

 

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

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

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

查看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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

===========================================================

 

openvswitch的原理和常用命令

一.Openvswitch工作原理

  openvSwitch是一个高质量的、多层虚拟交换机,使用开源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和VirtualBox。
  openvswitch是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer,KVM以及virtualBox多种虚拟化技术。在这种虚拟化的环境中,一个虚拟交换机主要有两个作用:传递虚拟机之间的流量,以及实现虚拟机和外界网络的通信。
  内核模块实现了多个“数据路径”(类似于网桥),每个都可以有多个“vports”(类似于桥内的端口)。每个数据路径也通过关联一下流表(flow table)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息。当有一个匹配的流时它执行对应的操作。如果没有匹配,它会将数据包送到用户空间的处理队列中(作为处理的一部分,用户空间可能会设置一个流用于以后碰到相同类型的数据包可以在内核中执行操作)。

1.OpenvSwitch的组成

 ovs的主要组成模块如下图所示:

  • ovs-vswitchd:OVS守护进程是,OVS的核心部件,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换(flow-based switching)。它和上层 controller 通信遵从 OPENFLOW 协议,它与 ovsdb-server 通信使用 OVSDB 协议,它和内核模块通过netlink通信,它支持多个独立的 datapath(网桥),它通过更改flow table 实现了绑定和VLAN等功能。
      
  • ovsdb-server:轻量级的数据库服务,主要保存了整个OVS 的配置信息,包括接口啊,交换内容,VLAN啊等等。ovs-vswitchd 会根据数据库中的配置信息工作。它于 manager 和 ovs-vswitchd 交换信息使用了OVSDB(JSON-RPC)的方式。
      
  • ovs-dpctl:一个工具,用来配置交换机内核模块,可以控制转发规则。  

  • ovs-vsctl:主要是获取或者更改ovs-vswitchd 的配置信息,此工具操作的时候会更新ovsdb-server 中的数据库。  

  • ovs-appctl:主要是向OVS 守护进程发送命令的,一般用不上。

  • ovsdbmonitor:GUI 工具来显示ovsdb-server 中数据信息。  

  • ovs-controller:一个简单的OpenFlow 控制器  

  • ovs-ofctl:用来控制OVS 作为OpenFlow 交换机工作时候的流表内容。

2. OpenvSwitch的工作流程

  下图通过ovs实现虚拟机和外部通信的过程,通信流程如下:

 

  1.VM实例 instance 产生一个数据包并发送至实例内的虚拟网络接口 VNIC,图中就是 instance 中的 eth0.
  2.这个数据包会传送到物理机上的VNIC接口,如图就是vnet接口.
  3.数据包从 vnet NIC 出来,到达桥(虚拟交换机) br100 上.
  4.数据包经过交换机的处理,从物理节点上的物理接口发出,如图中物理机上的 eth0 .
  5.数据包从 eth0 出去的时候,是按照物理节点上的路由以及默认网关操作的,这个时候该数 据包其实已经不受你的控制了.
  注:一般 L2 switch 连接 eth0 的这个口是一个 trunk 口, 因为虚拟机对应的 VNET 往往会设置 VLAN TAG, 可以通过对虚拟机对应的 vnet 打 VALN TAG 来控制虚拟机的网络广播域. 如果跑多个虚拟机的话, 多个虚拟机对应的 vnet 可以设置不同的 vlan tag, 那么这些虚拟机的数据包从 eth0(4)出去的时候, 会带上TAG标记. 这样也就必须是 trunk 口才行。

 

3.OpenvSwitch简单应用实例

  如下图所示,创建从物理机到物理机的网络拓扑:

 

  通过以下命令即可实现:

[root@localhost ~]# ovs-vsctl add-br br0 
[root@localhost ~]# ovs-vsctl add-port br0 eth0 

4.Openvswitch常见操作

# 添加网桥:
ovs-vsctl add-br br0  
  
# 列出所有网桥:
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
  
# 查看ovs的网络状态:
ovs-vsctl show
  
# 删除网桥上已经挂载的网口:
ovs-vsctl del-port br0 eth0
  
# 删除网桥:
ovs-vsctl del-br br0
  
# 设置控制器:
ovs-vsctl set-controller br0 tcp:ip:6633
  
# 删除控制器:
ovs-vsctl del-controller br0
  
# 设置支持OpenFlow Version 1.3:
ovs-vsctl set bridge br0 protocols=OpenFlow13  
  
# 删除OpenFlow支持设置:
ovs-vsctl clear bridge br0 protocols 
  
# 设置vlan标签:
ovs-vsctl add-port br0 vlan3 tag=3 -- set interface vlan3 type=internal
  
# 删除vlan标签:
ovs-vsctl del-port br0 vlan3 
  
# 查询 VLAN:
ovs-vsctl show 
ifconfig vlan3 
  
# 查看网桥上所有交换机端口的状态:
ovs-ofctl dump-ports br0
  
# 查看网桥上所有的流规则:
ovs-ofctl dump-flows br0
  
# 查看ovs的版本:
ovs-ofctl -V

# 给端口配置tag
ovs-vsctl set port br-ex tag=101

二.Neutron使用openvswitch网络通信的基本原理

Openstack在创建虚拟机进行网络配置的时候大致分为两个步骤:

  1、Nova-compute通过调度在主机侧创建虚拟机,并且创建好linux bridge,是否创建linux网桥取决于是否把安全组的功能打开,创建好bridge和veth类型的点对点端口,连接bridge设备和br-int网桥。

  2、Neutron-ovs-agent周期任务扫描到网桥上的端口发送rpc请求到neutron-server侧,获取端口的详细信息,进行网络配置,当然,不同类型的网络会进行不同的处理,OVS当前支持,vlan、vxlan、flat、gre类型的网络。

  具体虚拟机通信分为以下两种情况:

  • 同板虚拟机通信

 

  在报文入口方向打上vlan,在br-int网桥上进行二层的隔离,对neutron-ovs-agent来说,这个是一个内部vlan,因此,很显然,对于这个主机使用的network来说,在主机侧neutron-ovs-agent都会维护一个内部vlan,并且是一一对应的,用于不同network的虚拟机在板上的互相隔离,由于板内虚拟机通信不经过物理网口,因此,也不会受到网口带宽和物理交换机性能的影响。

  • 跨板虚拟机通信:

 

  这里以vlan类型网络举例,network的segment_id为100,即vlan为100,虚拟机出来的报文在进入br-int网桥上被打上内部的vlan,举例来说打上vlan 3,下行的流量在经过对应的网络平面后,vlan会进行对应的修改,通过ovs的flow table把vlan修改成真实的vlan值100;上行流量在br-int网桥上通过flow table把vlan 100修改成内部的vlan 3,flat网络原理类似,下行流量会在br-eth通过flow table strip_vlan送出网口,vxlan类型的网络稍有不同,不过原理也是类似。

 

这里再来一张我自己画的图

  1. 添加两个虚拟端口,互为peer  
    ip link add mgmt-eth2 type veth peer name eth2-mgmt  
    ip link set mgmt-eth2 up  
    ip link set eth2-mgmt up  
      
    2. 把上面的两个端口加到桥上  
    ovs-vsctl add-port br-mgmt mgmt-eth2  
    修改ovs的数据库  
    ovs-vsctl set interface mgmt-eth2 type=patch  
    ovs-vsctl set interface mgmt-eth2 options:peer=eth2-mgmt  
      
    3. 把上面的两个端口加到桥上  
    ovs-vsctl add-port br-eth2 eth2-mgmt  
    ovs-vsctl set interface eth2-mgmt type=patch  
    ovs-vsctl set interface eth2-mgmt options:peer=mgmt-eth2  
      
    4. ovs-vsctl add-port br-eth2 eth2  
      
    注意通过上面的方法添加完后,会在ifconfig中把上面的新加的port(如:mgmt-eth2, eth2-mgmt)一并显示出来  
      
      
    上面的1~4可以用下面的步骤来代替,且新加的veth不会出现在ifconfig中:  
    ovs-vsctl add-br br-mgmt  
    ovs-vsctl add-br br-eth2  
    ovs-vsctl add-port br-mgmt mgmt-eth2 -- set Interface mgmt-eth2 type=patch options:peer=eth2-mgmt  



#############

ovs-vsctl add-port br-eth2 eth2-mgmt -- set Interface eth2-mgmt type=patch options:peer=mgmt-eth2  
ovs-vsctl add-port br-eth2 eth2  
      
      
      
    ******************************************  
移除  
ovs-vsctl del-fail-mode ovs-br  
设置fail-mode  
ovs-vsctl set-fail-mode br-ex secure  
设置tag  
ovs-vsctl set port eth0-stor tag=102  


清除tag  
ovs-vsctl clear port br-eth1--br-mgmt tag  



ovs设置网桥MAC  
ovs-vsctl set bridge br-storage other-config:hwaddr=fa:16:3e:fe:8f:79  

=================================================

用Open vSwitch实现VLAN

用VLANs隔离虚拟机流量

本文是一篇翻译文章,翻译自Open vSwitch的官方文档——Isolating VM Traffic Using VLANs。系博主在尝试搭建ovs构建VLAN时百度上资料过少,算是填补一些空白。不喜欢看中文或者用能力看英文的同学请移步。

这篇配置手册旨在使用VLANs隔离虚拟机流量。

配置环境

该教程假设你的环境是按如下小节配置。

两个物理网络

  • 数据网络:虚拟机数据流量以太网(Ethernet),用来在虚拟机之间传输VLAN标记的流量。你的物理交换机要能够转发VLAN标记的流量并且物理交换机端口应该配置为VLAN中继(VLAN trunks)。(一般情况下这是默认设置。而如何配置你的物理交换机不在本文讨论范围。)
  • 管理网络:该网络并非必须存在,但却是一个简单的方式给予你的物理机一个远程连接的IP,因为IP地址不能直接赋给eth0(下面会进行更详细的说明)。

两台物理机

你的实验环境应该有两台主机,我们暂且称为Host1和Host2 。且两个主机都运行了Open vSwitch软件。每个主机都有两张网卡——eth0和eth1,按如下方式配置:

  • eth0连接到数据网络,上面不分配IP地址。
  • eth1连接到管理网络(如果有的话),上面有一个IP地址可以用来连接到该主机进行管理。

四台虚拟机

每台主机运行两个虚拟机(VM)。VM1和VM2运行在Host1上,VM3和VM4运行在Host2上。
每台虚拟机都有一个网络接口(interface),在宿主机上表现为Linux设备(比如tap0)。(注意:对于Xen/XenServer,虚拟机网络接口在宿主机上的名字类似“vif1.0”。其他Linux系统中可能显示为“vnet0”、“vnet1”等。)
下面的图描述了这篇配置手册里假设的实验环境:
环境配置

配置步骤

在Host1上按如下步骤配置:
1. 创建一个OVS网桥(bridge):
ovs-vsctl add-br br0
2. 将eth0加入网桥(默认情况,所有OVS端口都是VLAN中继的,所以eth0会发送所有VLAN数据):
ovs-vsctl add-port br0 eth0
注意:当你将eth0加入到OVS网桥中,任何分配给eth0的IP地址都将失效。所以在把eth0加入到OVS网桥前,分配给eth0的IP地址应该转移到另一个网络接口上。这就是我们要通过eth1来单独管理网络连接的原因。
3. 将VM1作为VLAN 100的一个“接入口”。这表示从VM1到OVS的流量会被取消标记(untagged)并被当做VLAN 100的一部分:
ovs-vsctl add-port br0 tap0 tag=100
4. 将VM2加入到VLAN 200.

在Host2上重复下面步骤:
1. 配置带eth0的网桥为一个VLAN中继:
ovs-vsctl add-br br0 ovs-vsctl add-port br0 eth0
2. 将VM3加入到VLAN 100:
ovs-vsctl add-port br0 tap0 tag=100
3. 将VM4加入到VLAN 200:
ovs-vsctl add-port br0 tap1 tag=200

测试

VM1应该能ping通VM3,因为它们在同一个VLAN中。
VM2也能ping通VM4,理由同上。
而从VM1/VM3 ping VM2/VM4则不行,因为它们属于不同VLAN。如果你有一个路由器配置为转发这两个VLAN的包,那应该能ping通,但是到达VM3的包的源MAC地址是路由的而不是VM1的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值