加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

pox 中 openflow.webservice 组建的学习与使用

发布时间:2020-12-16 22:14:29 所属栏目:安全 来源:网络整理
导读:Openflow的一个简单 JSON-RPC-ish web service交互式接口,由of_service信息服务派生而来,依赖于webcore组件。可以使用HTTP POST方式发送JSON进行访问。 目前支持的方法有: , ? ? ? ? method 介绍 参数 get_flow_stats 获取流表的表项 dpid - 一个字符串

Openflow的一个简单JSON-RPC-ish web service交互式接口,由of_service信息服务派生而来,依赖于webcore组件。可以使用HTTP POST方式发送JSON进行访问。

目前支持的方法有:


, ? ? ? ?

method 介绍 参数
get_flow_stats 获取流表的表项 dpid - 一个字符串形式的dpid,例如:'00-00-00-00-00-01'

flows -所有流表的列表

get_switch_desc 获取指定交换机详细信息 dpid - 同上
get_switches 获取交换机列表和基本信息

dpid - 同上

match - 流表的匹配条目 (默认匹配所有)

table_id - 流表的id (默认是所有)

out_port - filter by out port (defaults to all)


set_table 设置指定交换机的流表 None.



在使用pox的过程中 基本只能在./pox.py 后面增加 组建一起运行,而webservice组建提供了一个可以通过web访问交换机和流表的接口,如上所示,只支持4个功能,我会在接下来的过程中进行演示~ 我基本是看的 pox wiki里面的资料然后进行验证 得出的结果,不过wiki中有一点bug,我也做了修正。大家也可以参考 pox wiki的内容~ ?我用的是curl这个东东 执行上面的方法,这个东东的具体介绍这里就略过了~下面直接说我的运行过程把~

首先,这里用到两个基本的东东 ?mininet和pox,既然能看本文章的估计也不陌生,所以也不进行讲解,本文章指向写一些,国内网站中难以找到的一些东东。废话不多说~

首先运行 pox 和mininet(我基本都是su root 用root权限运行,比较个人使用,不用考虑什么安全问题),我们使用mininet默认的拓扑,比较只是功能的演示。


进入pox的目录 启动pox和相应的组建,为了验证测试获取信息我们开启了l3_learning组建,这个组建会在ping操作时下发流表:

cd?pox?????????????????????????????????
./pox.py?openflow.of_01?web.webcore?openflow.webservice?forwarding.l3_learning


开启mininet:

mn?--controller=remote

一般默认的都会连上~并在pox中输出如下信息:

INFO:openflow.of_01:[00-00-00-00-00-01 2] connected


我们先在mininet中进行ping操作让控制器下发流表~

mininet> h1 ping h2

如果能ping通,交换机中就已经有控制器下发的流表了

现在我们就可以通过,curl访问web接口,获取信息了~

我们先获取交换机的流表

curl -i -X POST -d '{"method":"get_flow_stats","params":{"dpid":"00-00-00-00-00-01"},"id" : 1}' http://127.0.0.1:8000/OF/

这个操作分三个部分,前面的是curl命令,在此不讲,中间一对大括号中,就是我们要请求的数据,我们是以post的形式,请求数据的,最后就是我们要请求数据的网址,pox wiki中 写的网址是?http://127.0.0.1:8000?不过根据我自己的测试网站 应该是上面那个。下面我们来具体说下中间那对大括号里的内容;

一般我们发送表单都是一对一对数据的形式发送的,这种形式在python中称为字典,其他地方可能称为,哈希表,映射之类的东东~现在说说具体参数把,此方法中有三个参数,method,对应4个选项,已经在开头列出来了,params 对应的又是一个字典 ,里面包括一些对应方法的参数,比如例子中的方法,method,他就必须指定 我们所要获取的流表来自那个交换机,而交换机一般由dpid所标识,所以我们输入的参数就是 dpid,因为获取交换机的信息只是简单的操作 所以只有一个参数。在liux终端中执行上面那个命令 就可以获取控制器所连接的交换机的信息,本例子中的输出如下:

{"result":?{"flowstats":?[{"packet_count":?2,?"hard_timeout":?0,?"byte_count":?196,?"duration_sec":?3,?"actions":?[{"dl_addr":?"be:48:cb:78:60:92",?"type":?"OFPAT_SET_DL_DST"},?{"max_len":?0,?"type":?"OFPAT_OUTPUT",?"port":?2}],?"duration_nsec":?194000000,?"priority":?65535,?"idle_timeout":?10,?"cookie":?0,?"table_id":?0,?"match":?{"dl_type":?"IP",?"nw_dst":?"10.0.0.2/32",?"dl_src":?"52:9d:f5:2b:88:d4",?"nw_proto":?1,?"nw_tos":?0,?"tp_dst":?0,?"tp_src":?8,?"dl_dst":?"be:48:cb:78:60:92",?"dl_vlan":?65535,?"nw_src":?"10.0.0.1",?"in_port":?1}},?{"packet_count":?2,?"actions":?[{"dl_addr":?"52:9d:f5:2b:88:d4",?"port":?1}],?"duration_nsec":?193000000,?"nw_dst":?"10.0.0.1/32",?"dl_src":?"be:48:cb:78:60:92",?"tp_src":?0,?"dl_dst":?"52:9d:f5:2b:88:d4",?"nw_src":?"10.0.0.2",?"in_port":?2}}],?"dpid":?"00-00-00-00-00-01"},?"id":?1}

如果没自己下发过流表,可能看起来有点艰难,但如果自己下发过流表,基本都能看懂。



获取指定交换机的信息(用 dpid指定不同的交换机):

curl?-i?-X?POST?-d?'{"method":"get_switch_desc","id"?:?1}'?http://127.0.0.1:8000/OF/

结果:

{"result":?{"switchdesc":?{"dp_desc":?"None",?"sw_desc":?"2.3.2",?"hw_desc":?"Open?vSwitch",?"serial_num":?"None",?"mfr_desc":?"Nicira,?Inc."},?"id":?1}

其实什么内容都木有。。。咳咳。。

获取交换机列表和基本信息:

curl?-i?-X?POST?-d?'{"method":"get_switches","id"?:?1}'

结果:

{"result": [{"n_tables": 254,"ports": [{"hw_addr": "9e:0f:91:2d:a0:8e","name": "s1-eth1","port_no": 1},{"hw_addr": "de:d6:d4:55:9e:e0","name": "s1-eth2","port_no": 2},{"hw_addr": "7a:2a:44:cf:ff:4f","port_down": true,"link_down": true,"name": "s1","port_no": 65534}],"dpid": "00-00-00-00-00-01"}],"id": 1}

因为只有一个交换机,所以就获得了一组信息~

最后就是下发流表了~

curl -i -X POST -d '{"method":"set_table","params":{"dpid":"00-00-00-00-00-01","flows":[{"actions": [{"type":"OFPAT_OUTPUT","port":2}],"match": {"dl_type": "IP","in_port":1 }}]}}' http://127.0.0.1:8000/OF/

params 里面除了指定了dpid ?还多了一个flow,在python中中括号里面的是列表的形式,也就是可以同时下发好几条流表,同理 actions对应的也是列表的形式,对应多个动作。flows里面就是一条一条的流表了,我们指定了流表的匹配那些信息,首先它得是一个ip数据包,然后必须是从1号端口进来的数据包,我们还指定了它匹配成功后的动作是从2号端口转发~

我们再演示下如何同时下发多条流表:

curl?-i?-X?POST?-d?'{"method":"set_table","flows":[{"actions":?[{"type":"OFPAT_OUTPUT","match":?{"dl_type":?"IP","in_port":1?}},{"actions":[{"type":"OFPAT_OUTPUT","port":"OFPP_ALL"}]}]}}'?http://127.0.0.1:8000/OF/

我们在flows列表中 又加入了一条~

然后我们在mininet中查看流表,执行以下代码:

mininet>?dpctl?dump-flows

我们就可以获取以下信息:

***?s1?------------------------------------------------------------------------
NXST_FLOW?reply?(xid=0x4):
?cookie=0x0,?duration=203.063s,?table=0,?n_packets=0,?n_bytes=0,?idle_age=203,?actions=ALL
?cookie=0x0,?duration=203.102s,?ip,in_port=1?actions=output:2

到此 所有的内容就结束了,有可能讲的不够明白,也有可能讲的太罗嗦,又不懂地方,大家可以留言,或者给我发邮件~ 当然,留言 的话我是不知道几个世纪才会 上一次博客,所以最好是 发邮件~


最后还有一个问题,当我match 源ip地址的时候老是出现问题

curl -i -X POST -d '{"method":"set_table","nw_dst":"192.168.42.0/255.255.255.0" }}]}}' http://127.0.0.1:8000/OF/

如果我这样下发 就会出现问题,目前无解。。。别人说他在ovs2.5的版本 和 POX eel?中运行没有错误。。。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读