準備環境python
POX安裝使用須要python2.7支持,因此在安裝POX以前須要先安裝python2.7。git
POX支持的系統:github
通常來講,做爲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交換機,進行下發、刪除、修改流表項。
命令:
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
命令:
POX> import pox.openflow.libopenflow_01 as of
命令:
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)
說明:修改流表項,即修改這條流表的動做。