使用开源交换机(Open vSwitch)软件

Open vSwitch安装及部署

这一部分我参考了一篇大佬的博客:ubuntu安装运行Open vSwitch

Open vSwitch网桥管理

网桥相关的基本概念

  在网络中,交换机和桥概念类似,Open vSwitch是一个虚拟交换软件,也就是说,Open vSwitch实现了网桥的功能。学习Open vSwitch的第一步要弄清楚网桥的概念。网桥是连接两个局域网的设备,工作在数据链路层,根据MAC地址来转发帧。在Open vSwitch中创建一个网桥后,此时网络功能不受影响,但是会产生一个虚拟网卡,之所以会产生一个虚拟网卡,是为了实现接下来的网桥(交换机)功能。有了这个网桥以后,还需要为这个网桥增加端口(port),一个端口就是一个物理网卡,当网卡加入到这个网桥之后,其工作方式就和普通交换机的一个端口的工作方式类似了。

  创建桥的时候会创建一个和桥名字一样的接口,并自动作为该桥的一个端口,那么这个虚拟接口的作用,一方面是可以作为交换机的管理端口,另一方面也是基于这个虚拟接口实现了桥的功能。Open vSwitch的内核模块实现了多个“数据路径”,每个都可以有多个vports。每个数据路径也通过关联流表(flow table)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息,当有一个匹配的流时它执行对应的操作,如果没有匹配,它会将数据包送到用户空间的处理队列中,作为处理的一部分,用户空间可能会设置一个流用于以后碰到相同类型的数据包可以在内核中执行操作。

常用的网桥命令,进行网桥和端口的添加、删除、查看等操作

ovs-vsctl关于网桥管理的常用命令如下:

命令 含义
init 初始化数据库(前提数据分组为空)
show 打印数据库信息摘要
add-br BRIDGE 添加新的网桥
del-br BRIDGE 删除网桥
list-br 打印网桥摘要信息
list-ports BRIDGE 打印网桥中所有port摘要信息
add-port BRIDGE PORT 向网桥中添加端口
del-port [BRIDGE] PORT 删除网桥上的端口
get-controller BRIDGE 获取网桥的控制器信息
del-controller BRIDGE 删除网桥的控制器信息
set-controller BRIDGE TARGET 向网桥添加控制器

Open vSwitch流表管理

Open vSwitch流表的基本概念。

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

  在OpenFlow白皮书中,Flow被定义为某个特定的网络流量。例如,一个TCP连接就是一个Flow,或者从某个IP地址发出来的数据包,都可以被认为是一个Flow。支持OpenFlow协议的交换机应该包括一个或多个流表,流表中的条目包含:数据包头的信息、匹配成功后要执行的指令和统计信息。当数据包进入OVS后,会将数据包和流表中的流表项进行匹配,如果发现了匹配的流表项,则执行该流表项中的指令集。相反,如果数据包在流表中没有发现任何匹配,OVS会通过控制通道把数据包发到OpenFlow控制器中。

常用的流表命令,进行流表的添加、删除、查看等操作

ovs-ofctl关于流表管理的常用命令如下表所示。

命令 含义
show SWITCH 输出OpenFlow信息
dump-ports SWITCH PORT 输出端口统计信息
dump-ports-desc SWITCH 输出端口描述信息
dump-flows SWITCH 输出交换机中所有的流表项
dump-flows SWITCH FLOW 输出交换机中匹配的流表项
add-flow SWITCH FLOW 向交换机中添加流表项
add-flows SWITCH FILE 在文件中向交换机添加流表项
mod-flows SWITCH FLOW 修改交换机的流表项
del-flows SWITCH FLOW 删除交换机的流表项

  对于add-flow、add-flows和mod-flows这3个命令,还需要指定要执行的动作actions=[target],[target]…,一个流规则中可能有多个动作,按照指定的先后顺序执行。
常见的流表操作如下表所示。

操作 说明
output:port 输出数据包到指定端口,port指端口的OpenFlow端口编号
mod_vlan_vid 修改数据包中的VLANtag
strip_vlan 移除数据包中的VLANtag
mod_dl_src/mod_dl_dest 修改源或者目标MAC地址信息
mod_nw_src/mod_nw_dst 修改源或者目标IPv4地址信息
resubmit:port 替换流表的in_port字段,并重新进行匹配
load:value->dst[start, end] 写数据到指定字段

  在OVS中,流表项作为ovs-ofctl的参数,采用如下的格式:字段=值,如果有多个字段,可以用逗号或空格分开,一些常用的字段列举如下表所示。

字段名称 说明
in_port=port 传递数据包端口的OpenFlow端口编号
dl_vlan=vlan 数据包的VLANTag值,范围0-4095,0xffff代表不包含VLANTag
dl_src(dst)=< MAC> 匹配源/目标MAC地址
dl_type=ethertype 匹配以太网协议类型:0x800代表IPv4;0x86dd代表IPv6;0x806代表ARP
nw_src(dst)=ip[/netmask] 匹配源或目标IPv4地址,可以使用IP地址或域名
nw_proto=proto 与dl_type协同使用,匹配IP/IPv6编号
table=number 流表编号,范围0-254,默认为0
reg< idx>=value[/mask] 交换机中寄存器的值

Open vSwitch 端口镜像

端口镜像的作用,利用Open vSwitch设置端口映射

  端口镜像(port Mirroring)是把交换机一个或多个端口(VLAN)的数据镜像到一个或多个端口的方法。在一些交换机中,我们可以通过对交换机的配置来实现将某个端口上的数据包,拷贝一份到另外一个端口上,这个过程就是端口镜像。

  • 端口映射:把在公网的地址转翻译成私有地址,或者反过来。比如你通过路由器用ADSL上百度,你本机地址是192.168.1.10,但百度看到的IP地址是你的路由器的IP地址。百度把数据发送给路由器,你的路由器通过内置的端口映射表把数据转发给你。
  • 端口镜像:把一个端口上的数据同时发送到原端口和另外一个端口,相当于另外一个端口得到了一个复本。它跟端口映射的主要区别在于:映射的目的是转发,而镜像的目的是复制!

  这里原文中写的是端口映射,可能是笔误,所以这里就统一为端口镜像
图1-1
  端口1为镜像端口,端口2为被镜像端口,因为通过端口1可以看到端口2的流量,所以我们也称端口1为监控端口,而端口2为被监控端口。
  部署IDS产品需要监听网络流量(网络分析仪同样也需要),但是在目前广泛采用的交换网络中监听所有流量有相当大的困难,因此需要通过配置交换机来把一个或多个端口(VLAN)的数据转发到某一个端口来实现对网络的监听。
  端口镜像可以监视到进出网络的所有数据包,如网吧需提供此功能把数据发往公安部门审查。而企业出于信息安全、保护公司机密的需要,也迫切需要网络中有一个端口能提供这种实时监控功能。在企业中用端口镜像功能,可以很好的对企业内部的网络数据进行监控管理,在网络出现故障的时候,可以做到很好地故障定位。

ovs-vsctl list port |more //查看端口uuid,这个地方port是固定搭配,无需改动
ovs-vsctl -- set bridge br-sw mirrors=@m -- --id=@m create mirror name=mymirror select-dst-port=eth1_uuid select-src-port=eth2_uuid output-port=eth3_uuid   //执行该命令将发往eth1端口和从eth2端口发出的数据包全部定向到eth3端口

第一条命令还好,但是第二条确实有点长了,下面就分解一下:
ovs-vsctl – set bridge br-sw mirrors=@m – --id=@m create mirror其中br-sw是执行该操作的目标网桥(交换机),即在br-sw上实施该端口镜像。下面是操作字段表:

字段名称 说明
name=mymirror 设置该镜像的名字
select-dst-port=dst_port 以dst_port为被镜像端口,拷贝所有发往该端口的数据
select-src-port=src_port 以src_port为被镜像端口,拷贝所有从该端口发出的数据
output-port=port 镜像端口,所有被监视端口规定方向数据拷贝发到本端口

其中name字段和output-port字段是必须有的,剩下的两者至少存在一个。

Open vSwitch QoS设置

QoS(Quality of Service)等相关网络知识

  QoS(Quality of Service)即服务质量。指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力。在正常情况下,如果网络只用于特定的无时间限制的应用系统,并不需要QoS,比如Web应用或E-mail设置等。但是对关键应用和多媒体应用就十分必要。当网络过载或拥塞时,QoS能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。对于网络业务,服务质量包括传输的带宽、传送的时延、数据的丢包率等。在网络中可以通过保证传输的带宽、降低传送的时延、降低数据的丢包率以及时延抖动等措施来提高服务质量。本次实验通过设置Open vSwitch接口速率进行报文流量监管(Commit Access Rate,简称CAR)。CAR利用令牌桶(Token Bucket,简称TB)进行流量控制。下图所示为利用CAR进行流量控制的基本处理过程:
在这里插入图片描述
  首先,根据预先设置的匹配规则来对报文进行分类,如果是没有规定流量特性的报文,就直接继续发送,并不需要经过令牌桶的处理;如果是需要进行流量控制的报文,则会进入令牌桶中进行处理。如果令牌桶中有足够的令牌可以用来发送报文,则允许报文通过,报文可以被继续发送下去。如果令牌桶中的令牌不满足报文的发送条件,则报文被丢弃。这样,就可以对某类报文的流量进行控制。
  Open vSwitch本身并不具备QoS功能,是基于linux的”tc”(流量控制器)功能实现的,是已经在Linux内核中存在的功能。而Open vSwitch所做的是对其部分支持的tc功能进行配置。在Linux的QoS中,接收数据包使用的方法叫策略(policing),当速率超过了配置速率,就简单的把数据包丢弃。不通过OpenFlow设置,直接在interface上设置。例如:

  • ovs-vsctl set interface vif1.0 ingress_policing_rate=10000
  • ovs-vsctl set interface vif1.0 ingress_policing_burst=8000

  上面两行命令,把虚拟端口vif1.0的最大接收速率设置为10000kbps,桶大小设置为8000kb。策略使用了简单的令牌桶(token bucket)算法。我们以一定的速度不断生成令牌,除非令牌桶装满。每接收一个包,需要消耗一个令牌;如果没有令牌了,就会把新到达的包丢弃。如果到达包的速度大于令牌的生成速度,那么令牌很快消耗干净,新到达的包只能丢弃,那么接收包的速度很快就降下来,和令牌的生成速度一致。所以接收包的速度依赖于令牌的生成速度,换句话说,不能大于令牌的生成速度,也就是最大接收速率,即ingree_policing_rate的值,单位是kbps。如果到达包的速度小于令牌的生成速度,那么令牌很快堆满令牌桶,这时到达包的速度突然增大,令牌桶中有足够的令牌。这一瞬间可供消耗的令牌有桶中的令牌,也有不断生成的令牌,导致接收包的速度也会突然增大,大于令牌的生成速度,也就是大于我们设置的最大接收速率,称为突发接收速率。这时虽然突发接收速率大于最大接受速率,但是也是有限制的,最多增加的速率(最大突发接收速率减去最大接收速率)依赖于桶的大小,换句话说,增加的吞吐量不能大于桶的大小,即ingress_policing_burst的值,单位是kb。在上面的例子中,如果所有包的大小都是1kb,那么最多增加的速率达到8000kbps,最大突发接收速率达到18000kbps。
  :接口和端口是两个比较容易混淆的概念。一般是物理上的概念,主机后面的就是接口,有KVM接口、以太网接口、同步串口等,也可以是逻辑上的概念比如VLAN的interface。端口是TCP/UDP协议的一个概念,用来区分某种应用,例如telnet的端口是23、而www的端口是80等。Open vSwitch既可以针对网络接口,也可以针对端口设置QoS,本实验中的QoS设置就是一个针对接口设置QoS的用例。

利用Open vSwitch调控网络性能

一、检验环境
ifconfig查看主机ip;两台主机之间进行ping操作确保互通

二、测试主机间的吞吐量
在主机1上执行以下命令,确认Open vSwitch进程。

ps -ef | grep ovs

执行以下命令,创建网桥br0,并将eth0网卡挂接到br0。

ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth0

将eth0挂接到br0后,ovs云主机无法与其他主机通信,执行以下命令将eth0的IP赋给br0,如下图所示。

ifconfig eth0 0 up
ifconfig br0 30.0.1.8/24 up
ifconfig

在这里插入图片描述
将Open vSwitch主机作为服务器端,在主机1上执行如下命令启动netServer。

netserver -p 9991

说明:服务器端启动后,默认程序在后台启动,可以用ps -ef|grep netServer命令查看进程,无须反复启动

将Netperf主机作为客户端,在主机2上执行以下命令,测量与服务器主机之间的吞吐量。

netperf -t UDP_STREAM -H 30.0.1.8 -p 9991

在这里插入图片描述
三、设置QoS参数
在主机1上执行以下命令设置eth0吞吐量为100±50Mbps。

ovs-vsctl set interface eth0 ingress_policing_rate=100000
ovs-vsctl set interface eth0 ingress_policing_burst=50000

说明:利用ingress_policing_rate设置eth0端口最大速率(kbps),ingress_policing_burst设置最大浮动速率(kbps)。

执行以下命令启动客户端,测量服务器与主机之间的吞吐量,如下图所示。

netperf -t UDP_STREAM -H 30.0.1.8 -p 9991

在这里插入图片描述
由上图可以看出,远端接收速率明显降低。

Open vSwitch流量监控

  本来本人都是将提到的所有软件都安装在了虚拟机上,但是后来还是发现,用致网平台更好一点,所以以后的环境都借用致网了。当然下面还是提供了安装sFlow的方法,希望大家都能找到更适合自己的方式。不过以后的网络拓补逐渐复杂,规模也逐步扩大,可能自己的电脑会带不动,还是用在线平台吧,一劳永逸。

部署sFlow Collector和sFlow Agent

  互联网及SDN迅速发展的同时,网络安全问题日益成为人们关注的焦点,病毒、恶意攻击、非法访问等都容易影响网络的正常运行。网络流量监控是一种分析网络状况的有效方法,通过实时收集和监视网络数据包的流量信息,来检查是否有违反安全策略的行为和网络工作异常的迹象,并为优化网络性能提供参考。sFlow技术是一种以设备端口为基本单元的数据流随机采样的流量监控技术,不仅可以提供完整的第二层到第四层甚至全网范围内的实时流量信息,而且可以适应超大网络流量(如大于10Gbit/s)环境下的流量分析,让用户详细、实时地分析网络传输流的性能、趋势和存在的问题。sFlow监控工具由sFlow Agent和sFlow Collector两部分组成。Agent作为客户端,一般内嵌于网络转发设备(如交换机、路由器),通过获取本设备上的接口统计信息和数据信息,将信息封装成sFlow报文,当sFlow报文缓冲区满或是在sFlow报文缓存时间(缓存时间为1秒)超时后,sFlow Agent会将sFlow报文发送到指定的Collector。Collector作为远端服务器,负责对sFlow报文分析、汇总、生成流量报告。sFlow的基本工作原理如下图所示:

  本次实验使用两台虚拟机,虚拟机1部署Mininet服务并配置sFlow Agent,虚拟机2安装sFlow Collector,在虚拟机1的Mininet环境中模拟创建一个交换机下挂2个主机的网络拓扑,通过执行Ping测试来产生网络流量,然后通过在Collector Web界面查看监控结果。
实验网络拓扑如下所示:在这里插入图片描述

使用sFlow对Mininet模拟的Open vSwitch端口流量进行监控

一、部署sFlow Collector
  首先,要想安装sFlow的话,首先要安装JAVA,我参考了一篇大佬的博客:(我选择了直接命令行安装,因为也挺快的,环境也是用的虚拟机Ubuntu18.04)

  1. 更新软件包列表:
sudo apt-get update
  1. 安装openjdk-8-jdk:
sudo apt-get install openjdk-8-jdk
  1. 查看java版本,看看是否安装成功:
java -version

结果如下图:
在这里插入图片描述
然后就是压缩包的下载,参考这篇文章
下载sFlow-rt:wget http://www.inmon.com/products/sFlow-RT/sflow-rt.tar.gz(这个方法有点慢,耐心等待下就好了)
将sFlow Collector安装包解压安装,如下图所示。

tar -zxvf sflow-rt.tar.gz
cd sflow-rt
./start.sh

在这里插入图片描述
上图表示sFlow Collector已经启动,默认监听端口为6343,可以通过虚拟机内置的浏览器输入http://localhost:8008 打开监控页面。

二、部署sFlow Agent
步骤1 选择主机1,单击终端图标,进入命令行终端。执行 su root切换到root用户。
步骤2 执行如下命令,进入root家目录,启动Mininet服务,模拟搭建一个交换机下挂2个主机的网络拓扑结构,结果如下图所示。

cd
screen mn

这里的screen真不知道是个什么东西,下面还没做,我环境崩了,重新搭一下先
在这里插入图片描述
步骤3 在Mininet窗口输入nodes命令查看所有节点信息,如下图所示。
在这里插入图片描述
由上图可知,当前有主机h1和h2、默认控制器c0、网桥s1。

步骤4 执行h1 ifconfig命令,查看h1的网卡信息,如下图所示。
在这里插入图片描述
由上图可知,h1的IP是10网段。

步骤5 打开另一个终端界面,输入ifconfig查看当前网卡状态,如下图所示。
在这里插入图片描述
由上图可知,网桥s1无IP。

步骤6 执行su root切换到root用户,然后执行如下命令把eth0端口IP复制给s1。

ovs-vsctl add-port s1 eth0
ifconfig s1 192.168.1.4 netmask 255.255.255.0
ifconfig eth0 0 up

说明:通过eth0端口是无法监控到Mininet内部两个主机的ping测试。因此需要把eth0端口IP复制给s1,由s1端口作为sFlow Agent来监听。其中192.168.1.4是主机1的IP地址。

步骤7 输入ifconfig |more命令查看配置后的各端口状态,如下图所示。
在这里插入图片描述
由上图可知,s1已经得到eth0之前的IP和掩码,eth0无IP。

步骤8 切换到Mininet窗口,执行h1 ping h2,检查端口是否配置正确。如果Ping通,则一直保持Ping状态产生流量,否则仔细检查配置。
在这里插入图片描述
步骤9 切换到虚拟机界面,开启OvS的sFlow功能,并配置sFlow Agent,命令如下。

ovs-vsctl -- --id=@sflow create sFlow agent=s1 target=\"192.168.1.3:6343\" header=128 sampling=64 polling=1 -- set bridge s1 sflow=@sflow

注意:该命令执行的次数和需要开启sflow的网桥的数目有关,有几个网桥,就需要执行几次此命令。参数说明如下:

agent:虚拟机对应的某个监控流量的网卡,本实验用s1网卡产生和监控流量。
target:sFlow Collector的IP,默认端口6343。
bridge:需要开启sflow的网桥。
步骤10 配置完成后,输入如下命令查看已经配置的Agent信息。

ovs-vsctl list sflow

在这里插入图片描述
说明:如果要删除该条Agent信息,可以用如下命令,在本次实验中不用执行这条命令:

ovs-vsctl remove bridge s1 sflow $SFLOWUUID

步骤11 在虚拟机窗口输入ip link命令,查看交换机端口名称与端口编号的映射关系,如下图所示。
在这里插入图片描述
由上图可知,eth0对应的编号是2,s1-eth1对应的编号是3,s1-eth2对应的编号是5,s1对应的编号是8。

三、查看监控结果
步骤1 登录主机1,输入http://localhost:8008 ,在登录sFlow Collector Web页面,查看Agents选项卡,可知已将虚拟机1(192.168.1.4)加到监控对象。
在这里插入图片描述
步骤2 单击“192.168.1.4”,进入该虚拟机所监控的端口列表页面,如下编号为2、3、5、8的端口都有监控:
在这里插入图片描述
在这里插入图片描述
步骤3 单击任意条目查看端口在4分钟内输入和输出两个方向的流量信息,包括丢包数、差错数、多播速率、使用率、端口速率等,下图是eth0的2.ifinpkts和2.ifinoctets在4分钟内的流量情况。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40788897/article/details/105176287