Openflow流表学习

任务目的

1、 掌握OpenFlow流表和流表项基础知识。
2、 掌握OpenFlow流表匹配规则。
3、 掌握基本的OpenFlow流表操作方法。

任务环境
设备名称 软件环境(镜像) 硬件环境
控制器 RYU4.7.0桌面版 CPU:2核 内存:4G 磁盘:20G
交换机 Open vSwitch 2.3.1命令行版 CPU:1核 内存:2G 磁盘:20G
主机 Mininet2.2.0桌面版 CPU:1核 内存:2G 磁盘:20G

注:
root用户的用户名/密码为root/root@openlab
openlab用户的用户名/密码为openlab/user@openlab

任务内容

1、 学习OpenFlow流表和流表项基础知识。
2、 学习OpenFlow流表匹配规则。
3、 学习基本的OpenFlow流表操作方法。

实验原理

OpenFlow是一种新型的网络协议,它是控制器和交换机之间的标准协议。自2009年底发布1.0版本后,OpenFlow协议又经历了1.1、1.2、1.3及1.4版本的演进过程,目前使用和支持最多的是1.0和1.3版本。OpenFlow1.3在1.0版的基础上进一步优化及升级,其中添加了很多新的特性及消息,如支持多个流表(flow table)、组表(group table),支持多控制器等。一个流表中包含多个流表项,OpenFlow v1.3中流表项主要由7部分组成,分别是匹配域(用来识别该条表项对应的flow)、优先级(定义流表项的优先顺序)、计数器(用于保存与条目相关统计信息),指令(匹配表项后需要对数据分组执行的动作)、TimeoutsCookieFlags,如下图所示。
Openflow流表学习_第1张图片
与OpenFlow v1.0不同的是,OpenFlow v1.3协议中一台OF交换机会有多张流表。具体匹配流程如下图所示。
Openflow流表学习_第2张图片
首先交换机解析进入设备的数据分组,然后从table 0开始匹配,按照优先级高低依次匹配该流表中的流表项,一个数据分组在一个流表中只会匹配上一条流表项。通常根据数据分组的类型,分组头的字段例如源MAC地址、目的MAC地址、源IP地址、目的IP地址等进行匹配。也可以通过数据分组的入端口或元数据信息来进行数据分组的匹配,一个流表项中可以同时存在多个匹配项,一个数据分组需要同时匹配流表项中所有匹配项才能匹配该流表项。数据分组匹配按照现有的数据分组字段进行,比如前一个流表通过apply actions改变了该数据分组的某个字段,则下一个表项按修改后的字段进行匹配。如果匹配成功,则按照指令集里的动作更新动作集,或更新数据分组/匹配集字段,或更新元数据和计数器。根据指令是否继续前往下一个流表,不继续则终止匹配流程执行动作集,如果指令要求继续前往下一个流表则继续匹配,下一个流表的ID需要比当前流表ID大。当数据分组匹配失败了,如果存在无匹配流表项(table miss)就按照该表项执行指令。一般是将数据分组转发给控制器、丢弃或转发给其他流表。如果没有table miss表项则默认丢弃该数据分组。

实验步骤

一、创建实验

步骤1 登录OpenLab实验平台,选择“实验课程 > SDN > OpenFlow流表学习”。

说明:当前有正在进行的实验课程时,请单击“结束”,结束课程。

步骤2 创建实验,目前支持两种创建实验的模式,具体如下:

  • 实验模式为“上课模式”时:单击实验名称出现一提示框,单击“进入详情”进入实验详情页面,后台自动创建实验,单击“进入实验“即可。
  • 实验模式为“浏览模式”时,单击实验名称进入实验详情页面,单击“开始实验”,创建实验。

步骤3 课程实验创建完成后,进入对应的操作界面。

步骤4 单击“实验拓扑”按钮。如下图所示:

Openflow流表学习_第3张图片

步骤5 实验拓扑及各端口连接情况如下图所示:

Openflow流表学习_第4张图片

二、流表学习

步骤 1 登录OpenFlow交换机。切换至root用户。执行命令ovs-vsctl set-controller br-sw tcp:30.0.1.3:6633。

步骤 2 登录控制器,切换到root用户。输入如下命令,启动RYU相关应用。

$ ryu-manager --verbose --observe-links ryu.topology.switches ryu.app.rest_topology ryu.app.ofctl_rest ryu.app.simple_switch_13

Openflow流表学习_第5张图片

步骤 3 再打开新的命令窗口,切换到root用户。执行wireshark命令启动Wireshark,如下图所示。

Openflow流表学习_第6张图片

步骤 4 双击eth0,开始抓包,如下图所示。

Openflow流表学习_第7张图片

步骤 5 登录主机1,执行命令ifconfig,获取主机1IP地址,如下图所示:

Openflow流表学习_第8张图片

步骤 6 登录主机2,执行命令ifconfig,获取主机2IP地址,如下图所示:

Openflow流表学习_第9张图片

步骤 7 登录OpenFlow交换机。执行命令ovs-ofctl dump-flows br-sw,可知当前交换机中共有6条流表项。这些流表是控制器与OpenFlow交换机连接过程中下发的,如下图所示。

Openflow流表学习_第10张图片
第一条流表无匹配字段,动作为发往控制器的65535端口,实质上为table-miss流表项;第二条流表匹配字段为:dl_dst:01:80:c2:00:00:0e(目的MAC地址为01:80:c2:00:00:0e,该地址为MAC组播地址),dl_type=0x88cc(MAC帧携带的上层数据类型为0x88cc,该代码表示LLDP协议),动作为发往控制器的65535端口。该流表项表示将接收到的LLDP组播数据包发往控制器,用于拓扑发现,后续实验会有详细介绍。
说明:如果控制器刚启动就查看流表,流表项可能少于6条。等待几分钟便可查看到全部6条流表项。

步骤 8 登录主机1,切换至root用户。执行命令ping 10.0.0.11,测试连通性。

Openflow流表学习_第11张图片

说明:主机2的IP地址要根据实际情况替换。

步骤 9 登录控制器,查看ping命令引发的消息交互,如下图所示。

Openflow流表学习_第12张图片

交换机收到数据包后匹配当前的流表项,由于无匹配项,故将数据包转发给控制器,触发Packet_in消息。控制器发送Flow_mod消息作为响应,并下发与该数据包相关的流表项,指导交换机进行转发。

步骤 10 登录交换机,切换至root用户。执行命令ovs-ofctl dump-flows br-sw,查看控制器下发的流表项,如下图所示。

Openflow流表学习_第13张图片

红色标记处为两条新增的流表。第一条含义为:从交换机端口1进入的流量将从端口2转发出去。第二条含义为:从交换机端口2进入的流量将从端口1转发出去。
说明:由实验拓扑可知,此时交换机端口1连接主机1,交换机端口2连接主机2。所以上述流表项表示主机1与主机2之间的流量可以互通。

步骤 11 执行如下命令,增加一条流表项,将主机1发给主机2的数据包丢弃。

$ ovs-ofctl add-flow br-sw ‘dl_type=0x0800,nw_src=10.0.0.7,nw_dst=10.0.0.11, priority=27,table=0,actions=drop’

该流表项的匹配字段包括:dl_type=0x0800(MAC帧上一层为IP协议)、nw_src=10.0.0.7(源IP地址为10.0.0.7)、nw_dst=10.0.0.11(目的IP地址为10.0.0.11);优先级priority设为27,高于其他流表,故优先执行;table id为0,即将该流表项下发到table 0中。该流表项表示:从主机10.0.0.7发往主机10.0.0.11的IP包将被抛弃。

步骤 12 登录主机1,Ping主机2,发现新增的流表项生效,主机1与主机2不通,如下图所示。



实验平台网站:http://58.213.119.21:8090/course/experiment/expt_course_detail/sdn/4f7c43d3-a8f4-4e19-808b-f2b035a7b438/

你可能感兴趣的:(Openflow,Software,Development)