OpenvSwitch完全使用手冊



http://sdnhub.cn/index.php/openv-switch-full-guide/

1 什麼是OpenvSwitch

OpenvSwitch,簡稱OVS是一個虛擬交換軟件,主要用於虛擬機VM環境,作爲一個虛擬交換機,支持Xen/XenServer, KVM, and VirtualBox多種虛擬化技術。OpenvSwitch還支持多個物理機的分佈式環境。

在這種某一臺物理機器的虛擬化環境中,一個虛擬交換機(vswitch)主要有如下兩個作用:

  • 傳遞虛擬機VM之間的流量
  • 以及實現VM和外界網絡的通信。

如下圖所示:

openvswitch-intro

整個OVS代碼用C寫的。目前有以下功能:

  • Standard 802.1Q VLAN model with trunk and access ports
  • NIC bonding with or without LACP on upstream switch
  • NetFlow, sFlow(R), and mirroring for increased visibility
  • QoS (Quality of Service) configuration, plus policing
  • GRE, GRE over IPSEC, VXLAN, and LISP tunneling
  • 802.1ag connectivity fault management
  • OpenFlow 1.0 plus numerous extensions
  • Transactional configuration database with C and Python bindings
  • High-performance forwarding using a Linux kernel module

2 OpenvSwitch的組成

OVS的核心組件包括 ovsdb-server,ovs-vswitchd,ovs kernel module。如下圖所示:

openvswitch-main-components

運行原理:

內核模塊實現了多個“數據路徑(DataPath)”(類似於網橋),每個都可以有多個“vports”(類似於橋內的端口)。每個數據路徑也通過關聯流表(flow table)來設置操作,而這些流表中的流都是用戶空間在報文頭和元數據的基礎上映射的關鍵信息,一般的操作都是將數據包轉發到另一個vport。當一個數據包到達一個vport,內核模塊所做的處理是提取其流的關鍵信息並在流表中查找這些關鍵信息。當有一個匹配的流時它執行對應的操作。如果沒有匹配,它會將數據包送到用戶空間的處理隊列中(作爲處理的一部分,用戶空間可能會設置一個流用於以後遇到相同類型的數據包可以在內核中執行操作)。細節如下圖所示:

openvswitch-details

除了核心組件,還包括一些管理工具,詳細介紹如下:

  • ovs-vswitchd:OVS守護進程是OVS的核心部件,實現交換功能,和Linux內核兼容模塊一起,實現基於流的交換(flow-based switching)。它和上層 controller 通信遵從 OPENFLOW 協議,它與 ovsdb-server 通信使用 OVSDB 協議,它和內核模塊通過netlink通信,它支持多個獨立的 datapath(網橋),它通過更改flow table 實現了綁定和VLAN等功能。
  • ovsdb-server:OVS輕量級的數據庫服務器,用於整個OVS的配置信息,包括接口,交換內容,VLAN 等等。ovs-vswitchd 根據數據庫中的配置信息工作。它於 manager 和 ovs-vswitchd 交換信息使用了OVSDB(JSON-RPC)的方式。
  • ovs-dpctl:一個工具,用來配置交換機內核模塊,可以控制轉發規則。
  • ovs-vsctl:主要是獲取或者更改ovs-vswitchd的配置信息,此工具操作的時候會更新ovsdb-server中的數據庫。
  • ovs-appctl:主要是向OVS守護進程發送命令的,一般用不上。 a utility that sends commands to running Open vSwitch daemons (ovs-vswitchd)
  • ovsdbmonitor:GUI工具來顯示ovsdb-server中數據信息。(Ubuntu下是可以使用apt-get安裝,可以遠程獲取OVS數據庫和OpenFlow的流表)
  • ovs-controller:一個簡單的OpenFlow控制器
  • ovs-ofctl:用來控制OVS作爲OpenFlow交換機工作時候的流表內容。
  • ovs-pki:OpenFlow交換機創建和管理公鑰框架;
  • ovs-tcpundump:tcpdump的補丁,解析OpenFlow的消息;
  • brocompat.ko : Linux bridge compatibility module
  • openvswitch.ko : Open vSwitch switching datapath

一些用用的OVS命令示例:

sudo ovs-vsctl show
sudo ovs-vsctl add-br mybridge
sudo ovs-vsctl del-br mybridge
sudo ovs-vsctl add-port mybridge port-name
sudo ovs-vsctl del-port mybridge port-name
sudo ovs-vsctl list Bridge/Port/Interface/...
sudo ovs-appctl fdb/show mybridge
sudo ovs-ofctl show mybridge
sudo ovs-ofctl dump-flows mybridge
sudo ovs-ofctl add-flow mybridge dl_src=02:a2:a2:a2:a2:a2,dl_dst=02:b2:b2:b2:b2:b2,in_port=2,dl_type=0x0800,nw_src=10.0.0.1,nw_dst=10.0.0.2,actions=output:6
sudo ovs-ofctl del-flows mybridge dl_src=02:a2:a2:a2:a2:a2,dl_dst=02:b2:b2:b2:b2:b2,in_port=2,dl_type=0x0800,nw_src=10.0.0.1,nw_dst=10.0.0.2
sudo ovs-ofctl add-flow dp0 in_port=2,actions=output:6
# This will delete all the flow entries in the flow table
sudo ovs-ofctl del-flows mybridge

3 OpenvSwitch和其他vswitch

這裏其他的vswitch,包括VMware vNetwork distributed switch以及思科的Cisco Nexus 1000V。

VMware vNetwork distributed switch以及思科的Cisco Nexus 1000V這種虛擬交換機提供的是一個集中式的控制方式,。而OVS則是一個獨立的vswitch,他運行在每個實現虛擬化的物理機器上,並提供遠程管理。

OVS提供了兩種在虛擬化環境中遠程管理的協議:

  • 一個是OpenFlow,通過流表來管理交換機的行爲,
  • 一個是OVSDB management protocol,用來暴露sietch的port狀態。

4 概念及工作流程

4.1 vswitch、Bridge、Datapath

在網絡中,交換機和橋都是同一個概念,OVS實現了一個虛擬機的以太交換機,換句話說,OVS也就是實現了一個以太橋。那麼,在OVS中,給一個交換機,或者說一個橋,用了一個專業的名詞,叫做DataPath!

要了解OVS如何工作,首先需要知道橋的概念:

網橋也叫做橋接器,連接兩個局域網的設備,網橋工作在數據鏈路層,將兩個LAN連接,根據MAC地址來轉發幀,可以看成一個“低層的路由器”(路由器工作在網絡層,根據IP地質進行轉發)。

網橋的工作原理

網橋處理包遵循以下幾條規則:

  • 在一個接口上接收到的包不會再往那個接口上發送此包。
  • 每個接收到的包都要學習其源MAC地址。
  • 如果數據包是多播或者廣播包(通過2層MAC地址確定)則要向接收端口以外的所有端口轉發,如果上層協議感興趣,則還會遞交上層處理。
  • 如果數據包的地址不能再CAM表中找到,則向接收端口以外的其他端口轉發。
  • 如果CAM表中能找到,則轉發給相應端口,如果發送和接收都是統一端口,則不發送。

注意,網橋是以混雜模式工作的。關於網橋更多,請查閱相關資料。

OVS中的bridge

上面,說到,一個橋就是一個交換機。例如,在OVS中:

root@localhost:~# ovs-vsctl add-br br0
root@localhost:~# ifconfig br0
      br0    Link encap:Ethernet  HWaddr 1a:09:56:ea:0b:49  
      inet6 addr: fe80::1809:56ff:feea:b49/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:1584 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:316502 (316.5 KB)  TX bytes:468 (468.0 B)

當我們創建了一個交換機(網橋)以後,此時網絡功能不受影響,但是會產生一個虛擬網卡,名字就是網橋的名稱(br-int),之所以會產生一個虛擬網卡,是爲了實現接下來的網橋(交換機)功能。有了這個交換機以後,還需要爲這個交換機增加端口(port),一個端口,就是一個物理網卡,當網卡加入到這個交換機之後,其工作方式就和普通交換機的一個端口的工作方式類似了。

root@localhost:~# ovs-vsctl add-port br0 port

這裏要特別注意,網卡加入網橋以後,要按照網橋的工作標準工作,那麼加入的一個端口就必須是以混雜模式工作,工作在鏈路層,處理2層的幀,所以這個port就不需要配置IP了。(你沒見過哪個交換的端口有IP的吧)

那麼接下來你可能會問,通常的交換機不都是有一個管理接口,可以telnet到交換機上進行配置吧,那麼在OVS中創建的虛擬交換機有木有這種呢,有的!上面既然創建交換機brname的時候產生了一個虛擬網口 br-int,那麼,你給這個虛擬網卡配置了IP以後,就相當於給交換機的管理接口配置了IP,此時一個正常的虛擬交換機就搞定了。

root@localhost:~# ip address add 192.168.1.1/24 dev br0

最後,我們來看看一個br的具體信息:

root@localhost:~# ovs-vsctl show
bc12c8d2-6900-42dd-9c1c-30e8ecb99a1b
Bridge "br0"
    Port "eth0"
        Interface "eth0"
    Port "br0"
        Interface "br0"
            type: internal
ovs_version: "1.4.0+build0"

首先,這裏顯示了一個名爲br0的橋(交換機),這個交換機有兩個接口,一個是eth0,一個是br0,上面說到,創建橋的時候會創建一個和橋名字一樣的接口,並自動作爲該橋的一個端口,那麼這個虛擬接口的作用,一方面是可以作爲交換機的管理端口,另一方面也是基於這個虛擬接口,實現了橋的功能。

#### OpenvSwitch的典型工作流程

這一部分以一個簡單的例子,說明在虛擬化環境中OpenvSwitch的典型工作流程。

前面已經說到,OVS主要是用來在虛擬化環境中。實現虛擬機之間通信以及一個虛擬機和外網之間通信,如下是一個典型的結構圖:

那麼,通常情況下的工作流程如下:

logical_model

  1. VM實例 instance 產生一個數據包併發送至實例內的虛擬網絡接口 VNIC,圖中就是 instance 中的 eth0.
  2. 這個數據包會傳送到物理機上的VNIC接口,如圖就是vnet接口。
  3. 數據包從 vnet NIC 出來,到達橋(虛擬交換機) br100 上.
  4. 數據包經過交換機的處理,從物理節點上的物理接口發出,如圖中物理機上的 eth0 .
  5. 數據包從 eth0 出去的時候,是按照物理節點上的路由以及默認網關操作的,這個時候該數據包其實已經不受你的控制了。

一般 L2 switch 連接 eth0 的這個口是一個 trunk 口, 因爲虛擬機對應的 VNET 往往會設置 VLAN TAG, 可以通過對虛擬機對應的 vnet 打 VALN TAG 來控制虛擬機的網絡廣播域. 如果跑多個虛擬機的話, 多個虛擬機對應的 vnet 可以設置不同的 vlan tag, 那麼這些虛擬機的數據包從 eth0(4)出去的時候, 會帶上TAG標記. 這樣也就必須是 trunk 口才行.

6 OVS簡單應用實例

6.1 創建物理機到物理機的網絡拓撲

example-topo

root@localhost:~# ovs-vsctl add-br br0
root@localhost:~# ovs-vsctl add-port br0 eth0
root@localhost:~# ovs-vsctl add-port br0 eth1

6.2 創建虛擬機到虛擬機的網絡拓撲

使用KVM虛擬化。

example-topo

root@localhost:~# ovs-vsctl add-br br0
root@localhost:~# cat /etc/ovs-ifup
#!/bin/sh

switch='br0'
/sbin/ifconfig  $1 0.0.0.0 up
ovs-vsctl add-port ${switch} $1

root@localhost:~# cat /etc/ovs-ifdown
#!/bin/sh

switch= 'br0'
ovs-vsctl del-port ${sw/sbin/ifconfig  $1 0.0.0.0 down
itch} $1

root@localhost:~# kvm -m 512 -net nic,macaddr=00:11:22:33:44:55 -net \
tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive \
file=/path/to/disk-image,boot=on
        
root@localhost:~# kvm -m 512 -net nic,macaddr=11:22:33:44:55:66 -net \     
tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive \
file=/path/to/disk-image,boot=on

7.Misc

7.1 查表

ovs-vsctl list bridge ovs-br

7.2 關於 Brdige 及 Port

創建 Brdige

ovs-vsctl add-br ovs-br

在 ovs-br 上添加 interface

ovs-vsctl add-port ovs-br eth0

(1) + (2) 的可以合併爲:

ovs−vsctl add−br ovs-br -- add−port ovs-br eth0

刪除 Bridge

ovs-vsctl del-br ovs-br #如果不存在, 會有error log
ovs-vsctl --if-exists del-br ovs-br

更改 ofport (openflow port number)爲100:

ovs-vsctl add-port ovs-br eth0 -- set Interface eth0 ofport_request=100

設置 port 爲 internal

ovs-vsctl set Interface eth0 type=internal

7.3 關於Controller

設置 Controller

ovs-vsctl set-controller ovs-br tcp:1.2.3.4:6633

設置 multi controller
ovs-vsctl set-controller ovs-br tcp:1.2.3.4:6633 tcp:5.6.7.8:6633

查詢 Controller

ovs-vsctl show

如果有成功連到 controller 則提示 is_connected:true, 反之未連上:

ovs-vsctl get-controller ovs-br

移除 Controller
ovs-vsctl del-controller ovs-br

7.4 關於 STP (Spanning Tree Protocol)

開啓 STP

ovs-vsctl set bridge ovs-br stp_enable=true

關閉 STP

ovs-vsctl set bridge ovs-br stp_enable=false

查詢 STP 配置信息

ovs-vsctl get bridge ovs-br stp_enable

設置 Priority

ovs−vsctl set bridge br0 other_config:stp-priority=0x7800

設置 Cost
ovs−vsctl set port eth0 other_config:stp-path-cost=10

移除 STP 設置

ovs−vsctl clear bridge ovs-br other_config

7.5 關於 Openflow Version

支持 OpenFlow Version 1.3

ovs-vsctl set bridge ovs-br protocols=OpenFlow13

支持 OpenFlow Version 1.3 1.2

ovs-vsctl set bridge ovs-br protocols=OpenFlow12,OpenFlow13

移除 OpenFlow 支持設置

ovs-vsctl clear bridge ovs-br protocols

7.6 關於 VLAN

設置 VLAN tag

ovs-vsctl add-port ovs-br vlan3 tag=3 -- set interface vlan3 type=internal

移除 VLAN

ovs-vsctl del-port ovs-br vlan3

查詢 VLAN

ovs-vsctl show
ifconfig vlan3

設置 Vlan trunk
ovs-vsctl add-port ovs-br eth0 trunk=3,4,5,6

設置已 add 的 port 爲 access port, vlan id 9

ovs-vsctl set port eth0 tag=9

ovs-ofctl add-flow 設置 vlan 100

ovs-ofctl add-flow ovs-br in_port=1,dl_vlan=0xffff,actions=mod_vlan_vid:100,output:3
ovs-ofctl add-flow ovs-br in_port=1,dl_vlan=0xffff,actions=push_vlan:0x8100,set_field:100-\>vlan_vid,output:3

ovs-ofctl add-flow 拿掉 vlan tag

ovs-ofctl add-flow ovs1 in_port=3,dl_vlan=100,actions=strip_vlan,output:1
two_vlan example

ovs-ofctl add-flow pop-vlan

ovs-ofctl add-flow ovs-br in_port=3,dl_vlan=0xffff,actions=pop_vlan,output:1

7.7 關於 GRE Tunnel

設置 GRE tunnel

ovs−vsctl add−port ovs-br ovs-gre -- set interface ovs-gre type=gre options:remote_ip=1.2.3.4

查詢 GRE Tunnel

ovs-vsctl show

7.8 關於 Dump flows

Dumps OpenFlow flows 不含 hidden flows (常用)

ovs-ofctl dump-flows ovs-br

Dumps OpenFlow flows 包含 hidden flows

ovs-appctl bridge/dump-flows ovs-br

Dump 特定 bridge 的 datapath flows 不論任何 type

ovs-appctl dpif/dump-flows ovs-br

Dump 在 Linux kernel 裡的 datapath flow table (常用)

ovs-dpctl dump-flows [dp]

Top like behavior for ovs-dpctl dump-flows

ovs-dpctl-top

7.9 XenServer 開啓 OpenvSwitch 方式

檢查是否啓動openvswitch服務:

service openvswitch status

啓動服務

xe-switch-network-backend openvswitch

關閉服務

xe-switch-network-backend bridge

7.10 關於 Log

查詢 log level list

ovs-appctl vlog/list

設置 log level (以 stp 設置 file 爲 dbg level 爲例)

ovs-appctl vlog/set stp:file:dbg
ovs-appctl vlog/set {module name}:{console, syslog, file}:{off, emer, err, warn, info, dbg}

7.11 關於 Fallback

Controller connection: false 的時候, 會自動調成 legacy switch mode

ovs-vsctl set-fail-mode ovs-br standalone

無論 Controller connection status 爲何, 都必須通過 OpenFlow 進行網絡行爲 (default)

ovs-vsctl set-fail-mode ovs-br secure

移除

ovs-vsctl del-fail-mode ovs-br

查詢

ovs-vsctl get-fail-mode ovs-br

7.12 關於 sFlow

查詢

ovs-vsctl list sflow

新增

Set sFlow 缺

刪除

ovs-vsctl -- clear Bridge ovs-br sflow

7.13關於 NetFlow

查詢

ovs-vsctl list netflow

新增

Set NetFlow 缺

刪除

ovs-vsctl -- clear Bridge ovs-br netflow

7.14 設置 Out-of-band 和 in-band

查詢

ovs-vsctl get controller ovs-br connection-mode

Out-of-band

ovs-vsctl set controller ovs-br connection-mode=out-of-band

In-band (default)

ovs-vsctl set controller ovs-br connection-mode=in-band

移除 hidden flow

ovs-vsctl set bridge br0 other-config:disable-in-band=true

7.15 關於 ssl

查詢

ovs-vsctl get-ssl

設置

ovs-vsctl set-ssl sc-privkey.pem sc-cert.pem cacert.pem
OpenvSwitch Lab 6$ TLS SSL : http://roan.logdown.com/posts/208707-openvswitch-lab-6-ssl

刪除

ovs-vsctl del-ssl

7.16 關於 SPAN

詳細設置

ovs-vsctl add-br ovs-br
ovs-vsctl add-port ovs-br eth0
ovs-vsctl add-port ovs-br eth1
ovs-vsctl add-port ovs-br tap0 \
     -- --id=@p get port tap0 \
     -- --id=@m create mirror name=m0 select-all=true output-port=@p \
     -- set bridge ovs-br mirrors=@m

將 ovs-br 上 add-port {eth0,eth1} mirror 至 tap0

刪除

ovs-vsctl clear bridge ovs-br mirrors # 關於 Table

查 table ovs-ofctl dump-tables ovs-br

7.17 關於 Group Table

參考 hwchiu – Multipath routing with Group table at mininet

建立 Group id 及對應的 bucket

ovs-ofctl -O OpenFlow13 add-group ovs-br group_id=5566,type=select,bucket=output:1,bucket=output:2,bucket=output:3

type 共有 All, Select, Indirect, FastFailover, 詳細規格:http://flowgrammable.org/sdn/openflow/message-layer/groupmod/#GroupMod_1.3

使用 Group Table

ovs-ofctl -O OpenFlow13 add-flow ovs-br in_port=4,actions=group:5566

7.18 關於 VXLAN

參考 rascov – Bridge Remote Mininets using VXLAN

建立 VXLAN Network ID (VNI) 和指定的 OpenFlow port number, eg: VNI=5566, OF_PORT=9

ovs-vsctl set interface vxlan type=vxlan option:remote_ip=x.x.x.x option:key=5566 ofport_request=9

VNI flow by flow

ovs-vsctl set interface vxlan type=vxlan option:remote_ip=140.113.215.200 option:key=flow ofport_request=9

設置 VXLAN tunnel id

ovs-ofctl add-flow ovs-br in_port=1,actions=set_field:5566->tun_id,output:2
ovs-ofctl add-flow s1 in_port=2,tun_id=5566,actions=output:1

7.19 關於 OVSDB Manager

參考 OVSDB Integration:Mininet OVSDB Tutorial

Active Listener 設置

ovs-vsctl set-manager tcp:1.2.3.4:6640

Passive Listener 設置

ovs-vsctl set-manager ptcp:6640

7.20 OpenFlow Trace

Generate pakcet trace

ovs-appctl ofproto/trace ovs-br in_port=1,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02 -generate

7.21 其它

查詢 OpenvSwitch 版本

ovs-ofctl -V

查詢指令歷史記錄

ovsdb-tool show-log [-mmm]

[參考]

  1. http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob_plain;f=FAQ;hb=HEAD
  2. http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob_plain;f=README;hb=HEAD
  3. http://openvswitch.org/support/config-cookbooks/vlan-configuration-cookbook/
  4. http://roan.logdown.com/posts/191801-set-openvswitch
  5. http://roan.logdown.com/posts/208707-openvswitch-lab-6-ssl
  6. http://flowgrammable.org/sdn/openflow/message-layer/groupmod/#GroupMod_1.3
  7. http://www.areteix.net/blog/2013/08/network-flow-monitoring-with-open-vswitch/
  8. http://blog.scottlowe.org/2014/11/21/removing-ovs-configuration-settings/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章