控制器POX在windows下使用教程

POX安装

准备环境

POX安装使用需要python2.7支持,所以在安装POX之前需要先安装python2.7。
POX支持的系统:

  • Windows
  • Mac OS
  • Linux

一般来说,作为openflow控制器使用,在windows下就可以(一般都为32位系统)。

安装POX

1. Linux系统安装:
在Linux系统下可以直接使用git 将pox源码下载下来,如:

$git clone http://github.com/noxrepo/pox

2. Window系统安装:
在window系统下,安装pox也是只需要将pox源码下载下来就可以,下载后可以放到任意位置,下载地址如下:

http://www.noxrepo.org/pox/versionsdownloads/

打开下载网址后,可以选择需要下载的POX版本,这里我们选择release版本

我们可以选择betta版的zip文件,下载后解压缩,比如解压到D盘目录下,文件夹为pox-betta

启用POX控制器

Pox控制器的使用在Linux平台和windows平台下是相同的,所以这里只介绍一下windows平台下的使用方法。
假如下载POX源码后,解压的路径为D盘根目录,如:D:\pox-betta
打开命令提示符,进入到pox-betta文件夹下:
在此目录则可以运行pox命令,连接openflow交换机,进行下发、删除、修改流表项。

  • 连接openflow交换机

命令:

D:\pox-betta >python pox.py openflow.of_01 –address=x.x.x.x –port=yy py

功能:控制器开启对应地址监控进程
其中,address是与交换机相连的pox控制器的IP地址,port是连接的端口,默认为6633如:

运行此命令后,如果控制器与交换机的链路没有故障,配置也是正确的,则会进入pox控制器运行模式,并提示connected已连接。

  • 导出所需要的模块

命令:

POX> from pox.lib.addresses import IPAddr
POX>from pox.lib.addresses import EthAddr
  • 导出核心模块,并命名为of

命令:

POX> import pox.openflow.libopenflow_01 as of
  • 获取连接控制端的openflow switch的key

命令:

POX> core.openflow.connections.keys()

注意:以上三条命令在POX控制器同openflow交换机连接上后只需要运行一次,并且必须在执行其他任何命令之前首先运行这三条命令,但是如果POX控制器同openflow交换机断开重连,则同样的需要运行一次以上三条命令,即POX控制器同openflow交换机每连接一次,需要运行以上三条命令一次。如:

POX控制器下发openflow流表

启用pox控制器并同openflow交换机连接后,就可以使用pox控制器下发流表项了,这里先介绍一下下发流表项中各个匹配项和动作的命令。
匹配字段
1. 编辑消息,消息类型为flow mod
命令:
POX> msg=of.ofp_flow_mod(command=0)

参数:command:0为ADD(添加流),1为MODIFY,2为MODIFY_STRICT(严格匹配掩码和优先级修改流规则),3为DELETE(删除所有流规则),4为DELETE_STRICT(严格匹配掩码和优先级删除流规则)

缺省情况下,即不标明参数command,如:msg=of.ofp_flow_mod(),command=0,添加流表项。

2. 设置规则的优先级
命令:

POX>msg.priority=x

X为优先级数值,范围为1-65535
3. 匹配入端口
命令:

POX> msg.match.in_port=y

指定规则匹配的入端口值,y为交换机上端口对应的index值。
4. 匹配源mac
命令:

POX>msg.match.dl_src=EthAddr(“ ”)

5. 匹配目的mac
命令:

POX> msg.match.dl_dst=EthAddr(“ ”)

6. 匹配以太类型
命令:

POX> msg.match.dl_type=x

指定规则匹配ip类型报文
7. 匹配vlan id
命令:

POX> msg.match.dl_vlan=x

说明:dl_vlan必须为openflow交换机上存在的vlan
8. 匹配vlan优先级
命令:POX> msg.match.dl_vlan_pcp=x
说明:dl_vlan_pcp必须在0-7之内。
9. 匹配源ip地址
命令:

POX> msg.match.nw_src=“A.B.C.D/X”

说明:下发匹配源ip地址时,必须指定匹配的以太类型,如:

POX> msg.match.dl_type=0×800
POX>msg.match.nw_src=“192.168.2.133/24”

10. 匹配目的ip地址
命令:

POX> msg.match.nw_dst=“A.B.C.D/X”

说明:下发匹配目的ip地址时,必须指定匹配的以太类型,如:

POX> msg.match.dl_type=0×800
POX> msg.match.nw_dst=“192.168.2.133/24”

11. 匹配协议类型
命令:

POX>msg.match.nw_proto=x

说明:必须指定匹配的以太网类型,再匹配ip协议类型,如:

POX> msg.match.dl_type=0×800
POX> msg.match.nw_proto=6

12. 匹配tos
命令:

POX> msg.match.nw_tos=x

说明:必须指定匹配的以太网类型,再匹配tos值,如:

POX> msg.match.dl_type=0×800
POX> msg.match.nw_tos=64

13. 匹配tcp源端口
命令:

POX> msg.match.tp_src=X

说明:必须指定匹配的以太网类型,再匹配ip协议类型,最后匹配tcp port,如:

POX> msg.match.dl_type=0×800
POX> msg.match.nw_proto=6
POX> msg.match.tp_src=179

14. 匹配tcp目的端口
命令:

POX> msg.match.tp_dst=X

说明:必须指定匹配的以太网类型,再匹配ip协议类型,最后匹配tcp port,如:

POX> msg.match.dl_type=0×800
POX> msg.match.nw_proto=6
POX> msg.match.tp_dst=179

15. 在idle时间内,如果没有报文触发此动作,该条规则将删除
命令:

POX> msg.idle_timeout=X

说明:X为时间值,单位为秒。缺省时为0,表示不老化删除。
16. 在到达hard时间时,无论如何,该条规则将删除
命令:POX> msg.hard_timeout=X
说明:X为时间值,单位为秒。缺省时为0,表示不老化删除。

修改动作

若规则无动作则默认为丢弃;规则中没有显示的设置出端口的需要在相应动作之后添加出端口。
1. 指定出端口动作
命令:

POX> msg.actions.append(of.ofp_action_output(port=X))

说明:port号是openflow vlan内的端口。
其中,port值可以为特殊参数值,IN_PORT = 0xfff8:从入端口将报文发出。FLOOD= 0xfffb:除了入端口和stp不允许的端口的所有端口。ALL = 0xfffc:除了入端口的其余端口。CONTROLLER = 0xfffd:发送给控制器。NONE = 0xffff:和物理端口无关
2. 转发指定的端口和队列
命令:

POX> msg.actions.append(of.ofp_action_enqueue(port=x,queue_id=y))

3. 改变目的mac为指定mac
命令:

POX> msg.actions.append(of.ofp_action_dl_addr.set_dst(“ ”))

说明:mac地址形式为ff:ff:ff:ff:ff:ff
4. 改变源mac为指定mac
命令:

POX> msg.actions.append(of.ofp_action_dl_addr.set_src(“ ”))

5. 设定tos值
命令:

POX> msg.actions.append(of.ofp_action_nw_tos(nw_tos=x))

6. 设定vlan值
命令:

POX> msg.actions.append(of.ofp_action_vlan_vid(vlan_vid=x))

7. 设定vlan cos值
命令:

POX> msg.actions.append(of.ofp_action_vlan_pcp(vlan_pcp=x))

说明:设置cos值时必须先设置vlan id,如:

POX> msg.actions.append(of.ofp_action_vlan_vid(vlan_vid=3))
POX> msg.actions.append(of.ofp_action_vlan_pcp(vlan_pcp=4))

POX使用实例

1. 下发匹配入端口,动作为出端口的流表项
命令:

POX>msg=of.ofp_flow_mod()
POX>msg.priority=3
POX>msg.match.in_port=193
POX>msg.actions.append(of.ofp_action_output(port=194))
POX>core.openflow.connections[13136560386L].send(msg)

说明:[13136560386L]为在POX和openflow交换机连接上时,使用命令POX> core.openflow.connections.keys()获取的交换机的key,每次下发流表项或者删除,修改流表项,这个key都是相同的。
2. 下发匹配目的MAC地址,动作为出端口的流表项
命令:

POX>msg=of.ofp_flow_mod()
POX>msg.priority=3
POX>msg.match.dl_src=EthAddr(“ff:ff:ff:ff:ff:ff”)
POX>msg.actions.append(of.ofp_action_output(port=194))
POX>core.openflow.connections[13136560386L].send(msg)

3. 下发匹配以太网类型,动作为出端口和队列的流表项

命令:

POX>msg=of.ofp_flow_mod()
POX>msg.priority=5
POX>msg.match.dl_type=0×800
POX>msg.actions.append(of.ofp_action_enqueue(queue_id=5,port=194))
POX>core.openflow.connections[13136560386L].send(msg)

4. 下发匹配源mac地址,动作为设置vlan 并指定出端口的流表项
命令:

POX>msg=of.ofp_flow_mod()
POX>msg.priority=5
POX>msg.match.dl_src=EthAddr(“00:03:0f:01:12:43”)
POX>msg.actions.append(of.ofp_action_vlan_vid(vlan_vid=3))
POX>msg.actions.append(of.ofp_action_output(port=194))
POX>core.openflow.connections[13136560386L].send(msg)

5. 下发匹配入端口,动作为设置vlan、cos,并指定出端口的流表项

命令:

POX>msg=of.ofp_flow_mod()
POX>msg.priority=5
POX>msg.match.in_port=193
POX>msg.actions.append(of.ofp_action_vlan_vid(vlan_vid=4))
POX>msg.actions.append(of.ofp_action_vlan_pcp(vlan_pcp=5))
POX>msg.actions.append(of.ofp_action_output(port=194))
POX>core.openflow.connections[13136560386L].send(msg)

6. 删除流表项

命令:

POX>msg=of.ofp_flow_mod(command=3)
POX>core.openflow.connections[13136560386L].send(msg)

说明:此命令是删除所有的流表项

7. 删除特定的流表项

命令:

POX>msg=of.ofp_flow_mod(command=4)
POX>msg.wildcards= 4194302
POX>msg.priority=5
POX>core.openflow.connections[13136560386L].send(msg)

说明:删除特定的流表项就是将command值为4,并且精确匹配需要删除的流表项的匹配字段和动作。

8. 修改流表项

命令:

POX>msg=of.ofp_flow_mod(command=2)
POX>msg.priority=5
POX>msg.match.in_port=193
POX>msg.actions.append(of.ofp_action_vlan_vid(vlan_vid=4))
POX>msg.actions.append(of.ofp_action_vlan_pcp(vlan_pcp=5))
POX>msg.actions.append(of.ofp_action_output(port=194))
POX>core.openflow.connections[13136560386L].send(msg)

说明:修改流表项,即修改这条流表的动作。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/sdn-guide/14786.html/
分享到:
条评论

登录后才可以评论

Jerry 发表于15-11-16
1