基于OpenvSwitch的OpenFlow怎么用

小編給大家分享一下基于Open vSwitch的OpenFlow怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

10年的天涯網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整天涯建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“天涯網(wǎng)站設(shè)計(jì)”,“天涯網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

Open vSwitch 概述

Open vSwitch(下面簡(jiǎn)稱為 OVS)是由 Nicira Networks 主導(dǎo)的,運(yùn)行在虛擬化平臺(tái)(例如 KVM,Xen)上的虛擬交換機(jī)。在虛擬化平臺(tái)上,OVS 可以為動(dòng)態(tài)變化的端點(diǎn)提供 2 層交換功能,很好的控制虛擬網(wǎng)絡(luò)中的訪問(wèn)策略、網(wǎng)絡(luò)隔離、流量監(jiān)控等等。

OVS 遵循 Apache 2.0 許可證, 能同時(shí)支持多種標(biāo)準(zhǔn)的管理接口和協(xié)議。OVS 也提供了對(duì) OpenFlow 協(xié)議的支持,用戶可以使用任何支持 OpenFlow 協(xié)議的控制器對(duì) OVS 進(jìn)行遠(yuǎn)程管理控制。

Open vSwitch 概述

在 OVS 中, 有幾個(gè)非常重要的概念:

  • Bridge: Bridge 代表一個(gè)以太網(wǎng)交換機(jī)(Switch),一個(gè)主機(jī)中可以創(chuàng)建一個(gè)或者多個(gè) Bridge 設(shè)備。

  • Port: 端口與物理交換機(jī)的端口概念類似,每個(gè) Port 都隸屬于一個(gè) Bridge。

  • Interface: 連接到 Port 的網(wǎng)絡(luò)接口設(shè)備。在通常情況下,Port 和 Interface 是一對(duì)一的關(guān)系, 只有在配置 Port 為 bond 模式后,Port 和 Interface 是一對(duì)多的關(guān)系。

  • Controller: OpenFlow 控制器。OVS 可以同時(shí)接受一個(gè)或者多個(gè) OpenFlow 控制器的管理。

  • datapath: 在 OVS 中,datapath 負(fù)責(zé)執(zhí)行數(shù)據(jù)交換,也就是把從接收端口收到的數(shù)據(jù)包在流表中進(jìn)行匹配,并執(zhí)行匹配到的動(dòng)作。

  • Flow table: 每個(gè) datapath 都和一個(gè)“flow table”關(guān)聯(lián),當(dāng) datapath 接收到數(shù)據(jù)之后, OVS 會(huì)在 flow table 中查找可以匹配的 flow,執(zhí)行對(duì)應(yīng)的操作, 例如轉(zhuǎn)發(fā)數(shù)據(jù)到另外的端口。

Open vSwitch 實(shí)驗(yàn)環(huán)境配置

OVS 可以安裝在主流的 Linux 操作系統(tǒng)中,用戶可以選擇直接安裝編譯好的軟件包,或者下載源碼進(jìn)行編譯安裝。

在我們的實(shí)驗(yàn)環(huán)境中,使用的操作系統(tǒng)是 64 位 Ubuntu Server 12.04.3 LTS,并通過(guò)源碼編譯的方式安裝了 Open vSwitch 1.11.0

$ lsb_release -a
No LSB modules are available.
Distributor ID:Ubuntu
Description:Ubuntu 12.04.3 LTS
Release:12.04
Codename:precise

OVS 的源碼編譯安裝方式可以參考官方文檔 How to Install Open vSwitch on Linux, FreeBSD and NetBSD。

安裝完畢后,檢查 OVS 的運(yùn)行情況:

$ ps -ea | grep ovs
12533 ?        00:00:00 ovs_workq
12549 ?        00:00:04 ovsdb-server
12565 ?        00:00:48 ovs-vswitchd
12566 ?        00:00:00 ovs-vswitchd

查看 OVS 的版本信息, 我們安裝版本的是 1.11.0

$ ovs-appctl --version
ovs-appctl (Open vSwitch) 1.11.0
Compiled Oct 28 2013 14:17:16

查看 OVS 支持的 OpenFlow 協(xié)議的版本

$ ovs-ofctl --version
ovs-ofctl (Open vSwitch) 1.11.0
Compiled Oct 28 2013 14:17:17
OpenFlow versions 0x1:0x4

回頁(yè)首

基于 Open vSwitch 的 OpenFlow 實(shí)踐

OpenFlow 是用于管理交換機(jī)流表的協(xié)議,ovs-ofctl 則是 OVS 提供的命令行工具。在沒(méi)有配置 OpenFlow 控制器的模式下,用戶可以使用 ovs-ofctl 命令通過(guò) OpenFlow 協(xié)議去連接 OVS,創(chuàng)建、修改或刪除 OVS 中的流表項(xiàng),并對(duì) OVS 的運(yùn)行狀況進(jìn)行動(dòng)態(tài)監(jiān)控。

圖 1. OpenFlow 的匹配流程

基于Open vSwitch的OpenFlow怎么用  

Flow 語(yǔ)法說(shuō)明

在 OpenFlow 的白皮書(shū)中,F(xiàn)low 被定義為某個(gè)特定的網(wǎng)絡(luò)流量。例如,一個(gè) TCP 連接就是一個(gè) Flow,或者從某個(gè) IP 地址發(fā)出來(lái)的數(shù)據(jù)包,都可以被認(rèn)為是一個(gè) Flow。支持 OpenFlow 協(xié)議的交換機(jī)應(yīng)該包括一個(gè)或者多個(gè)流表,流表中的條目包含:數(shù)據(jù)包頭的信息、匹配成功后要執(zhí)行的指令和統(tǒng)計(jì)信息。

當(dāng)數(shù)據(jù)包進(jìn)入 OVS 后,會(huì)將數(shù)據(jù)包和流表中的流表項(xiàng)進(jìn)行匹配,如果發(fā)現(xiàn)了匹配的流表項(xiàng),則執(zhí)行該流表項(xiàng)中的指令集。相反,如果數(shù)據(jù)包在流表中沒(méi)有發(fā)現(xiàn)任何匹配,OVS 會(huì)通過(guò)控制通道把數(shù)據(jù)包發(fā)到 OpenFlow 控制器中。

在 OVS 中,流表項(xiàng)作為 ovs-ofctl 的參數(shù),采用如下的格式:字段=值。如果有多個(gè)字段,可以用逗號(hào)或者空格分開(kāi)。一些常用的字段列舉如下:

表 1. 流表常用字段
字段名稱說(shuō)明
in_port=port傳遞數(shù)據(jù)包的端口的 OpenFlow 端口編號(hào)
dl_vlan=vlan數(shù)據(jù)包的 VLAN Tag 值,范圍是 0-4095,0xffff 代表不包含 VLAN Tag 的數(shù)據(jù)包
dl_src=<MAC>
dl_dst=<MAC>
匹配源或者目標(biāo)的 MAC 地址
01:00:00:00:00:00/01:00:00:00:00:00 代表廣播地址
00:00:00:00:00:00/01:00:00:00:00:00 代表單播地址
dl_type=ethertype匹配以太網(wǎng)協(xié)議類型,其中:
dl_type=0x0800 代表 IPv4 協(xié)議
dl_type=0x086dd 代表 IPv6 協(xié)議
dl_type=0x0806 代表 ARP 協(xié)議

完整的的類型列表可以參見(jiàn)以太網(wǎng)協(xié)議類型列表
nw_src=ip[/netmask]
nw_dst=ip[/netmask]
當(dāng) dl_typ=0x0800 時(shí),匹配源或者目標(biāo)的 IPv4 地址,可以使 IP 地址或者域名
nw_proto=proto和 dl_type 字段協(xié)同使用。
當(dāng) dl_type=0x0800 時(shí),匹配 IP 協(xié)議編號(hào)
當(dāng) dl_type=0x086dd 代表 IPv6 協(xié)議編號(hào)

完整的 IP 協(xié)議編號(hào)可以參見(jiàn)IP 協(xié)議編號(hào)列表
table=number指定要使用的流表的編號(hào),范圍是 0-254。在不指定的情況下,默認(rèn)值為 0。通過(guò)使用流表編號(hào),可以創(chuàng)建或者修改多個(gè) Table 中的 Flow
reg<idx>=value[/mask]交換機(jī)中的寄存器的值。當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入交換機(jī)時(shí),所有的寄存器都被清零,用戶可以通過(guò) Action 的指令修改寄存器中的值

對(duì)于 add?flow,add?flows 和 mod?flows 這三個(gè)命令,還需要指定要執(zhí)行的動(dòng)作:actions=[target][,target...]

一個(gè)流規(guī)則中可能有多個(gè)動(dòng)作,按照指定的先后順序執(zhí)行。

常見(jiàn)的操作有:

  • output:port: 輸出數(shù)據(jù)包到指定的端口。port 是指端口的 OpenFlow 端口編號(hào)

  • mod_vlan_vid: 修改數(shù)據(jù)包中的 VLAN tag

  • strip_vlan: 移除數(shù)據(jù)包中的 VLAN tag

  • mod_dl_src/ mod_dl_dest: 修改源或者目標(biāo)的 MAC 地址信息

  • mod_nw_src/mod_nw_dst: 修改源或者目標(biāo)的 IPv4 地址信息

  • resubmit:port: 替換流表的 in_port 字段,并重新進(jìn)行匹配

  • load:value?>dst[start..end]: 寫(xiě)數(shù)據(jù)到指定的字段

實(shí)踐操作 OpenFlow 命令

在本例中, 我們會(huì)創(chuàng)建一個(gè)不連接到任何控制器的 OVS 交換機(jī),并演示如何使用 ovs-octl 命令操作 OpenFlow 流表。

創(chuàng)建一個(gè)新的 OVS 交換機(jī)

$ ovs-vsctl add-br ovs-switch

創(chuàng)建一個(gè)端口 p0,設(shè)置端口 p0 的 OpenFlow 端口編號(hào)為 100(如果在創(chuàng)建端口的時(shí)候沒(méi)有指定 OpenFlow 端口編號(hào),OVS 會(huì)自動(dòng)生成一個(gè))。

$ ovs-vsctl add-port ovs-switch p0 -- set Interface p0 ofport_request=100

設(shè)置網(wǎng)絡(luò)接口設(shè)備的類型為“internal”。對(duì)于 internal 類型的的網(wǎng)絡(luò)接口,OVS 會(huì)同時(shí)在 Linux 系統(tǒng)中創(chuàng)建一個(gè)可以用來(lái)收發(fā)數(shù)據(jù)的模擬網(wǎng)絡(luò)設(shè)備。我們可以為這個(gè)網(wǎng)絡(luò)設(shè)備配置 IP 地址、進(jìn)行數(shù)據(jù)監(jiān)聽(tīng)等等。

$ ovs-vsctl set Interface p0 type=internal
$ ethtool -i p0
driver: openvswitch
version: 
firmware-version: 
bus-info: 
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no

為了避免網(wǎng)絡(luò)接口上的地址和本機(jī)已有網(wǎng)絡(luò)地址沖突,我們可以創(chuàng)建一個(gè)虛擬網(wǎng)絡(luò)空間 ns0,把 p0 接口移入網(wǎng)絡(luò)空間 ns0,并配置 IP 地址為 192.168.1.100

$ ip netns add ns0
$ ip link set p0 netns ns0
$ ip netns exec ns0 ip addr add 192.168.1.100/24 dev p0
$ ip netns exec ns0 ifconfig p0 promisc up

使用同樣的方法創(chuàng)建端口 p1、p2

表 2. 創(chuàng)建的端口信息
端口說(shuō)明
p0IP 地址: 192.168.1.100/24
網(wǎng)絡(luò)名稱空間: ns0
網(wǎng)絡(luò)接口 MAC 地址: 66:4e:cc:ae:4d:20
OpenFlow Port Number: 100
p1IP 地址: 192.168.1.101/24
網(wǎng)絡(luò)名稱空間: ns1
網(wǎng)絡(luò)接口 MAC 地址: 46:54:8a:95:dd:f8
OpenFlow Port Number: 101
p2
IP 地址: 192.168.1.102/24,
網(wǎng)絡(luò)名稱空間: ns2
網(wǎng)絡(luò)接口 MAC 地址: 86:3b:c8:d0:44:10
OpenFlow Port Number: 102

創(chuàng)建所有的端口之后, 查看 OVS 交換機(jī)的信息

$ ovs-vsctl show
30282710-d401-4187-8e13-52388f693df7
    Bridge ovs-switch
        Port "p0"
            Interface "p0"
                type: internal
        Port "p2"
            Interface "p2"
                type: internal
        Port "p1"
            Interface "p1"
                type: internal
        Port ovs-switch
            Interface ovs-switch
                type: internal

使用 ovs-ofctl 創(chuàng)建并測(cè)試 OpenFlow 命令

  1. 查看 Open vSwitch 中的端口信息。從輸出結(jié)果中,可以獲得交換機(jī)對(duì)應(yīng)的 datapath ID (dpid),以及每個(gè)端口的 OpenFlow 端口編號(hào),端口名稱,當(dāng)前狀態(tài)等等。

    $ ovs-ofctl show ovs-switch
    OFPT_FEATURES_REPLY (xid=0x2): dpid:00001232a237ea45
    n_tables:254, n_buffers:256
    capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
    actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST 
    SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
     100(p0): addr:54:01:00:00:00:00
         config:     PORT_DOWN
         state:      LINK_DOWN
         speed: 0 Mbps now, 0 Mbps max
     101(p1): addr:54:01:00:00:00:00
         config:     PORT_DOWN
         state:      LINK_DOWN
         speed: 0 Mbps now, 0 Mbps max
     102(p2): addr:54:01:00:00:00:00
         config:     PORT_DOWN
         state:      LINK_DOWN
         speed: 0 Mbps now, 0 Mbps max
     LOCAL(ovs-switch): addr:12:32:a2:37:ea:45
         config:     0
         state:      0
         speed: 0 Mbps now, 0 Mbps max
    OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0

     

    如果想獲得網(wǎng)絡(luò)接口的 OpenFlow 編號(hào),也可以在 OVS 的數(shù)據(jù)庫(kù)中查詢

    $ ovs-vsctl get Interface p0 ofport
    100

     

    查看 datapath 的信息

    $ ovs-dpctl show
    system@ovs-system:
    lookups: hit:12173 missed:712 lost:0
    flows: 0
    port 0: ovs-system (internal)
    port 1: ovs-switch (internal)
    port 2: p0 (internal)
    port 3: p1 (internal)
    port 4: p2 (internal)

     

  2. 屏蔽數(shù)據(jù)包

    屏蔽所有進(jìn)入 OVS 的以太網(wǎng)廣播數(shù)據(jù)包

    $ ovs-ofctl add-flow ovs-switch "table=0, dl_src=01:00:00:00:00:00/01:00:00:00:00:00, actions=drop"

     

    屏蔽 STP 協(xié)議的廣播數(shù)據(jù)包

    $ ovs-ofctl add-flow ovs-switch "table=0, dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0, actions=drop"

     

  3. 修改數(shù)據(jù)包

    添加新的 OpenFlow 條目,修改從端口 p0 收到的數(shù)據(jù)包的源地址為 9.181.137.1

    $ ovs-ofctl add-flow ovs-switch "priority=1 idle_timeout=0,\
        in_port=100,actions=mod_nw_src:9.181.137.1,normal"

     

    從端口 p0(192.168.1.100)發(fā)送測(cè)試數(shù)據(jù)到端口 p1(192.168.1.101)

    $ ip netns exec ns0 ping 192.168.1.101

     

    在接收端口 p1 監(jiān)控?cái)?shù)據(jù),發(fā)現(xiàn)接收到的數(shù)據(jù)包的來(lái)源已經(jīng)被修改為 9.181.137.1

    $ ip netns exec ns1 tcpdump -i p1 icmp
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on p1, link-type EN10MB (Ethernet), capture size 65535 bytes
    15:59:16.885770 IP 9.181.137.1 > 192.168.1.101: ICMP echo request, id 23111, seq 457, length 64
    15:59:17.893809 IP 9.181.137.1 > 192.168.1.101: ICMP echo request, id 23111, seq 458, length 64

     

  4. 重定向數(shù)據(jù)包

    添加新的 OpenFlow 條目,重定向所有的 ICMP 數(shù)據(jù)包到端口 p2

    $ ovs-ofctl add-flow ovs-switch idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:102

     

    從端口 p0 (192.168.1.100)發(fā)送數(shù)據(jù)到端口 p1(192.168.1.101)

    $ ip netns exec ns0 ping 192.168.1.101

     

    在端口 p2 上監(jiān)控?cái)?shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)包已被轉(zhuǎn)發(fā)到端口 p2

    $ ip netns exec ns3 tcpdump -i p2 icmp
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on p2, link-type EN10MB (Ethernet), capture size 65535 bytes
    16:07:35.677770 IP 192.168.1.100 > 192.168.1.101: ICMP echo request, id 23147, seq 25, length 64
    16:07:36.685824 IP 192.168.1.100 > 192.168.1.101: ICMP echo request, id 23147, seq 26, length 64

     

  5. 修改數(shù)據(jù)包的 VLAN Tag

    除了使用“ping”、“tcpdump”和“iperf” 等 Linux 命令以外,我們也可以使用 OVS 提供的 ovs-appctl ofproto/trace 工具來(lái)測(cè)試 OVS 對(duì)數(shù)據(jù)包的轉(zhuǎn)發(fā)狀況。ovs-appctl ofproto/trace 可以用來(lái)生成測(cè)試用的模擬數(shù)據(jù)包,并一步步的展示 OVS 對(duì)數(shù)據(jù)包的流處理過(guò)程。在以下的例子中,我們演示一下如何使用這個(gè)命令:

    修改端口 p1 的 VLAN tag 為 101,使端口 p1 成為一個(gè)隸屬于 VLAN 101 的端口

    $ ovs-vsctl set Port p1 tag=101

     

    現(xiàn)在由于端口 p0 和 p1 屬于不同的 VLAN,它們之間無(wú)法進(jìn)行數(shù)據(jù)交換。我們使用 ovs-appctl ofproto/trace 生成一個(gè)從端口 p0 發(fā)送到端口 p1 的數(shù)據(jù)包,這個(gè)數(shù)據(jù)包不包含任何 VLAN tag,并觀察 OVS 的處理過(guò)程

    $ ovs-appctl ofproto/trace ovs-switch in_port=100,dl_src=66:4e:cc:ae:4d:20,
    dl_dst=46:54:8a:95:dd:f8 -generate
    Flow:metadata=0,in_port=100,vlan_tci=0x0000,dl_src=66:4e:cc:ae:4d:20,
     dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000
    Rule: table=0 cookie=0 priority=0
    OpenFlow actions=NORMAL
    no learned MAC for destination, flooding
    
    Final flow: unchanged
    Relevant fields: skb_priority=0,in_port=100,vlan_tci=0x0000/0x1fff,\
    dl_src=66:4e:cc:ae:4d:20,dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000,nw_frag=no
    Datapath actions: 4,1

     

    在第一行輸出中,“Flow:”之后的字段描述了輸入的流的信息。由于我們沒(méi)有指定太多信息,所以多數(shù)字段 (例如 dl_type 和 vlan_tci)被 OVS 設(shè)置為空值。

    在第二行的輸出中,“Rule:” 之后的字段描述了匹配成功的流表項(xiàng)。

    在第三行的輸出中,“OpenFlow actions”之后的字段描述了實(shí)際執(zhí)行的操作。

    最后一段以”Final flow”開(kāi)始的字段是整個(gè)處理過(guò)程的總結(jié),“Datapath actions: 4,1”代表數(shù)據(jù)包被發(fā)送到 datapath 的 4 和 1 號(hào)端口。

    創(chuàng)建一條新的 Flow:對(duì)于從端口 p0 進(jìn)入交換機(jī)的數(shù)據(jù)包,如果它不包含任何 VLAN tag,則自動(dòng)為它添加 VLAN tag 101

    $ ovs-ofctl add-flow ovs-switch "priority=3,in_port=100,dl_vlan=0xffff,\
    actions=mod_vlan_vid:101,normal"

     

    再次嘗試從端口 p0 發(fā)送一個(gè)不包含任何 VLAN tag 的數(shù)據(jù)包,發(fā)現(xiàn)數(shù)據(jù)包進(jìn)入端口 p0 之后, 會(huì)被加上 VLAN tag101, 同時(shí)轉(zhuǎn)發(fā)到端口 p1 上

    $ ovs-appctl ofproto/trace ovs-switch in_port=100,dl_src=66:4e:cc:ae:4d:20,
    dl_dst=46:54:8a:95:dd:f8 –generate
    Flow: metadata=0,in_port=100,vlan_tci=0x0000,dl_src=66:4e:cc:ae:4d:20,
    dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000
    Rule: table=0 cookie=0 priority=3,in_port=100,vlan_tci=0x0000
    OpenFlow actions=mod_vlan_vid:101,NORMAL
    forwarding to learned port
    
    Final flow: metadata=0,in_port=100,dl_vlan=101,dl_vlan_pcp=0,dl_src=66:4e:cc:ae:4d:20,
    dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000
    Relevant fields: skb_priority=0,in_port=100,vlan_tci=0x0000/0x1fff,dl_src=66:4e:cc:ae:4d:20,
    dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000,nw_frag=no
    Datapath actions: 3

     

    反過(guò)來(lái)從端口 p1 發(fā)送數(shù)據(jù)包,由于 p1 現(xiàn)在是帶有 VLAN tag 101 的 Access 類型的端口,所以數(shù)據(jù)包進(jìn)入端口 p1 之后,會(huì)被 OVS 添加 VLAN tag 101 并發(fā)送到端口 p0

    $ ovs-appctl ofproto/trace ovs-switch in_port=101,dl_dst=66:4e:cc:ae:4d:20,
    dl_src=46:54:8a:95:dd:f8 -generate
    Flow: metadata=0,in_port=101,vlan_tci=0x0000,dl_src=46:54:8a:95:dd:f8,
    dl_dst=66:4e:cc:ae:4d:20,dl_type=0x0000
    Rule: table=0 cookie=0 priority=0
    OpenFlow actions=NORMAL
    forwarding to learned port
    
    Final flow: unchanged
    Relevant fields: skb_priority=0,in_port=101,vlan_tci=0x0000,dl_src=46:54:8a:95:dd:f8,
    dl_dst=66:4e:cc:ae:4d:20,dl_type=0x0000,nw_frag=no
    Datapath actions: push_vlan(vid=101,pcp=0),2

     

  6. 其他 OpenFlow 常用的操作

    查看交換機(jī)中的所有 Table

    ovs-ofctl dump-tables ovs-switch

     

    查看交換機(jī)中的所有流表項(xiàng)

    ovs?ofctl dump?flows ovs-switch

     

    刪除編號(hào)為 100 的端口上的所有流表項(xiàng)

    ovs-ofctl del-flows ovs-switch "in_port=100"

     

    查看交換機(jī)上的端口信息

    ovs-ofctl show ovs-switch

     

回頁(yè)首

通過(guò) Floodlight 管理 OVS

一 方面,OpenFlow 控制器可以通過(guò) OpenFlow 協(xié)議連接到任何支持 OpenFlow 的交換機(jī),控制器通過(guò)和交換機(jī)交換流表規(guī)則來(lái)控制數(shù)據(jù)流向。另一方面, OpenFlow 控制器向用戶提供的界面或者接口,用戶可以通過(guò)界面對(duì)網(wǎng)絡(luò)架構(gòu)進(jìn)行動(dòng)態(tài)的修改,修改交換機(jī)的流表規(guī)則等等。Floodlight 是一個(gè)基于 Apache 協(xié)議,使用 Java 開(kāi)發(fā)的企業(yè)級(jí) OpenFlow 控制器。我們?cè)谙旅娴睦又醒菔救绾伟惭b Floodlight,并連接管理 OVS 的過(guò)程。

Floodlight 的安裝過(guò)程非常簡(jiǎn)單,在另外一臺(tái)機(jī)器上, 下載 Floodlight 源碼并編譯

$ git clone git://github.com/floodlight/floodlight.git
$ cd floodlight/
$ ant
$ java -jar target/floodlight.jar

運(yùn)行 Floodlight

$ java -jar floodlight.jar

在 安裝了 OVS 交換機(jī)的節(jié)點(diǎn)上,配置 OVS 交換機(jī) ovs-switch,使用 Floodlight 作為控制器。默認(rèn)情況下,F(xiàn)loodlight 在端口 6633 上進(jìn)行監(jiān)聽(tīng),我們使用 ovs-vsctl 命令配置 OVS 交換機(jī)使用 TCP 協(xié)議連接到 Floodlight(IP 地址為 9.181.137.182,端口號(hào) 6633)。對(duì)于一個(gè) OVS 交換機(jī)來(lái)說(shuō),可以同時(shí)配置一個(gè)或者多個(gè)控制器

$ ovs-vsctl set-controller ovs-switch tcp:9.181.137.182:6633

當(dāng) OVS 交換機(jī)連接到 Floodlight 控制器后,理論上所有的流表規(guī)則應(yīng)該交給控制器來(lái)建立。由于 OVS 交換機(jī)和控制器之間是通過(guò)網(wǎng)絡(luò)通訊來(lái)傳遞數(shù)據(jù)的,所以網(wǎng)絡(luò)連接失敗會(huì)影響到 Flow 的建立。針對(duì)這種情況,OVS 提供了兩種處理模式:

  • standlone: 默認(rèn)模式。如果 OVS 交換機(jī)超過(guò)三次無(wú)法正常連接到 OpenFlow 控制器,OVS 交換機(jī)自己會(huì)負(fù)責(zé)建立流表。在這種模式下,OVS 和常見(jiàn)的 L2 交換機(jī)相似。與此同時(shí),OVS 也會(huì)繼續(xù)嘗試連接控制器,一旦網(wǎng)絡(luò)連接恢復(fù),OVS 會(huì)再次切換到使用控制器進(jìn)行流表管理。

  • secure: 在 secure 模式下,如果 OVS 無(wú)法正常連接到 OpenFlow 控制器,OVS 會(huì)不停的嘗試與控制器重新建立連接,而不會(huì)自己負(fù)責(zé)建立流表。

設(shè)置 OVS 的連接模式為 secure 模式

$ ovs-vsctl set Bridge ovs-switch fail-mode=secure

查看 OVS 的狀態(tài),“is_connected:true”代表 OVS 已經(jīng)成功連接到了 Floodlight

$ ovs-vsctl show
30282710-d401-4187-8e13-52388f693df7
    Bridge ovs-switch
        Controller "tcp:9.181.137.182:6633"
            is_connected: true
        Port ovs-switch
            Interface ovs-switch
                type: internal
        Port "p0"
            Interface "p0"
                type: internal
        Port "p1"
            tag: 101
            Interface "p1"
                type: internal
        Port "p2"
            Interface "p2"
                type: internal

通過(guò)訪問(wèn) Floodlight 提供的 Web 管理界面 http://<Host Address>:8080/ui/index.html,我們可以查看 Floodlight 控制器的狀態(tài)以及所有連接到 Floodlight 的交換機(jī)列表

圖 2. Floodlight 主界面

基于Open vSwitch的OpenFlow怎么用

選中某個(gè) OpenFlow 交換機(jī), 查看其中的端口列表和流表信息

圖 3. 查看 OpenFlow 交換機(jī)的詳細(xì)信息

基于Open vSwitch的OpenFlow怎么用

通過(guò) Floodlight 的 RESTAPI,添加兩條新的規(guī)則讓端口 p0 和 p1 可以相互通訊。注意:替換命令行中的 switch 的 ID 為交換機(jī)的 datapath ID

curl -d '{"switch": "00:00:0e:f9:05:6b:7c:44", "name":"my-flow1", "cookie":"0","priority":"32768",
"ingress-port":"100","active":"true", "actions":"output=flood"}' 
http://9.181.137.182:8080/wm/staticflowentrypusher/json

curl -d '{"switch": "00:00:0e:f9:05:6b:7c:44", "name":"my-flow2", "cookie":"0","priority":"32768",
"ingress-port":"101","active":"true", "actions":"output=flood"}' 
http://9.181.137.182:8080/wm/staticflowentrypusher/json

驗(yàn)證是否能從端口 p0 發(fā)送數(shù)據(jù)包到 p1

$ ip netns exec ns0 ping -c4 192.168.1.101
PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.
64 bytes from 192.168.1.101: icmp_req=1 ttl=64 time=0.027 ms
64 bytes from 192.168.1.101: icmp_req=2 ttl=64 time=0.018 ms
64 bytes from 192.168.1.101: icmp_req=3 ttl=64 time=0.023 ms
64 bytes from 192.168.1.101: icmp_req=4 ttl=64 time=0.022 ms

--- 192.168.1.101 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 0.018/0.022/0.027/0.005 ms

在 OVS 端也可以看到,流表規(guī)則已經(jīng)被 OVS 同步到本地。

$ ovs-ofctl dump-flows ovs-switch
NXST_FLOW reply (xid=0x4):
 cookie=0xa0000000000000, duration=335.122s, table=0, n_packets=347, n_bytes=28070, 
  idle_age=1, in_port=100 actions=FLOOD
 cookie=0xa0000000000000, duration=239.892s, table=0, n_packets=252, n_bytes=24080, 
  idle_age=0, in_port=101 actions=FLOOD

通過(guò) Floodlight 的 RestAPI,查看交換機(jī)上的流表規(guī)則

curl http://9.181.137.182:8080/wm/staticflowentrypusher/list/00:00:0e:f9:05:6b:7c:44/json

通過(guò) Floodlight 的 RestAPI,刪除交換機(jī)上的流表規(guī)則

curl http://9.181.137.182:8080/wm/staticflowentrypusher/clear/00:00:0e:f9:05:6b:7c:44/json

以上是“基于Open vSwitch的OpenFlow怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁(yè)標(biāo)題:基于OpenvSwitch的OpenFlow怎么用
瀏覽地址:http://muchs.cn/article18/iidedp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、云服務(wù)器、品牌網(wǎng)站制作做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司