APP下载

基于OpenDayLight 的流表控制研究

2023-09-12

科学技术创新 2023年21期
关键词:流表表项命令

高 丽

(兰州石化职业技术大学,甘肃 兰州)

1 OpenDayLight 介绍

SDN 控制器是SDN 中的应用程序,类似网络的“大脑”,控制网络中的所有设备,而原来的通用网络硬件只需要听从控制器的命令进行“傻瓜式”转发就可以了,完全将网络设备的数据平面和控制平面相分离,实现网络的集中控制和智能化管理。

SDN 开源的控制器[1]主要有NOX、POX、Ryu、Floodlight、OpenDayLight(ODL)等,其中NOX 是一款OpenFlow 控制器,是SDN 开发的基础,POX 多用于快速开发控制器原型。Ryu 与OpenStack 平台相结合,提供很多API,支持创建网络管理应用。Floodlight 是基于Beacon 的企业级OpenFlow 控制器。ODL 是Linux基金会管理的开源项目,本研究主要介绍ODL。

ODL 是使用JAVA 语言开发的控制器,它的框架具有模块化、可升级、支持多协议、可扩展的特点。ODL 框架包括网络应用编排与服务、控制器、物理/虚拟网络设备三层,三层之间有北向接口与南向接口连接。控制器通过北向接口向应用层提供服务,使用控制器收集信息进行分析、部署网络规则。南向接口通过多种协议,动态地连接在业务抽象层(SAL)。ODL 平台采用OSGI 框架,支持模块化和可扩展。YANG UI是ODL 中基于DLUX 的应用,通过动态封装、调用YANG 模型和相关REST APIs,生成并展示UI 界面。在ODL 中通过YANGTools 项目管理YANG,该项目包含YANG、YANG 模型的代码生成和DOM/Java 格式之间的映射,DataStore 的建模及其操作(RPC 和通知),提供RESTCONF 访问数据等模块。为了简化和促进ODL 应用程序的开发,ODL 提供了基于YANG 模型生成并呈现简单的界面,相关的feature 组建有odldlux-core、odl-dluxapps-yangui、odl-dluxapps-yangvisualizer、odl-dluxapps-yangman 等。

2 构建OpenDayLight 控制器

2.1 环境准备

构建OpenDayLight 控制器的环境所需要的环境,硬件环境中CPU 数量为2 核、内存空间为4G、磁盘容量为20G,软件环境需要Ubuntu16.04、Mininet、Open-DayLight。本研究是在已经安装Mininet 工具的基础上进行ODL 的安装和使用。

2.2 安装准备

在root 模式下:

(1)安装OpenDayLight 的依赖包:apt-get update。

(2)安装基础包:apt-get install unzip lrzsz。

(3)安装运行环境JDK。命令apt-get install openjdk-8-jdk。

(4)设置JDK 环境变量。

打开配置文件:vi /etc/profile。在文件最后添加以下设置:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-ope njdk-i386

export JRE_HOME=u${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME)/lib:$(JRE_HOME)/lib

export PATH=${JAVA HOME}/bin:$PATH

注意为使得文件生效,要执行source /etc/profile命令。并使用echo ${JAVA_HOME}和java -version命令确认JDK 版本、配置是否生效。

2.3 下载安装OpenDayLight

OpenDayLight 为开源软件下载链接:

解压压缩文件,并打开文件org.apache.karaf.managemnet.cfg 修改参数如下:

OpenDayLight 已安装成功,在distribution-karaf-0.6.0-Carbon 目录下使用命令./bin/karaf 启动karaf 容器,开启界面见图1。

图1 OpenDayLight 的开启界面

此时通过karaf 安装feature。安装内容如下,在此提醒需要严格按照以下顺序安装,否则可能会导致无法访问UI 界面。

如果没有按照顺序安装,致使无法登录进入ODL主界面[2]。需要删除data 后重新安装组件。

3 OpenDayLight 控制器的使用

3.1 开启ODL

Miniet 环境下,在Miniedit 界面化工具下创建拓扑,一台交换机下挂三台主机。运行拓扑,在此提醒注意开启OpenDayLight。

在下发流表之前,查看以下内容:

(1)登录控制器c0。执行netstat -an | grep 6633 命令,得到c0 是否处于监听的状态。

(2)登录交换机s1。在c0 处于监听状态的前提下,执行ovs-vsctl show 命令,查看交换机的网卡链接情况,此时结果中is_connectedde 的值为true 时,表示已连接到控制器c0。

(3)查看主机IP 地址。分别登录h1、h2、h3,使用ifconfig 命令查看IP 地址为10.0.0.1、10.0.0.2、10.0.0.3。

3.2 基于openflow1.0 下发流表

OpenFlow1.0 协议只支持单流表,处理数据包的流程简洁。它的工作流程即是交换机接收、解析数据包,之后从table 0 开始匹配,匹配成功时对该数据包执行相应的动作、更新计数器;如果匹配失败则将数据包交给控制器c0。

操作如下:

(1)切换到交换机s1,使用命令ovs-vsctl set bridge br0 protocol=OpenFlow10.

(2)在浏览器中输入http://127.0.0.1:8181/index.html,开启ODL 的web 界面。使用账号和密码:admin登录之后,加载网络拓扑,查看拓扑节点ID 信息,得到端口号及对应节点控制器ID、MAC 地址等。

(3)基于节点信息,选择expand all 中的open daylight-inventoryrev 2013-08-19, 设置node id=openflow:1,table id=0,flow{id}的信息。

(4)点击flow list 后面的“+”,设置id=1,flow id会自动同步,然后match --> ethernet-match -->ethernet -type,填写“type”为“0x0800(IPv4)”。

(5)选择“layer-3-match”下拉框中的“ipv4-match”,弹开“layer-3-match”,补充完整源IP 地址和目的 IP 地址,分别为 h1、h2 的 IP 地址是10.0.0.1,10.0.0.2。

(6)设置instructions 的动作为丢包。弹开instructions,点击instruction list 后面的“+”,instruction order 设置为0,instruction 的值选择为“apply-actionscase”;弹开apply-actions,点击“action list”后面的“+”,action order 设置为0,action 设置为“dropaction-case”。

(7)配置priority 为27,cookie 为100000000,table_id 为0,idle-timeout 为0,hard-timeout 为0。

(8)发送流表。选择PUT 动作,点击Send,弹出request sent successfully 提示信息,即发送成功。

(9)测试流表下发情况。返回mininet 终端,输入命令sh ovs-vsctl dump-flows s1,查看下发流表。在新下发内容的流表中,priority=27,IP 源地址、目的地址分别为h1、h2 的地址,动作是drop。再通过执行h1 ping h2,得到100%丢包率,见图2。

图2 h1 与h2 无法通信

由结果图可知h1 与h2 之间不通,h1 与h3 通,新下发的流表项生效。如果删除下发的流表项,h1 再次ping h2,此时可以正常通信。

3.3 基于openflow1.3 下发流表

OpenFlow1.3 协议支持多流表匹配[3]。数据包处理的原理如下:

收到设备的报文后,首先进行解析,解析后按照优先级别开始依次匹配流表项。一般根据报文头的字段和报文类型进行匹配。如果匹配成功,按照指令集更新相关信息,并按照指令确定是否前往下一个流表,不前往则终止执行动作集。匹配失败有两种情况,一种是存在无匹配流表项(table miss),它的处理方式是将报文转发给控制器、丢弃或转发给其他流表。一种是不存在table miss 表项则丢弃该报文。

操作如下:

(1)指定OpenFlow1.3 版本连接ODL。使用命令mn -c 清除上面绘制的topo,创建拓扑,指定协议为OpenFlow1.3。命令为

mn --custom sdn.py --topo mytopo --controller=remote,ip =127.0.0.1,port =6633--switchovsk,protoctls=OpenFlow13

(2)分别通过GET、Send,DELETE、Send,查看配置流表node id=openflow:1,table id=0 信息并删除流表信息。

(3)pingall 并使用命令sh ovs-ofctl dumpflows -O OpenFlow13 s1 查看下流表,所有流表项正常发送。

(4)下发流表。这里设置node id=openflow:1,table id=2,其余参考基于OpenFlow1.0 的设置方式下发流表。

(5)再次查看流表,h1 发送流表给h2,actions的值为drop。但在测试h1 ping h2,发现h1 发送h2的包并没有丢弃,是连通的,这是因为OpenFlow1.3 版本的流水线式处理流表,从优先级最高的table0 开始,依次匹配,这里执行了优先级更高的table0,导致h1 与h2 能够正常通信。这里将instruction 设置为goto-table-case,使得table0 转到table2,并设置priority的值为23,接下来通过选择PUT、Send 下发,再回mininet 下查看流表及h1 和h3 连通性。

(6)查看流表结果,得到priority=23,actions 的值为goto_table:2 的流表项。

测试hi ping h2 连通性,结果见图3。得到h1 ping h2 丢包率为100%。

图3 h1 与h2 无法通信

结束语

本研究在安装Mininet 环境下,通过程序生成真实网络流量,对OpenFlow 流表实现控制。通过ODL的YANG UI 进行比如改写源和目的主机的IP、MAC地址、优先级别等操作,下发不同流表来自主的控制转发行为、控制主机之间的连通性,使得控制网络更加灵活多样。

猜你喜欢

流表表项命令
一种改进的TCAM路由表项管理算法及实现
只听主人的命令
基于时序与集合的SDN流表更新策略
基于ARMA模型预测的交换机流表更新算法
基于缓存策略的OpenFlow流表存储优化方案研究
简析yangUI流表控制
软件定义网络中一种两步式多级流表构建算法
移防命令下达后
SDN数据中心网络基于流表项转换的流表调度优化
这是人民的命令