ovsdb協議
① 有人用OVS做過限制實例帶寬嗎
Open vSwitch使用 網橋管理 添加名為br0的網橋 ovs-vsctl add-br br0 刪除名為br0的網橋 ovs-vsctl del-br br0 列出所有網橋 ovs-vsctl list-br 判斷網橋br0是否存在 ovs-vsctl br-exists br0 列出掛接到網橋br0上的所有網路介面 ovs-vsctl list-ports br0 將網路介面eth0掛接到網橋br0上 ovs-vsctl add-port br0 eth0 刪除網橋br0上掛接的eth0網路介面 ovs-vsctl del-port br0 eth0 列出已掛接eth0網路介面的網橋 ovs-vsctl port-to-br eth0 網橋管理(ovsdb資料庫操作) ovsdb是一個非常輕量級的資料庫,與其說它是一個資料庫,不如說它是一個提供增刪查改等功能的臨時配置緩存,之所以這么說,是因為ovsdb資料庫的根本就未使用多少資料庫技術,如SQL語言查詢、存儲過程等等。ovsdb 資料庫通過模式文件「openvswitch-1.1.0pre2/vswitchd/vswitch.ovsschema」,如要定製ovsdb資料庫,可通過更改 vswitch.ovsschema 文件實現,不過以下姑且仍以資料庫稱之。 資料庫操作的一般格式為: ovs-vsctl list/set/get/add/remove/clear/destroy table record column [value] 默認情況下ovsdb中有以下數據表: bridge, controller,interface,mirror,netflow,open_vswitch,port,qos,queue,ssl,sflow 即table可為上面的任一個。record為數據表中name欄位的值,column為數據表任一個欄位的欄位名,value欄位值。 基本操作: 查看bridge數據表中的所有記錄 獲得bridge數據表_uuid欄位的值 設置bridge數據表datapath_type欄位的值 清除bridge數據表flood_vlans欄位的值 ovs-vsctl remove bridge xenbr0 flood_vlans 23 或者 ovs-vsctl clear bridge xenbr0 flood_vlans 刪除uuid為69ee0c09-9e52-4236-8af6-037a98ca704d的qos記錄 ovs-vsctl destroy qos 69ee0c09-9e52-4236-8af6-037a98ca704d 應用場景設置: QoS設置 針對網路介面的設置:設置網路介面vif0.0的帶寬為1000±100kbps ovs-vsctl set interface vif0.0 ingress_policing_rate=1000 ovs-vsctl set interface vif0.0 ingress_policing_burst=100 (ingress_policing_rate:最大發送速率(單位均為kbps) ingress_policing_burst:超過ingress_policing_rate的最大浮動值) 針對交換機埠的設置:創建在vif0.0埠上的linux-htb QoS,linux-htb QoS可以針對具有指定特徵的數據包流設置最大最小帶寬,且在最大帶寬范圍內,某一特徵的數據包流可以借用其他特徵數據包流未用完的帶寬。 ovs-vsctl -- set port vif0.0 qos=@newqos -- --id=@newqos create qos type=linux-htb other-config: max-rate=100000000 queues=0=@q0,1=@q1 -- --id=@q0 create queue other-config:min-rate=100000000 other-config:max-rate=100000000 -- --id=@q1 create queue other-config:min-rate=500000000 將帶寬限制加於某特徵數據包流上 (假設vif0.0的接在交換機1號埠上,ovs-ofctl命令的使用見2.2.3) ovs-ofctl add-flow xenbr0 "in_port=2,idle_timeout=0,actions=enqueue:1:0" 埠映射 將發往eth0埠和從eth1埠發出的數據包全部定向到eth2埠 (假設eth0、eth1、eth2埠的uuid分別為: 69ee0c09-9e52-4236-8af6-037a98ca704d 69ee0c09-9e52-4236-8af6-037a98ca704e 69ee0c09-9e52-4236-8af6-037a98ca704f 埠的uuid可以通過ovs-vsctl list port命令查看) ovs-vsctl -- set bridge xenbr0 mirrors=@m -- --id=@m create mirror name=mymirror select-dst-port=69ee0c09-9e52-4236-8af6-037a98ca704d select-src-port=69ee0c09-9e52-4236-8af6-037a98ca704e output-port=69ee0c09-9e52-4236-8af6-037a98ca704f 流規則管理 流規則組成 每條流規則由一系列欄位組成,分為基本欄位、條件欄位和動作欄位三部分: 基本欄位包括生效時間ration_sec、所屬表項table_id、優先順序priority、處理的數據包數n_packets,空閑超時時間idle_timeout等,空閑超時時間idle_timeout以秒為單位,超過設置的空閑超時時間後該流規則將被自動刪除,空閑超時時間設置為0表示該流規則永不過期,idle_timeout將不包含於ovs-ofctl mp-flows brname的輸出中。 條件欄位包括輸入埠號in_port、源目的mac地址dl_src/dl_dst、源目的ip地址nw_src/nw_dst、數據包類型dl_type、網路層協議類型nw_proto等,可以為這些欄位的任意組合,但在網路分層結構中底層的欄位未給出確定值時上層的欄位不允許給確定值,即一條流規則中允許底層協議欄位指定為確定值,高層協議欄位指定為通配符(不指定即為匹配任何值),而不允許高層協議欄位指定為確定值,而底層協議欄位卻為通配符(不指定即為匹配任何值),否則,ovs-vswitchd 中的流規則將全部丟失,網路無法連接。 動作欄位包括正常轉發normal、定向到某交換機埠output:port、丟棄drop、更改源目的mac地址mod_dl_src/mod_dl_dst等,一條流規則可有多個動作,動作執行按指定的先後順序依次完成。 基本操作 查看虛擬交換機xenbr0的信息 顯示的xenbr0信息中網路介面名稱前的數字為該網路介面掛接到Open vSwitch上的埠號,如1(vif0.0): 中的1為網路介面vif0.0對應的埠號,在添加包含in_port欄位的流規則時可通過該命令查看網路介面對應的埠號。 查看xenbr0上各交換機埠的狀態 輸出的結果中包含了各網路介面上收到的數據包數,位元組數,丟包數,錯誤數據包數等信息 查看xenbr0上的所有流規則 輸出結果中共有兩條流規則,第一條為默認的流規則,即對所有數據包進行正常轉發,為普通二層交換機完成的功能,優先順序為0,最低,永不超時。 第二條為手動添加的流規則,基本欄位中不包含idle_timeout欄位,表示永不超時,優先順序為32768,Open vSwitch將先根據該條流規則處理收到的數據包,如從數據包中提取出的特徵與條件欄位不符,則該用第一條流規則處理收到的所有數據包。 添加一條流規則:丟棄從2號埠發來的所有數據包 刪除一條流規則:刪除條件欄位中包含in_port=2的所有流規則 流規則中可包含通配符和簡寫形式,任何欄位都可等於*或ANY,如: 丟棄所有收到的數據包 ovs-ofctl add-flow xenbr0 dl_type=*,nw_src=ANY,actions=drop 簡寫形式為將欄位組簡寫為協議名,目前支持的簡寫有ip,arp,icmp,tcp,udp,與流規則條件欄位的對應關系如下: dl_type=0x0800 <=>ip dl_type=0x0806 <=>arp dl_type=0x0800,nw_proto=1 <=> icmp dl_type=0x0800,nw_proto=6 <=> tcp dl_type=0x0800,nw_proto=17 <=> udp (1.1.0 即以後版本支持) dl_type=0x86dd. <=> ipv6 dl_type=0x86dd,nw_proto=6. <=> tcp6 dl_type=0x86dd,nw_proto=17. <=> udp6 dl_type=0x86dd,nw_proto=58. <=> icmp6 應用場景設置 網站屏蔽 屏蔽由Open vSwitch管理的任何主機對主機119.75.213.50的訪問,但只屏蔽ip數據包(由dl_type=0x0800指定),即所有主機將無法訪問該主機上所有基於IP協議的服務,如萬維網服務、FTP訪問等 ovs-ofctl add-flow xenbr0 idle_timeout=0,dl_type=0x0800,nw_src=119.75.213.50,actions=drop 數據包重定向 將交換機中所有的icmp協議包(有dl_type=0x0800,nw_proto=1指定)全部轉發到4號埠,包括4號埠自己發出的icmp包,該流規則將導致由Open vSwitch管理的主機間以及與外部網路間都將訪問ping通,但可以使用萬維網、FTP等服務。 ovs-ofctl add-flow xenbr0 idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:4 去除VLAN tag 去除從3號埠發來的所有VLAN數據包中的tag,然後轉發 ovs-ofctl add-flow xenbr0 idle_timeout=0,in_port=3,actions=strip_vlan,normal 更改數據包源IP地址後轉發 將從3號埠收到的所有IP包的源IP欄位更改為211.68.52.32 ovs-ofctl add-flow xenbr0 idle_timeout=0,in_port=3,actions=mod_nw_src:211.68.52.32,normal 內核模塊中flow操作 查看內核模塊flow ovs-dpctl mp-flows xenbr0 後台模塊控制,如日誌系統、後台模塊退出 查看後台模塊支持的appctl命令 查看ovsdb-server支持的appctl命令,ovs-appctl必須在後台模塊運行後才能針對後台模塊使用,默認情況下,所有運行的後台模塊都會在/usr/local/var/run/openvswitch/目錄下創建一個與ovs-appctl通信的socket文件 更改Open vSwitch各後台的模塊的日誌級別 更改ovs-vswitchd模塊的日誌級別info,「ANY:ANY:info」中的前一個「ANY」代表ovs-vswitchd中的任何模塊組件,「ovs-appctl --target=/usr/local/var/run/openvswitch/ ovs-vswitchd.29384.ctl vlog/list」命令輸出的第一列將為ovs-vswitchd包含的所有模塊組件。「ANY:ANY:info」中的後一個「ANY」代表日誌的任何方式的輸出,日誌的輸出方式有三種,分別為:console,syslog,file,分別代表將日誌輸出到控制台、寫入到系統日誌系統和寫入到ovs-vswitchd啟動時由—log-file參數指定的文件。「ANY:ANY:info」中的「info」表示日誌級別,共有emer、err、warn、info、dbg五個日誌級別,dbg為最低級別,指定為dbg時,所有的日誌信息都將輸出,但此時可能導致日誌系統迅速膨脹,而佔用越來越多的硬碟存儲空間。 ovs-appctl --target=/usr/local/var/run/openvswitch/ovs-vswitchd.29384.ctl vlog/set ANY:ANY:info 退出後台模塊 讓ovs-vswitchd停止運行 ovs-appctl --target=/usr/local/var/run/openvswitch/ovs-vswitchd.29384.ctl exit
② 如何在ubuntu14.04中安裝openvswitch
最近在研究學習Open vSwitch,准備在本地Ubuntu14.04機器上安裝一下,並基於其創建一些KVM虛擬機,下面就簡要記錄下在Ubuntu14.04系統上安裝Open vSwitch的過程。
1、由於之前安裝過KVM,其在本機生成了一個名為virbr0的bridge,這里我們需要事先將其刪除,否則可能會與Open vSwitch產生不兼容的問題,命令如下:
virsh net-destroy default
Network default destroyed
virsh net-autostart --disable default
Network default unmarked as autostarted
2、這里我們同樣也不需要bridge模塊:
sudo aptitude purge ebtables
The following packages will be REMOVED:
ebtables{p}
0 packages upgraded, 0 newly installed, 1 to remove and 37 not upgraded.
Need to get 0 B of archives. After unpacking 379 kB will be freed.
Do you want to continue? [Y/n/?] y
(Reading database ... 230918 files and directories currently installed.)
Removing ebtables (2.0.10.4-3ubuntu1) ...
* Clearing ebtables rulesets[ OK ]
Purging configuration files for ebtables (2.0.10.4-3ubuntu1) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
3、下面開始安裝openvswitch相關包:
sudo apt-get install openvswitch-switch
4、查看下ovs的運行狀況:
ps -ea | grep ovs
10637 ? 00:00:00 ovsdb-server
10647 ? 00:00:00 ovs-vswitchd
5、查看下安裝的ovs的版本:
ovs-appctl --version
ovs-appctl (Open vSwitch) 2.0.2
Compiled May 13 2015
6、查看下當前ovs支持的OpenFlow協議的版本:
ovs-ofctl --version
ovs-ofctl (Open vSwitch) 2.0.2
Compiled May 13 2015 18:49:53
OpenFlow versions 0x1:0x4
7、通過ovs創建一個網橋 br0,供kvm虛擬機使用:
sudo ovs-vsctl add-br br0
ifconfig
br0 Link encap:Ethernet HWaddr 12:72:fd:75:e5:4b
inet6 addr: fe80::4c0a:7bff:fec6:98d7/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:578 (578.0 B)
通過ifconfig命令,我們發現多了一個br0網橋。
8、將物理網卡eth0添加到br0上:
sudo ovs-vsctl add-port br0 eth0
這步執行後,發現無法再訪問外網,不過沒關系,我們可以按照如下步驟解決:
1)先清除eth0的配置:
sudo ifconfig eth0 0
2)讓br0自動獲取ip地址:
sudo dhclient br0
3)此時就又可以通外網了:
ping www..com
PING www.a.shifen.com (119.75.217.109) 56(84) bytes of data.
64 bytes from 119.75.217.109: icmp_seq=1 ttl=54 time=30.9 ms
64 bytes from 119.75.217.109: icmp_seq=2 ttl=54 time=31.9 ms
9、最後查看下目前br0和eth0的情況:
sudo ovs-vsctl show
1e6548a9-956e-4b86-b743-f8da0aa2b922
Bridge "br0"
Port "br0"
Interface "br0"
type: internal
Port "eth0"
Interface "eth0"
ovs_version: "2.0.2"
Linux有問必答:如何啟用Open vSwitch的日誌功能以便調試和排障:http://www.linuxdiyf.com/linux/13701.html
CentOS7安裝Openvswitch 2.3.0 LTS:http://www.linuxdiyf.com/linux/10288.html
CentOS 6.5下安裝Open vSwitch:http://www.linuxdiyf.com/linux/6891.html
OpenvSwitch 2.1.2安裝完成後啟動與停止shell腳本:http://www.linuxdiyf.com/linux/2498.html
③ 如何使用ovs命令查看介面vnet10的vlan id
.先准備ovs的工作目錄,資料庫存儲路徑等
mkdir -p /etc/openvswitch
mkdir -p /var/run/openvswitch
1
2
2.先啟動ovsdb-server
ovsdb-server /etc/openvswitch/conf.db \
-vconsole:emer -vsyslog:err -vfile:info \
--remote=punix:/var/run/openvswitch/db.sock \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir \
--log-file=/var/log/openvswitch/ovsdb-server.log \
--pidfile=/var/run/openvswitch/ovsdb-server.pid \
--detach --monitor
1
2
3
4
5
6
7
8
9
ps: 如果想清除配置,可以先刪除/etc/openvswitch/*,然後再手動創建一個資料庫:
ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovssc
3.初始化ovsdb
針對於新創建的資料庫才需要初始化
4.啟動vswitchd進程
ovs常用命令
控制管理類
1.查看網橋和埠
2.創建一網橋
3.添加/刪除一個埠
4.設置/清除網橋的openflow協議版本
5.查看某網橋當前流表
6.設置/刪除控制器
7.查看控制器列表
8.設置/刪除被動連接控制器
9.設置/移除可選選項
10.設置fail模式,支持standalone或者secure
standalone(default):清除所有控制器下發的流表,ovs自己接管
secure:按照原來流表繼續
11.查看介面id等
12.查看介面
④ ovs支持ndp協議嗎
Open vSwitch使用
網橋管理
添加名為br0的網橋
ovs-vsctl add-br br0
刪除名為br0的網橋
ovs-vsctl del-br br0
列出所有網橋
ovs-vsctl list-br
判斷網橋br0是否存在
ovs-vsctl br-exists br0
列出掛接到網橋br0上的所有網路介面
ovs-vsctl list-ports br0
將網路介面eth0掛接到網橋br0上
ovs-vsctl add-port br0 eth0
刪除網橋br0上掛接的eth0網路介面
ovs-vsctl del-port br0 eth0
列出已掛接eth0網路介面的網橋
ovs-vsctl port-to-br eth0
網橋管理(ovsdb資料庫操作)
ovsdb是一個非常輕量級的資料庫,與其說它是一個資料庫,不如說它是一個提供增刪查改等功能的臨時配置緩存,之所以這么說,是因為ovsdb資料庫的根本就未使用多少資料庫技術,如SQL語言查詢、存儲過程等等。ovsdb 資料庫通過模式文件「openvswitch-1.1.0pre2/vswitchd/vswitch.ovsschema」,如要定製ovsdb資料庫,可通過更改 vswitch.ovsschema 文件實現,不過以下姑且仍以資料庫稱之。
資料庫操作的一般格式為:
ovs-vsctl list/set/get/add/remove/clear/destroy table record column [value]
默認情況下ovsdb中有以下數據表:
bridge, controller,interface,mirror,netflow,open_vswitch,port,qos,queue,ssl,sflow
即table可為上面的任一個。record為數據表中name欄位的值,column為數據表任一個欄位的欄位名,value欄位值。
基本操作:
查看bridge數據表中的所有記錄
獲得bridge數據表_uuid欄位的值
設置bridge數據表datapath_type欄位的值
清除bridge數據表flood_vlans欄位的值
ovs-vsctl remove bridge xenbr0 flood_vlans 23
或者
ovs-vsctl clear bridge xenbr0 flood_vlans
刪除uuid為69ee0c09-9e52-4236-8af6-037a98ca704d的qos記錄
ovs-vsctl destroy qos 69ee0c09-9e52-4236-8af6-037a98ca704d
應用場景設置:
QoS設置
針對網路介面的設置:設置網路介面vif0.0的帶寬為1000±100kbps
ovs-vsctl set interface vif0.0 ingress_policing_rate=1000
ovs-vsctl set interface vif0.0 ingress_policing_burst=100
(ingress_policing_rate:最大發送速率(單位均為kbps)
ingress_policing_burst:超過ingress_policing_rate的最大浮動值)
針對交換機埠的設置:創建在vif0.0埠上的linux-htb QoS,linux-htb QoS可以針對具有指定特徵的數據包流設置最大最小帶寬,且在最大帶寬范圍內,某一特徵的數據包流可以借用其他特徵數據包流未用完的帶寬。
ovs-vsctl -- set port vif0.0 qos=@newqos
-- --id=@newqos create qos type=linux-htb other-config:
max-rate=100000000 queues=0=@q0,1=@q1
-- --id=@q0 create queue other-config:min-rate=100000000 other-config:max-rate=100000000
-- --id=@q1 create queue other-config:min-rate=500000000
將帶寬限制加於某特徵數據包流上
(假設vif0.0的接在交換機1號埠上,ovs-ofctl命令的使用見2.2.3)
ovs-ofctl add-flow xenbr0 "in_port=2,idle_timeout=0,actions=enqueue:1:0"
埠映射
將發往eth0埠和從eth1埠發出的數據包全部定向到eth2埠
(假設eth0、eth1、eth2埠的uuid分別為:
69ee0c09-9e52-4236-8af6-037a98ca704d
69ee0c09-9e52-4236-8af6-037a98ca704e
69ee0c09-9e52-4236-8af6-037a98ca704f
埠的uuid可以通過ovs-vsctl list port命令查看)
ovs-vsctl -- set bridge xenbr0 mirrors=@m
-- --id=@m create mirror name=mymirror
select-dst-port=69ee0c09-9e52-4236-8af6-037a98ca704d
select-src-port=69ee0c09-9e52-4236-8af6-037a98ca704e
output-port=69ee0c09-9e52-4236-8af6-037a98ca704f
流規則管理
流規則組成
每條流規則由一系列欄位組成,分為基本欄位、條件欄位和動作欄位三部分:
基本欄位包括生效時間ration_sec、所屬表項table_id、優先順序priority、處理的數據包數n_packets,空閑超時時間idle_timeout等,空閑超時時間idle_timeout以秒為單位,超過設置的空閑超時時間後該流規則將被自動刪除,空閑超時時間設置為0表示該流規則永不過期,idle_timeout將不包含於ovs-ofctl mp-flows brname的輸出中。
條件欄位包括輸入埠號in_port、源目的mac地址dl_src/dl_dst、源目的ip地址nw_src/nw_dst、數據包類型dl_type、網路層協議類型nw_proto等,可以為這些欄位的任意組合,但在網路分層結構中底層的欄位未給出確定值時上層的欄位不允許給確定值,即一條流規則中允許底層協議欄位指定為確定值,高層協議欄位指定為通配符(不指定即為匹配任何值),而不允許高層協議欄位指定為確定值,而底層協議欄位卻為通配符(不指定即為匹配任何值),否則,ovs-vswitchd 中的流規則將全部丟失,網路無法連接。
動作欄位包括正常轉發normal、定向到某交換機埠output:port、丟棄drop、更改源目的mac地址mod_dl_src/mod_dl_dst等,一條流規則可有多個動作,動作執行按指定的先後順序依次完成。
基本操作
查看虛擬交換機xenbr0的信息
顯示的xenbr0信息中網路介面名稱前的數字為該網路介面掛接到Open vSwitch上的埠號,如1(vif0.0): 中的1為網路介面vif0.0對應的埠號,在添加包含in_port欄位的流規則時可通過該命令查看網路介面對應的埠號。
查看xenbr0上各交換機埠的狀態
輸出的結果中包含了各網路介面上收到的數據包數,位元組數,丟包數,錯誤數據包數等信息
查看xenbr0上的所有流規則
輸出結果中共有兩條流規則,第一條為默認的流規則,即對所有數據包進行正常轉發,為普通二層交換機完成的功能,優先順序為0,最低,永不超時。
第二條為手動添加的流規則,基本欄位中不包含idle_timeout欄位,表示永不超時,優先順序為32768,Open vSwitch將先根據該條流規則處理收到的數據包,如從數據包中提取出的特徵與條件欄位不符,則該用第一條流規則處理收到的所有數據包。
添加一條流規則:丟棄從2號埠發來的所有數據包
刪除一條流規則:刪除條件欄位中包含in_port=2的所有流規則
流規則中可包含通配符和簡寫形式,任何欄位都可等於*或ANY,如:
丟棄所有收到的數據包
ovs-ofctl add-flow xenbr0 dl_type=*,nw_src=ANY,actions=drop
簡寫形式為將欄位組簡寫為協議名,目前支持的簡寫有ip,arp,icmp,tcp,udp,與流規則條件欄位的對應關系如下:
dl_type=0x0800 <=>ip
dl_type=0x0806 <=>arp
dl_type=0x0800,nw_proto=1 <=> icmp
dl_type=0x0800,nw_proto=6 <=> tcp
dl_type=0x0800,nw_proto=17 <=> udp
(1.1.0 即以後版本支持)
dl_type=0x86dd. <=> ipv6
dl_type=0x86dd,nw_proto=6. <=> tcp6
dl_type=0x86dd,nw_proto=17. <=> udp6
dl_type=0x86dd,nw_proto=58. <=> icmp6
應用場景設置
網站屏蔽
屏蔽由Open vSwitch管理的任何主機對主機119.75.213.50的訪問,但只屏蔽ip數據包(由dl_type=0x0800指定),即所有主機將無法訪問該主機上所有基於IP協議的服務,如萬維網服務、FTP訪問等
ovs-ofctl add-flow xenbr0 idle_timeout=0,dl_type=0x0800,nw_src=119.75.213.50,actions=drop
數據包重定向
將交換機中所有的icmp協議包(有dl_type=0x0800,nw_proto=1指定)全部轉發到4號埠,包括4號埠自己發出的icmp包,該流規則將導致由Open vSwitch管理的主機間以及與外部網路間都將訪問ping通,但可以使用萬維網、FTP等服務。
ovs-ofctl add-flow xenbr0 idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:4
去除VLAN tag
去除從3號埠發來的所有VLAN數據包中的tag,然後轉發
ovs-ofctl add-flow xenbr0 idle_timeout=0,in_port=3,actions=strip_vlan,normal
更改數據包源IP地址後轉發
將從3號埠收到的所有IP包的源IP欄位更改為211.68.52.32
ovs-ofctl add-flow xenbr0 idle_timeout=0,in_port=3,actions=mod_nw_src:211.68.52.32,normal
內核模塊中flow操作
查看內核模塊flow
ovs-dpctl mp-flows xenbr0
後台模塊控制,如日誌系統、後台模塊退出
查看後台模塊支持的appctl命令
查看ovsdb-server支持的appctl命令,ovs-appctl必須在後台模塊運行後才能針對後台模塊使用,默認情況下,所有運行的後台模塊都會在/usr/local/var/run/openvswitch/目錄下創建一個與ovs-appctl通信的socket文件
更改Open vSwitch各後台的模塊的日誌級別
更改ovs-vswitchd模塊的日誌級別info,「ANY:ANY:info」中的前一個「ANY」代表ovs-vswitchd中的任何模塊組件,「ovs-appctl --target=/usr/local/var/run/openvswitch/
ovs-vswitchd.29384.ctl vlog/list」命令輸出的第一列將為ovs-vswitchd包含的所有模塊組件。「ANY:ANY:info」中的後一個「ANY」代表日誌的任何方式的輸出,日誌的輸出方式有三種,分別為:console,syslog,file,分別代表將日誌輸出到控制台、寫入到系統日誌系統和寫入到ovs-vswitchd啟動時由—log-file參數指定的文件。「ANY:ANY:info」中的「info」表示日誌級別,共有emer、err、warn、info、dbg五個日誌級別,dbg為最低級別,指定為dbg時,所有的日誌信息都將輸出,但此時可能導致日誌系統迅速膨脹,而佔用越來越多的硬碟存儲空間。
ovs-appctl --target=/usr/local/var/run/openvswitch/ovs-vswitchd.29384.ctl vlog/set
ANY:ANY:info
退出後台模塊
讓ovs-vswitchd停止運行
ovs-appctl --target=/usr/local/var/run/openvswitch/ovs-vswitchd.29384.ctl exit
⑤ openvswitch怎麼關閉stp
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-tcpunmp:tcpmp的補丁,解析OpenFlow的消息;
brocompat.ko : Linux bridge compatibility mole
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 mp-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
⑥ 如何藉助 OVN 來提高 OVS 在雲計算環境中的性能
,使用方法如抄下:襲 首先我們讓ovsdb-server監聽一個TCP埠: ovs-appctl -t ovsdb-server ovsdb-server/add-remote ptcp:6640 接下來,啟動ovn-northd後台進程。
⑦ 如何使用Floodlight連接並管理Open vSwitch
Open vSwitch(下面簡稱為 OVS)是由 Nicira Networks 主導的,運行在虛擬化平台(例如 KVM,Xen)上的虛擬交換機。在虛擬化平台上,OVS 可以為動態變化的端點提供 2 層交換功能,很好的控制虛擬網路中的訪問策略、網路隔離、流量監控等等。
OVS 遵循 Apache 2.0 許可證, 能同時支持多種標準的管理介面和協議。OVS 也提供了對 OpenFlow 協議的支持,用戶可以使用任何支持 OpenFlow 協議的控制器對 OVS 進行遠程管理控制。
Open vSwitch 概述
在 OVS 中, 有幾個非常重要的概念:
Bridge: Bridge 代表一個乙太網交換機(Switch),一個主機中可以創建一個或者多個 Bridge 設備。
Port: 埠與物理交換機的埠概念類似,每個 Port 都隸屬於一個 Bridge。
Interface: 連接到 Port 的網路介面設備。在通常情況下,Port 和 Interface 是一對一的關系, 只有在配置 Port 為 bond 模式後,Port 和 Interface 是一對多的關系。
Controller: OpenFlow 控制器。OVS 可以同時接受一個或者多個 OpenFlow 控制器的管理。
datapath: 在 OVS 中,datapath 負責執行數據交換,也就是把從接收埠收到的數據包在流表中進行匹配,並執行匹配到的動作。
Flow table: 每個 datapath 都和一個「flow table」關聯,當 datapath 接收到數據之後, OVS 會在 flow table 中查找可以匹配的 flow,執行對應的操作, 例如轉發數據到另外的埠。
Open vSwitch 實驗環境配置
OVS 可以安裝在主流的 Linux 操作系統中,用戶可以選擇直接安裝編譯好的軟體包,或者下載源碼進行編譯安裝。
在我們的實驗環境中,使用的操作系統是 64 位 Ubuntu Server 12.04.3 LTS,並通過源碼編譯的方式安裝了 Open vSwitch 1.11.0
$ lsb_release -a
No LSB moles 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 的運行情況:
$ 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 協議的版本
$ ovs-ofctl --version
ovs-ofctl (Open vSwitch) 1.11.0
Compiled Oct 28 2013 14:17:17
OpenFlow versions 0x1:0x4
基於 Open vSwitch 的 OpenFlow 實踐
OpenFlow 是用於管理交換機流表的協議,ovs-ofctl 則是 OVS 提供的命令行工具。在沒有配置 OpenFlow 控制器的模式下,用戶可以使用 ovs-ofctl 命令通過 OpenFlow 協議去連接 OVS,創建、修改或刪除 OVS 中的流表項,並對 OVS 的運行狀況進行動態監控。
Flow 語法說明
在 OpenFlow 的白皮書中,Flow 被定義為某個特定的網路流量。例如,一個 TCP 連接就是一個 Flow,或者從某個 IP 地址發出來的數據包,都可以被認為是一個 Flow。支持 OpenFlow 協議的交換機應該包括一個或者多個流表,流表中的條目包含:數據包頭的信息、匹配成功後要執行的指令和統計信息。
當數據包進入 OVS 後,會將數據包和流表中的流表項進行匹配,如果發現了匹配的流表項,則執行該流表項中的指令集。相反,如果數據包在流表中沒有發現任何匹配,OVS 會通過控制通道把數據包發到 OpenFlow 控制器中。
在 OVS 中,流表項作為 ovs-ofctl 的參數,採用如下的格式:欄位=值。如果有多個欄位,可以用逗號或者空格分開。一些常用的欄位列舉如下:
表 1. 流表常用欄位
欄位名稱
說明
in_port=port 傳遞數據包的埠的 OpenFlow 埠編號
dl_vlan=vlan 數據包的 VLAN Tag 值,范圍是 0-4095,0xffff 代表不包含 VLAN Tag 的數據包
dl_src=<MAC>
dl_dst=<MAC> 匹配源或者目標的 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 匹配乙太網協議類型,其中:
dl_type=0x0800 代表 IPv4 協議
dl_type=0x086dd 代表 IPv6 協議
dl_type=0x0806 代表 ARP 協議
完整的的類型列表可以參見乙太網協議類型列表
nw_src=ip[/netmask]
nw_dst=ip[/netmask] 當 dl_typ=0x0800 時,匹配源或者目標的 IPv4 地址,可以使 IP 地址或者域名
nw_proto=proto 和 dl_type 欄位協同使用。
當 dl_type=0x0800 時,匹配 IP 協議編號
當 dl_type=0x086dd 代表 IPv6 協議編號
完整的 IP 協議編號可以參見IP 協議編號列表
table=number 指定要使用的流表的編號,范圍是 0-254。在不指定的情況下,默認值為 0。通過使用流表編號,可以創建或者修改多個 Table 中的 Flow
reg<idx>=value[/mask] 交換機中的寄存器的值。當一個數據包進入交換機時,所有的寄存器都被清零,用戶可以通過 Action 的指令修改寄存器中的值
對於 add−flow,add−flows 和 mod−flows 這三個命令,還需要指定要執行的動作:actions=[target][,target...]
一個流規則中可能有多個動作,按照指定的先後順序執行。
常見的操作有:
output:port: 輸出數據包到指定的埠。port 是指埠的 OpenFlow 埠編號
mod_vlan_vid: 修改數據包中的 VLAN tag
strip_vlan: 移除數據包中的 VLAN tag
mod_dl_src/ mod_dl_dest: 修改源或者目標的 MAC 地址信息
mod_nw_src/mod_nw_dst: 修改源或者目標的 IPv4 地址信息
resubmit:port: 替換流表的 in_port 欄位,並重新進行匹配
load:value−>dst[start..end]: 寫數據到指定的欄位
實踐操作 OpenFlow 命令
在本例中, 我們會創建一個不連接到任何控制器的 OVS 交換機,並演示如何使用 ovs-octl 命令操作 OpenFlow 流表。
創建一個新的 OVS 交換機
$ ovs-vsctl add-br ovs-switch
創建一個埠 p0,設置埠 p0 的 OpenFlow 埠編號為 100(如果在創建埠的時候沒有指定 OpenFlow 埠編號,OVS 會自動生成一個)。
$ ovs-vsctl add-port ovs-switch p0 -- set Interface p0 ofport_request=100
設置網路介面設備的類型為「internal」。對於 internal 類型的的網路介面,OVS 會同時在 Linux 系統中創建一個可以用來收發數據的模擬網路設備。我們可以為這個網路設備配置 IP 地址、進行數據監聽等等。
$ 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-mp: no
為了避免網路介面上的地址和本機已有網路地址沖突,我們可以創建一個虛擬網路空間 ns0,把 p0 介面移入網路空間 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
使用同樣的方法創建埠 p1、p2
表 2. 創建的埠信息
埠
說明
p0 IP 地址: 192.168.1.100/24
網路名稱空間: ns0
網路介面 MAC 地址: 66:4e:cc:ae:4d:20
OpenFlow Port Number: 100
p1 IP 地址: 192.168.1.101/24
網路名稱空間: ns1
網路介面 MAC 地址: 46:54:8a:95:dd:f8
OpenFlow Port Number: 101
p2 IP 地址: 192.168.1.102/24,
網路名稱空間: ns2
網路介面 MAC 地址: 86:3b:c8:d0:44:10
OpenFlow Port Number: 102
創建所有的埠之後, 查看 OVS 交換機的信息
$ 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 創建並測試 OpenFlow 命令
查看 Open vSwitch 中的埠信息。從輸出結果中,可以獲得交換機對應的 datapath ID (dpid),以及每個埠的 OpenFlow 埠編號,埠名稱,當前狀態等等。
$ 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
如果想獲得網路介面的 OpenFlow 編號,也可以在 OVS 的資料庫中查詢
$ 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)
屏蔽數據包
屏蔽所有進入 OVS 的乙太網廣播數據包
$ 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 協議的廣播數據包
$ ovs-ofctl add-flow ovs-switch "table=0, dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0, actions=drop"
修改數據包
添加新的 OpenFlow 條目,修改從埠 p0 收到的數據包的源地址為 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)發送測試數據到埠 p1(192.168.1.101)
$ ip netns exec ns0 ping 192.168.1.101
在接收埠 p1 監控數據,發現接收到的數據包的來源已經被修改為 9.181.137.1
$ ip netns exec ns1 tcpmp -i p1 icmp
tcpmp: 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
⑧ sdn南向介面協議除了openflow,為什麼需要netconf和ovsdb
openflow是控制抄面協議,控制數據轉發。
netconf和ovsdb是管理面協議,對設備進行參數配置,以及獲取設備狀態信息。
其中netconf主要是針對真實的設備,而ovsdb主要是針對ovs,虛擬交換機,也可以是在真實設備上虛擬出的VM。
openflow和netconf等的區別,類似於路由協議和SNMP的區別。