《实战录》导语
云端卫士《实战录》栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,2017年我们将一如既往地为朋友们奉献更多优质内容。本期分享人为云端卫士工程师欧文玉美眉,主要介绍OFTest 的安装和使用。
1. OFTest简介
OFTest是基于python的用于测试openflow交换机的框架,现已经可以用来测试Openflow 1.0, 1.2, 1.3, 1.4版本。它在测试环境中相当于一个控制器,可以主动或被动的与交换机连接,从而获取of交换机的信息并测试交换机的基本功能。
OFTest对OpenFlow不同协议的支持是通过分析控制平面和数据平面的数据包来判定的,如果oftest发送给交换机的消息得到了交换机的响应,则确定该交换机支持这项功能,反之则认为该交换机不支持。
OFTest测试框架如图1所示:
2. 安装OFTest
所用环境:一台系统为centos7的虚拟机
2.1安装依赖
首先需要安装python2.7,如果已经安装了,先用version命令确认一下自己的虚机中是不是2.7版本的,如果不是的话最好升级一下,此处就不详细说明了。
其次安装scapy,注意这里是scapy不是scrapy,scapy安装直接使用yum即可,命令如下:
# yum install scapy
其他可选软件:pypcapy,tcpdump(最好要有),doxygen,doxpy,lint(我未安装)。如果没有安装pypcapy可能会导致有关使用VLAN标签的测试失败。
2.2安装OFTest
Oftest代码直接从github下载:
# git clone git://github.com/floodlight/oftest
# cd oftest
运行OFTest
# ./oft
oftest/oft脚本是进入test框架的接入点,所有测试例都从oft脚本开始运行并在test mode list中进行匹配,所以下载完成后便可以直接使用./oft运行所有的测试用例,如需选择性的运行只需加上对应参数。运行oftest框架包括两个部分:
(1)建立支持OF协议的python库,所有测试脚本都用python写;
(2)运行oft 。
2.3配置OFTest
OFTest运行时默认为openflow 1.0,若要测试其他版本只需要将oft中的参数openflow_version改为相应的版本即可。 1.2、1.3、1.4的测试例分别在文件夹tests-1.2 ,tests-1.3,test-1.4中,可见测试例很少,需要根据需要自己添加。添加测试例需要按照相应的版本协议构建数据包。
# Switch connection options
……
"openflow_version" : "1.0",//修改此处切换版本号
测试远程交换机时,需要修改remote.py中的参数,按自己虚机和交换机的实际情况修改,如下:
# Update this dictionary to suit your environment.
remote_port_map = {
23 : "eth2",//of交换机的23端口连接到OFTest本地eth2
24 : "eth3",
25 : "eth4",
26 : "eth5"
}
修改配置之后运行./oft提示“port_map”失败,可先运行./run_switch.py激活交换机。
注意:oftest与onos一样是连接到6653口上的控制器,所以不能同时运行!
运行以下脚本确保交换机已连接到控制器并且用例能启动:./oft basic.Echo
显示成功:
以/test-1.3/groups.py为例
一个class即为一个测试用例,使用前可以进入测试用例脚本查看所需的用例,然后输入命令:# ./oft groups.GroupAdd
即可运行此用例。
以下是OFTest常用的命令参数:
表 1. OFTest命令通用参数
说明:--list详细的罗列出所有的测试用例,包括标准用例、非标准用例和禁用用例,非标准用例使用'*'标志,可要求供应商扩展或特殊的交换机配置。禁用用例通常用于试验,有某些特殊用途的,或者是太长而无法正常运行,这些都不是标准测试组的一部分。
--list-test-names屏蔽了对每一个测试例的解释。
其余命令视情况用--help查询,这里就不一一例举了。
3. 实战演练
3.1用优先级来测试交换机flow容量
测试交换机型号:盛科v350
首先用python写好测试用的代码,大致如下:
class Overwrite(base_tests.SimpleDataPlane):
"""
Verify that overwriting a flow changes most fields but preserves stats
"""
def runTest(self):
in_port, out_port1, out_port2 = openflow_ports(3)
delete_all_flows(self.controller) //首先清空所有flow
table_id = test_param_get("table", 0)
match = ofp.match([
ofp.oxm.in_port(in_port),
])
priority = 1
ppid = priority
while ppid < 3000: //设置优先级数值如果小于3000则递增
logging.info("Inserting flow")
request = ofp.message.flow_add(
table_id=table_id,
match=match,
instructions=[
ofp.instruction.apply_actions([ofp.action.output(out_port1)]),
],
buffer_id=ofp.OFP_NO_BUFFER,
priority=ppid,
flags=ofp.OFPFF_SEND_FLOW_REM,
cookie=random.randint(0,9007199254740992))//构造flow表
self.controller.message_send(request)
do_barrier(self.controller)
ppid += 1
# Check that the fields in the flow stats entry match the second flow-add
stats = get_flow_stats(self, ofp.match())
self.assertEquals(len(stats), 1)
entry = stats[0]
logging.debug(entry.show())
self.assertEquals(entry.instructions, request.instructions)
self.assertEquals(entry.flags, request.flags)
self.assertEquals(entry.cookie, request.cookie)
将代码保存到tests-1.3目录下,并执行命令:./oft flow
等代码运行结束,到交换机上查询结果,观察最高优先级的那条flow即可得知交换机最大容量,如图:
此处使用3000作为最大值的原因是,估测到此交换机的容量大约为2000多条,使用者可根据实际情况更改用例。
3.2用groupId来测试group表容量
代码大致如下:
class GroupAdd(GroupTest):
def runTest(self):
port1, = openflow_ports(1)
id = 0
while id < 64: //设置groupid最大值,如果小于64则递增
msg = ofp.message.group_add(
group_type=ofp.OFPGT_ALL,
group_id=id,
buckets=[
ofp.bucket(actions=[ofp.action.output(port1)])])
self.controller.message_send(msg)
do_barrier(self.controller)
id+=1 //构建group表
Stats= get_stats(self, ofp.message.group_desc_stats_request())
self.assertEquals(stats, [
ofp.group_desc_stats_entry(
group_type=msg.group_type,
group_id=msg.group_id,
buckets=msg.buckets)])
等代码运行结束,到交换机上查询结果,观察groupId最大的那条group表即可得知交换机最大容量,如图:
原理与flow的测试用例相似。
4.总结
用oftest的测试用例来测试,用例运行结束后提示的成功或失败并不是最重要的,重要的是交换机上的表项结果是否达成预期。
参考http://blog.163.com/he_junwei/blog/static/1979376462015124410240/
http://blog.csdn.net/sdnlab/article/details/41962879
“云端卫士”是中盈优创资讯科技有限公司旗下的系列安全产品的主品牌,为客户提供全系列、一体化、可运营的安全产品,包括网络攻击追踪溯源系统、网络攻击检测分析系统、网络流量态势感知系统、安全威胁态势感知系统、安全运营支撑系统、分布式抗拒绝服务攻击系统等。更多信息请拨打400-818-5108咨询,或访问www.cloudguarder.com