控制器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)

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值