Open vSwitch

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Open vSwitch相关的知识,希望对你有一定的参考价值。

Open vSwitch 概述

Open vSwitch是由Nicira Networks主导的,运行在虚拟化平台上的虚拟交换机。OVS可以动态变化的端点提供2层交换功能,很好的控制虚拟网络中访问策略、网络隔离、流量监控等等。OVS遵循Apache2.0许可证,能同时支持多种标准的管理接口和协议。OVS也提供对OpenFlow协议的支持,用户可以使用任何OpenFlow协议的控制器对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,并执行对应的操作,例如转发数据到另外的端口。

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

OpenvSwitch,简称OVS是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer, KVM, and VirtualBox多种虚拟化技术。在虚拟化平台上,OVS可以动态变化的端口提供2层交换功能,很好控制虚拟网络中的访问策略、网络隔离、流量监控等等。

 

OpenvSwitch功能

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

 

Open vSwitch组成

ovs-vswitchd:守护进程,实现交换功能,和linux内核兼容模块一起,实现基于流的交换flow-based switching

ovs-server:轻量级的数据库服务,主要保存了整个OVS的配置信息,包括接口,交换内容,VLAN等。ovs-vswitchd会根据数据库中的配置信息工作

ovs-dpctl:一个工具,用来配置交换机内核模块,可以控制转发规则

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

ovs-appctl:GUI工具用来显示ovsdb-server中数据信息

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

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

 

OpenFlow

OpenFlow是用于管理交换机流表的协议,ovs-ofctl则是提供命令行工具。在没有配置OpenFlow控制器的模式下,用户可以使用ovs-ofctl命令通过OpenFlow协议去连接OVS,创建、修改或删除OVS中的流标项,并对OVS的运行状况进行动态监控。

所谓流表,可被视作是OpenFlow对网络设备的数据转发功能的一种抽象。在传统网络设备中,交换机和路由器的数据转发需要依赖设备中保存的二层MAC地址转发或者三层IP地址路由表,而OpenFlow交换机使用的流表也是如此,不过在它的表项中整合了整个网络中各个层次的网络配置信息,从而在进行数据转发时可以使用更丰富的规则。

在OpenFlow中,Flow被定义为某个特定的网络流量。例如,一个TCP连接就是一个Flow,或者从某个IP地址发出来的数据包,都可以被认为是一个Flow。支持OpenFlow协议的交换机应该包括一个或者多个流表,流表中的条目包含:数据包头信息、匹配成功后要执行的指定和统计信息。

当数据包进入OVS后,会将数据包和流表中的流表项进行匹配,如果发现了匹配的流表项,则执行该流表项中的指令集。相反,如果数据包在流表中没有发现任何匹配,OVS会通过控制通道把数据包发送到OpenFlow控制器中。

流表中常用字段:

in_port=port                传递数据包的端口OpenFlow的端口编号

dl_vlan=valn                数据包的Vlan Tag值,范围是0-4095,0xffff 代表不包含 VLAN Tag 的数据包

dl_src=<MAC>                匹配源或目标的MAC地址

dl_dst=<MAC>                01:00:00:00:00:00/01:00:00:00:00:00 代表广播地址

        00:00:00:00:00:00/01:00:00:00:00:00 代表单薄地址

dl_type=ethertype                匹配以太网协议类型

        dl_type=0x0800 代表IPv4协议

        dl_type=0x086dd 代表IPv6协议

        dl_type=0x0806  代表ARP协议

nw_src=ip[/netmask]        当dl_type=0x0800时,匹配源后目标的ipv4地址,可以使ip或者域名

nw_dst=ip[/netmask]

nw_proto=proto                和dl_type字段协同使用,当 dl_type=0x0800 时,匹配 IP 协议编号;当 dl_type=0x086dd 代表 IPv6 协议编号

table=number                 指定要使用的流表的编号,范围是 0-254。在不指定的情况下,默认值为 0。通过使用流表编号,可以创建或者修改多个 Table 中的 Flow

reg<idx>=value[/mask]         交换机中的寄存器的值。当一个数据包进入交换机时,所有的寄存器都被清零,用户可以通过 Action 的指令修改寄存器中的值

 

一个流规则中可能有多个动作,按照指定的先后顺序执行。

    output:port: 输出数据包到指定的端口。port 是指端口的 OpenFlow 端口编号

    mod_vlan_vid: 修改数据包中的 VLAN tag

    strip_vlan: 移除数据包中的 VLAN tag

    mod_dl_src/ mod_dl_dest: 修改源或者目标的 MAC 地址信息

    mod_nw_src/mod_nw_dst: 修改源或者目标的 IPv4 地址信息

    resubmit:port: 替换流表的 in_port 字段,并重新进行匹配

    load:value?>dst[start..end]: 写数据到指定的字段

OpenvSwitch和其它vswitch

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

VMware vNetwork distributed swtich以及思科的Cisco Nexus 1000V这种虚拟交换机提供一个集中式的控制方式。而OVS则是一个独立的vswitch,他运行在每个现实虚拟化的物理机器上,并提供远程管理

OVS提供了两种在虚拟化环境中远程管理的协议:

一个OpenFlow通过流表来管理交换机的行为

一个OVSDB management protocol用来暴露sietch的port状态

vswitch、Bridge、Datapath

在网络中,交换机和桥都是同一个概念,OVS实现了一个虚拟机以太网交换机,OVS也就是实现了一个以太桥。在OVS中,给一个交换机或一个桥叫DataPath

网桥也叫桥接器,连接两个局域网的设备,网桥工作在数据链路层,将两个LAN连接,根据MAC地址转发帧

Bridge:bridge代表一个以太网交换机,一个主机中可以创建多个Bridge设备

Port:端口相当于物理交换机的端口,每个Port都隶属于一个Brdige

Interface:连接到Port为bond模式后,Port和Interface才是已对多关系

Controller:OpenFlow控制器。OVS可以同事接受一个或多个OpenFlow控制器的管理

datapath:在OVS中,datapath负责执行数据交换,也就是把接收端口收到的数据在流表中匹配,并执行匹配到的动作

Flow table:每个datapath都和一个Flow table关联,当datapath接收到数据之后,OVS会在Flow table中查找可以匹配的Flow,执行对应的操作

 

安装openvswitch,配置外网网桥

yum install openvswitch-2.3.1-2.el7.x86_64.rpm -y

systemctl restart  openvswitch && systemctl enable openvswitch

ovs-vsctl add-br br-wan  添加网桥

ovs-vsctl add-br br-lan

ovs-vsctl del-br br-lan  删除网桥

ovs-vsctl del-br br-wan

给网桥配置管理ip

ip address add 192.168.1.1/24 dev br-wan

 

将br-wan连接到上联(机房外网交换机)网卡设备

ovs-vsctl add-port br-wan ${uploadeth} -- set Port ${uploadeth} trunks=80,140,210,260,300,440,610 -- set Interface ${uploadeth} ofport_request=32

ovs-vsctl add-port br-wan ens160

ovs-vsctl del-port br-wan ens160

 

添加外网网络节点到计算节点的隧道vtep,请将计算节点IP放置在/tmp/file下,也可以单条逐个添加!

cat /tmp/file.txt |while read line

do

ovs-vsctl add-port br-wan vxlan${line} -- set Interface vxlan${line} type=vxlan option:remote_ip=${line} option:key=flow

done

 

查表

ovs-vsctl list bridge br-wan

 

 

openvswihch组成

每个of交换机(switch)都有一张流表,进行包查找和转发。交换机可以通过of协议经一个安全通道连接到外部控制器(controller),对流表进行查询和管理。

流表包括包头域(header fileds,匹配包头多个域)、活动计数器(counters)、0个或多个执行行动(actions)。对每个包进行查找,如果匹配则执行相关策略,否则通过安全通道将包转发到控制器,控制器来决策相关行为。流表项可以将包转发到一个或者多个接口。

流表

流表是交换机进行转发策略控制的核心数据结构。交换芯片通过查找流表项来决策对进入交换机的网络流量采取合适的行为。

包头域

包头域包括12个域,进入接口、Ethernet源地址、目标地址、类型、vlan idvlan优先级、ip源地址、目标地址、协议、IP Tos位、TCP/UDP目标端口、源端口。每个域包括一个确定值或者所有值(any),更准确的匹配可以通过掩码实现。

流表包头域

Ingress port

Ether Source

Ether Dst

Ether Type

Vlan id

Vlan priority

IP src

IP dst

IP proto

IP ToS   bits

TCP/UDP   Src Port

TCP/UDP   Dst Port

 

 

 

 




























http://www.ibm.com/developerworks/cn/cloud/library/1401_zhaoyi_openswitch/


以上是关于Open vSwitch的主要内容,如果未能解决你的问题,请参考以下文章

无法从“smart_open”导入名称“open”

emwin f_open用法

为啥 IPC::Open2::open2 返回父进程 ID?

window.open返回值问题

window.open()的用法

python中用open保存文本到桌面