openflow控制器POX使用指南

POX安裝

準備環境python

POX安裝使用須要python2.7支持,因此在安裝POX以前須要先安裝python2.7。git

POX支持的系統:github

  • Windows
  • Mac OS
  • Linux

通常來講,做爲openflow控制器使用,在windows下就能夠(通常都爲32位系統)。windows

 安裝POXapp

1. Linux系統安裝:python2.7

在Linux系統下能夠直接使用git 將pox源碼下載下來,如:tcp

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

2. Window系統安裝:.net

在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)

說明:修改流表項,即修改這條流表的動做。

相關文章
相關標籤/搜索