http://www.openvswitch.org/support/dist-docs/ovs-vsctl.8.txt
轉載自:https://blog.csdn.net/rocson001/article/details/73163041
推薦使用mininet模擬環境進行命令操作,例如:不同於本地虛擬機只有少數網卡,模擬環境中為我們配置了多個網卡進行實驗,避免不必要的麻煩!
一:控制管理類
(一)創建一個網橋
ovs-vsctl add-br br0 補充:刪除網橋使用del-br
注意:ovs的datapath_type有nedev和system,在創建dpdk接口的bridge時需指定
ovs-vsctl set bridge br0 datapath_type=netdev
使用非dpdk的bridge時不需要指定,走默認的system。
補充:網橋相關命令
1.列出所有網橋
ovs-vsctl list-br
2.判斷網橋br0是否存在(大多可以用1等同)
ovs-vsctl br-exists br0
退出碼:成功返回0,失敗返回2
3.將網絡接口ens33掛接到網橋br0上
ovs-vsctl add-port br0 ens33
注意:我們掛載的網絡端口必須是一個已經存在的接口---我們可以使用ifconfig在本機中查看到
否則可能報錯:
4.列出掛接到網橋br0上的所有網絡接口(不包括本地接口)
ovs-vsctl list-ports br0
其中:本地端口和網橋名一致
5.刪除網橋br0上掛接的eth0網絡接口
ovs-vsctl del-port br0 eth0
6.列出已掛接ens33網絡接口的網橋
ovs-vsctl port-to-br ens33
說明一個網絡接口:可以讓多個網橋使用
7.查看網橋和端口
ovs-vsctl show
(二)添加、刪除端口操作
1.system接口
ovs-vsctl add-port br0 ens33
ovs-vsctl del-port br0 ens33
2.DPDK接口和DPDK bonds以后學習DPDK再進行補充
(三)不同網橋通過patch port連接
ovs里的不同bridge之間可以通過patch port進行連接,類似於linux的veth接口。
通過patch port 連接bridge時,這兩個bridge的datapath_type最好相同,不然可能會導致數據不通的情況。
OVS通過在不同的bridge上面創建patch ports,將兩個bridge連接起來。比如,OpenStack里面的br-int和br-tun。
在bridge上創建patch port的命令主要是下面三條。
在兩個bridge里面創建一對ports,並互相指定peer,就實現了兩個網橋連接。命令如下:
ovs-vsctl add-port <bridge name> <port name> ovs-vsctl set interface <port name> type=patch ovs-vsctl set interface <port name> options:peer=<peer name>
1.查看交換機網卡信息
網橋一設置:
ovs-vsctl add-br br0
ovs-vsctl add-port br0 s1-eth1 ovs-vsctl set Interface s1-eth1 type=patch ovs-vsctl set Interface s1-eth1 options:peer=s1-eth2
網橋二設置:
ovs-vsctl add-br br1 ovs-vsctl add-port br1 s1-eth2 ovs-vsctl set Interface s1-eth2 type=patch ovs-vsctl set Interface s1-eth2 options:peer=s1-eth1
或者使用網橋本地接口:

njzy@njzy-virtual-machine:~$ sudo ovs-vsctl add-br br0 njzy@njzy-virtual-machine:~$ sudo ovs-vsctl add-br br1 njzy@njzy-virtual-machine:~$ sudo ovs-vsctl show 39972cd3-4174-475f-b551-01fcdec5fa3f Bridge "br0" Port "br0" Interface "br0" type: internal Bridge "br1" Port "br1" Interface "br1" type: internal njzy@njzy-virtual-machine:~$ sudo ovs-vsctl set Interface br0 type=patch njzy@njzy-virtual-machine:~$ sudo ovs-vsctl set Interface br0 options:peer=br1 njzy@njzy-virtual-machine:~$ sudo ovs-vsctl set Interface br1 type=patch njzy@njzy-virtual-machine:~$ sudo ovs-vsctl set Interface br1 options:peer=br0 njzy@njzy-virtual-machine:~$ sudo ovs-vsctl show
(四)設置/清除網橋的openflow協議版本
ovs-vsctl set bridge br0 protocols=OpenFlow13 ovs-vsctl clear bridge br0 protocols
(五)查看網橋當前流表
ovs-ofctl dump-flows br0
當我們不指定協議版本時,默認時1.0版本,我們上面設置的版本是1.3,會導致協議協商失敗
因此我們需要指定協議版本才行:
ovs-ofctl -O OpenFlow13 dump-flows br0
當然我們可以使用下面命令,查看更多信息,並且不需要指定協議版本:
ovs-appctl bridge/dump-flows br0
列出橋上所有的流,包括那些在其他命令中(例如 ovs-ofctl dump-flows)默認隱藏的流.一些機制比如帶內管理等設置的流策略是不行允許修改和覆蓋的,所以對控制器來說他們是隱藏的。
(六)控制器操作
補充:可以設置ryu監聽端口:
ryu-manager simple_switch_13.py --ofp-tcp-listen-port 6789 --verbose
1.啟動ryu控制器
2.ovs設置控制器
ovs-vsctl set-controller br0 tcp:192.168.58.133:6633 //指定ryu控制器ip和端口
3.ovs查看控制器列表
ovs-vsctl list controller
4.ovs刪除控制器
ovs-vsctl del-controller br0
5.ovs設置多個控制器
如果有packet in事件時候會將該事件分別發一份給這兩個控制器,至於兩個控制器間的關系協作暫無研究
ovs-vsctl set-controller br0 tcp:127.0.0.1:6636 tcp:127.0.0.1:6637
(七) ovs設置被動連接控制器<未實驗>
所謂的被動連接端口是指,控制器可以主動連接此端口,控制此ovs
ovs-vsctl set-manager tcp:127.0.0.1:6640 ovs-vsctl get-manager ovs-vsctl del-manager
https://www.dazhuanlan.com/2020/01/17/5e21a02b39e55/
(八)設置/移除可選選項
ovs-vsctl set Interface br0 options:link_speed=1G
ovs-vsctl remove Interface br0 options link_speed
(九)設置fail模式,支持standalone或者secure
standalone(default):清除所有控制器下發的流表,ovs自己接管
secure:按照原來流表繼續轉發
ovs-vsctl set-fail-mode br0 standalone
ovs-vsctl get-fail-mode br0 ovs-vsctl del-fail-mode br0 ovs-vsctl set-fail-mode br0 secure ovs-vsctl get-fail-mode br0
(十)查看接口信息
查看接口id等
ovs-appctl dpif/show
查看接口統計
ovs-ofctl -O OpenFlow13 dump-ports br0
二:流表類
(一)流表操作
1.添加普通流表
ovs-ofctl -O Openflow13 add-flow br0 in_port=1,actions=output:2
2.查看流表
ovs-appctl bridge/dump-flows br0 查看流表
3.刪除所有流表
ovs-ofctl del-flows br0
4.按照匹配項來刪除流表
ovs-ofctl del-flows br0 "in_port=1"
(二)匹配項
補充:vlan簡介
設備利用VLAN標簽中的VID來識別數據幀所屬的VLAN,廣播幀只在同一VLAN內轉發,這就將廣播域限制在一個VLAN內。
其中vlan tag就是VID,PCP標簽就是PRI
1.匹配vlan tag,范圍為0-4095(vlan id)
ovs-ofctl add-flow br0 priority=401,in_port=1,dl_vlan=777,actions=output:2
2.匹配vlan pcp,范圍為0-7(設置優先級,值越大優先級越高)
ovs-ofctl add-flow br0 priority=401,in_port=1,dl_vlan_pcp=7,actions=output:2
3.匹配vlan TCI
TCI低12位為vlan id,高3位為priority,例如tci=0xf123則vlan_id為0x123和vlan_pcp=7
ovs-ofctl add-flow br0 in_port=1,vlan_tci=0xf123,actions=output:2
4.匹配源/目的MAC(dl_src,dl_dst)
ovs-ofctl add-flow br0 in_port=1,dl_src=00:00:00:00:00:01/00:00:00:00:00:01,actions=output:2 ovs-ofctl add-flow br0 in_port=1,dl_dst=00:00:00:00:00:01/00:00:00:00:00:01,actions=output:2
5.匹配以太網類型,范圍為0-65535(dl_type包括常用網絡層協議類型)
ovs-ofctl add-flow br0 in_port=1,dl_type=0x0806,actions=output:2
6.匹配源/目的IP(nw_src,nw_dst,使得dl_type=0x0800或者ip、tcp協議,才會存在IP信息)
ovs-ofctl add-flow br0 ip,in_port=1,nw_src=10.10.0.0/16,actions=output:2 ovs-ofctl add-flow br0 ip,in_port=1,nw_dst=10.20.0.0/16,actions=output:2
7. 匹配協議號,范圍為0-255(nw_proto)
當指定ip或dl_type=0x0800時,匹配ip協議類型proto, proto指定為0到255之間的十進制數(例如1匹配ICMP包或6匹配TCP包)。
當指定ipv6或dl_type=0x86dd時,匹配ipv6報頭類型proto,它被指定為0到255之間的十進制數(例如58匹配ICMPv6包或6匹配TCP)。
當指定arp或dl_type=0x0806時,匹配arp操作碼的較低8位。
當指定rarp或dl_type=0x8035時,匹配ARP操作碼的較低8位。
ovs-ofctl add-flow br0 ip,in_port=1,nw_proto=1,actions=output:2 1--->匹配ICMP
8.匹配IP ToS/DSCP,tos范圍為0-255,DSCP范圍為0-63(設置優先級)
條件:指定dl_type=0x0800/0x86dd,並且ToS低2位會被忽略(DSCP值為ToS的高6位,並且低2位為預留位)
ovs-ofctl add-flow br0 ip,in_port=1,nw_tos=68,actions=output:2 ovs-ofctl add-flow br0 ip,in_port=1,ip_dscp=62,actions=output:2
(1)TOS包括共8位,包括3 bit的優先權字段(取值可以從000-111所有值),4 bit的TOS子字段和1 bit未用位但必須置0。

在IPv4的報文頭中,TOS字段是1字節,如下圖所示。根據RFC1122的定義,IP優先級(IPPrecedence)使用最高3比特(第0~2比特)。 +++++++++++++++++++++++++++++++++ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +++++++++++++++++++++++++++++++++ 3比特可以定義8個等級。 8個優先級的定義如下: 111 -Network Control 網絡控制 110 -Internetwork Control 網間控制 101 -Critic 關鍵 100 - FlashOverride 疾速 011 -Flash 閃速 010 -Immediate 快速 001 -Priority 優先 000 -Routine 普通 優先級6和7一般保留給網絡控制數據使用,比如路由。 優先級5推薦給語音數據使用。 優先級4由視頻會議和視頻流使用。 優先級3給語音控制數據使用。 優先級1和2給數據業務使用。 優先級0為缺省標記值。 在標記數據時,既可以使用數值,也可以使用名稱(英文名稱)
4 bit的TOS分別代表:最小時延、最大吞吐量、最高可靠性和最小費用。4 bit中只能置其中1 bit。如果所有4 bit均為0,那么就意味着是一般服務。
Telnet、Rlogin這兩個交互應用要求最小的傳輸時延,FTP文件傳輸要求最大吞吐量,最高可靠性是指網絡管理(SNMP)和路由選擇協議。用戶網絡新聞要求最小費用
(2)新的DSCP定義
DSCP由RFC2474定義,它重新命名了IPv4報頭中TOS使用的那1字節和IPv6報頭中數據類(TrafficClass)那1字節,新的名字稱為DS字段(Differentiated ServicesField)。該字段的作用沒有變,仍然被QoS工具用來標記數據。不同的是IPv4使用3比特,而DSCP使用6比特,最低2比特不用。
RFC2474 定義最高3比特為級別/類別選擇代碼(ClassSelector Codepoints,CS),其意義和IPv4報頭中IP優先級的定義是相同的,CS0 ~CS7的級別相等於IP優先級0 ~7。但它並沒有定義第3到第5比特的具體含義以及使用規則。DSCP使用6比特,可以定義64個優先級(0-63)。

保證轉發(Assured Forwarding,AF)由RFC2597對CS1~CS4進行進一步定義。它使用第3和第4比特做丟棄優先級標志。01-低丟棄優先級;10-中丟棄優先級;11-高丟棄優先級。這樣,在同一類數據中,又根據被丟棄的可能性划分出3檔。下表列出了AF服務等級及其對應的DSCP值: CS1 CS2 CS3 CS4 Lowdrop AF11 AF21 AF31 AF41 001010 010010 011010 100010 Mediumdrop AF12 AF22 AF32 AF42 001100 010100 011100 100100 Highdrop AF13 AF23 AF33 AF43 001110 010110 011110 100110 AF的定義為數據分類提供了方便,比如,運營商可以向用戶提供4中服務協約(SLA):白金,金,銀,銅,並為每一種服務的數據分配一定的帶寬。當然,不同服務的收費標准也是不同的。

無阻礙轉發(Expedited Forwarding,EF)由RFC2598定義,DSCP值為46(101110)。EF服務適用於低丟包率,低延遲,低抖動及保證帶寬的業務,如VOIP。 其他 DSCP = 000000 盡力轉發服務等級 (EF); CS = 6 網間控制(Internetwork Control),DSCP= 48 (110000) CS = 7 網內控制 (Intranetwork Control),DSCP= 56 (111000) 在配置命令中,既可以使用十進制數值,也可以使用二進制數值,還可以使用名稱。例如,28, 011100, AF32三個寫法意義相同。
9.匹配IP ecn 位,范圍為0-3
ovs-ofctl add-flow br0 ip,in_port=1,ip_ecn=2,actions=output:2
為了避免因為路由器擁塞而帶來的丟包而產生的一系列問題,TCP/IP的設計者們創建了一些用於主機和路由器的標准。這些標准描述了在IP路由器上進行的主動隊列管理算法(AQM)(RFC 2309),使得路由器能夠監控轉發隊列的狀態,以提供一個路由器向發送端報告發生擁塞的機制,讓發送端在路由器開始丟包前降低發送速率。這種路由器報告和主機響應機制被稱為顯式擁塞通告(ECN)(RFC 3168)。
https://blog.csdn.net/xxx_500/article/details/8584323

IP首部的修改 0 1 2 3 4 5 6 7 +-----+-----+-----+-----+-----+-----+-----+-----+ | DS FIELD,DSCP | ECN FIELD | +-----+-----+-----+-----+-----+-----+-----+-----+ DSCP: differentiated servicescodepoint ECN: Explicit Congestion Notification The Differentiated Services and ECN Fields inIP. +-----+-----+ | ECN FIELD | +-----+-----+ ECT CE [Obsolete] RFC 2481 names for the ECNbits. 0 0 Not-ECT 0 1 ECT(1) 1 0 ECT(0) 1 1 CE The ECN Field in IP. IP首部的TOS字段中的第7和8bit的res字段被重新定義為ECN字段,其中有四個取值,在RFC3168中描述,00代表該報文並不支持ECN,所以路由器的將該報文按照原始非ECN報文處理即可,即,過載丟包。01和10這兩個值針對路由器來說是一樣的,都表明該報文支持ECN功能,如果發生擁塞,則ECN字段的這兩個將修改為11來表示報文經過了擁塞,並繼續被路由器轉發。針對01和10的具體區別請參考RFC3168。 所以路由器轉發側要支持ECN,需要有以下新增功能: 1、當擁塞發生時,針對ECN=00的報文,走原有普通非ECN流程,即,進行RED丟包。 2、當擁塞發生時,針對ECN=01或ECN=10的報文,都需要修改為ECN=11,並繼續轉發流程。 3、 當擁塞發生時,針對ECN=11的報文,需要繼續轉發。 4、為了保證與不支持ECN報文的公平性,在隊列超過一定長度時,需要考慮對支持ECN報文的丟棄。

TCP首部的修改 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | C | E |U | A | P | R | S | F | | Header Length | Reserved | W | C | R | C | S |S | Y | I | | | | R | E |G | K | H | T | N | N | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ CWR: Congestion Window Reduce ECE: ECN-Echo The new definition of bytes 13 and 14 of the TCPHeader. 針對主機側的修改,首部將bit8和bit9的res字段修改為CWR和ECE。在RFC3168中的設計如下: 1、 在TCP接收端收到IP頭中的ECN=11標記,並在回復ACK時將ECEbit置1。並在后續的ACK總均將ECE bit置1。 2、 在TCP發送端收到ECEbit置1的ACK報文時,需要將自己的發送速率減半,並在發送下一個報文時,將CWR bit置1。 3、 在接收端收到CWR bit置1的報文時,后續的ECEbit將不再置1。直到再次收到IP首部ECN=11時,重復上述過程。 4、TCP發送端在收到一個ECE=1時,縮小發送窗口,並且在本次RTT時間內將不再再次縮小發送窗口。 5、TCP接收端向發送端回應ACK時,如果該ACK是一個不帶數據的“純”ACK,那么必須IP首部ECN=00,因為TCP沒有機制對純ACK進行響應,就無法針對純ACK發送擁塞通知。 6、 對於支持IP ECN的主機,TCP層在發送報文時需要將IP首部中的ECN置為01或10。
其他詳細見:https://blog.csdn.net/xxx_500/article/details/8584323
10.匹配IP TTL,范圍為0-255 (設置最大跳數)
ovs-ofctl add-flow br0 ip,in_port=1,nw_ttl=128,actions=output:2
11.匹配tcp/udp,源/目的端口,范圍為0-65535
當dl_type和nw_proto指定TCP或UDP時,tp_src和tp_dst匹配UDP或TCP源或目的端口端口
# 匹配源tcp端口179 ovs-ofctl add-flow br0 tcp,tcp_src=179/0xfff0,actions=output:2 # 匹配目的tcp端口179 ovs-ofctl add-flow br0 tcp,tcp_dst=179/0xfff0,actions=output:2 # 匹配源udp端口1234 ovs-ofctl add-flow br0 udp,udp_src=1234/0xfff0,actions=output:2 # 匹配目的udp端口1234 ovs-ofctl add-flow br0 udp,udp_dst=1234/0xfff0,actions=output:2
12.匹配tcp flags
tcp flags=fin,syn,rst,psh,ack,urg,ece,cwr,ns
ovs-ofctl add-flow br0 tcp,tcp_flags=ack,actions=output:2
TCP 在連接過程中,通過Flags標志位來表示傳輸過程中的連接狀態。因此可以通過標志位來進行問題定位或者控制指定的連接是否提交。TCP 三次握手過程如下:
對於舊版本的TCP頭定義,Flags有6bits,
新版TCP頭對flags擴展了3bits。每個TCP flag對應於1bit位。所以舊版TCP頭flags值有6個,新版擴展了3個值。從低位到高位分別是:FIN,SYN,RST,PSH,ACK,URG,ECE,CWR,NS。

FIN: "finished"簡寫。表示發送者以及發送完數據。通常用在發送者發送完數據的最后一個包中。 SYN: "Synchronisation"簡寫。表示三次握手建立連接的第一步,在建立連接時發送者發送的第一個包中設置flag值為SYN。 RST: "reset"簡寫。重置連接標志,用於重置由於主機崩潰或其他原因而出現錯誤的連接。或者發送包發送到一個不是期望的 目的主機時,接收端發送reset 重置連接標志的包。 PSH: "push"簡寫。通知接收端處理接收的報文,而不是將報文緩存到buffer中。 ACK: "Acknowledgment"簡寫。表示包已經被成功接收。 URG: "urgent"簡寫。通知接收端處理在處理其他包前優先處理接收到的緊急報文(urgent packets)。詳見RFC6093。 ECE: "ECN-Echo"簡寫。ECN表示Explicit Congestion Notification。表示TCP peer有ECN能力。詳見RFC3168。 CWR: "Congestion Window Reduced"簡寫。發送者在接收到一個帶有ECE flag包時,將會使用CWR flag。 詳見RFC3168。 NS: "nonce sum"簡寫。該標簽用來保護不受發送者發送的突發的惡意隱藏報文的侵害。詳見 RFC 3540。
13.匹配icmp code,范圍為0-255(必須先指定協議為ICMP)
ovs-ofctl add-flow br0 icmp,icmp_code=2,actions=output:2
https://www.cnblogs.com/iiiiher/p/8513748.html
14.匹配mpls label
條件:指定dl_type=0x8847/0x8848
ovs-ofctl add-flow br0 mpls,in_port=1,mpls_label=7,actions=output:2
多協議標簽交換(英語:Multi-Protocol Label Switching,縮寫為MPLS)是一種在開放的通信網上利用標簽引導數據高速、高效傳輸的新技術。多協議的含義是指MPLS不但可以支持多種網絡層層面上的協議,還可以兼容第二層的多種數據鏈路層技術。
其中 Exp:流量等級,也稱為TC,3bit。現在通常用做CoS(Class of Service),當設備阻塞時,優先發送優先級高的報文。
15.匹配mpls tc,范圍為0-7
條件:指定dl_type=0x8847/0x8848
ovs-ofctl add-flow br0 mpls,in_port=1,mpls_tc=7,actions=output:2
16.匹配tunnel id,源/目的IP
VLAN tunnel隧道映射根據tunnel id為數據包添加vlan信息。
# 匹配tunnel id ovs-ofctl add-flow br0 in_port=1,tun_id=0x7/0xf,actions=output:2 # 匹配tunnel源IP ovs-ofctl add-flow br0 in_port=1,tun_src=192.168.1.0/255.255.255.0,actions=output:2 # 匹配tunnel目的IP ovs-ofctl add-flow br0 in_port=1,tun_dst=192.168.1.0/255.255.255.0,actions=output:2
(三)指令動作
1. 動作為出接口---從指定接口轉發出去
ovs-ofctl add-flow br0 in_port=1,actions=output:2 //多個接口用,隔開
2.動作為指定group---group id為已創建的group table
https://www.cnblogs.com/CasonChan/p/4623931.html
ovs-ofctl add-flow br0 in_port=1,actions=group:666
3.動作為normal---轉為L2/L3處理流程
ovs-ofctl add-flow br0 in_port=1,actions=normal
4.動作為flood---從所有物理接口轉發出去,除了入接口和已關閉flooding的接口
ovs-ofctl add-flow br0 in_port=1,actions=flood
5.動作為all---從所有物理接口轉發出去,除了入接口
ovs-ofctl add-flow br0 in_port=1,actions=all
6.動作為local---一般是轉發給本地網橋
ovs-ofctl add-flow br0 in_port=1,actions=local
7.動作為in_port---從入接口轉發回去
ovs-ofctl add-flow br0 in_port=1,actions=in_port
8.動作為controller---以packet-in消息上送給控制器
ovs-ofctl add-flow br0 in_port=1,actions=controller
9.動作為drop---丟棄數據包操作
ovs-ofctl add-flow br0 in_port=1,actions=drop
10.動作為mod_vlan_vid---修改報文的vlan id,該選項會使vlan_pcp置為0
ovs-ofctl add-flow br0 in_port=1,actions=mod_vlan_vid:8,output:2
11.動作為mod_vlan_pcp---修改報文的vlan優先級,該選項會使vlan_id置為0
ovs-ofctl add-flow br0 in_port=1,actions=mod_vlan_pcp:7,output:2
12.動作為strip_vlan---剝掉報文內外層vlan tag
ovs-ofctl add-flow br0 in_port=1,actions=strip_vlan,output:2
13.動作為push_vlan---在報文外層壓入一層vlan tag,需要使用openflow1.1以上版本兼容
ovs-ofctl add-flow -O OpenFlow13 br0 in_port=1,actions=push_vlan:0x8100,set_field:4097->vlan_vid,output:2
14.動作為push_mpls---修改報文的ethertype,並且壓入一個MPLS LSE
ovs-ofctl add-flow br0 in_port=1,actions=push_mpls:0x8847,set_field:10->mpls_label,output:2
15.動作為pop_mpls---剝掉最外層mpls標簽,並且修改ethertype為非mpls類型
ovs-ofctl add-flow br0 mpls,in_port=1,mpls_label=20,actions=pop_mpls:0x0800,output:2
16.動作為修改源/目的MAC,修改源/目的IP
# 修改源MAC ovs-ofctl add-flow br0 in_port=1,actions=mod_dl_src:00:00:00:00:00:01,output:2 # 修改目的MAC ovs-ofctl add-flow br0 in_port=1,actions=mod_dl_dst:00:00:00:00:00:01,output:2 # 修改源IP ovs-ofctl add-flow br0 in_port=1,actions=mod_nw_src:192.168.1.1,output:2 # 修改目的IP ovs-ofctl add-flow br0 in_port=1,actions=mod_nw_dst:192.168.1.1,output:2
17.動作為修改TCP/UDP/SCTP源目的端口
# 修改TCP源端口 ovs-ofctl add-flow br0 tcp,in_port=1,actions=mod_tp_src:67,output:2 # 修改TCP目的端口 ovs-ofctl add-flow br0 tcp,in_port=1,actions=mod_tp_dst:68,output:2 # 修改UDP源端口 ovs-ofctl add-flow br0 udp,in_port=1,actions=mod_tp_src:67,output:2 # 修改UDP目的端口 ovs-ofctl add-flow br0 udp,in_port=1,actions=mod_tp_dst:68,output:2
18.動作為mod_nw_tos---修改ToS字段的高6位,范圍為0-255,值必須為4的倍數,並且不會去修改ToS低2位ecn值
條件:指定dl_type=0x0800
ovs-ofctl add-flow br0 ip,in_port=1,actions=mod_nw_tos:68,output:2
19.動作為mod_nw_ecn---修改ToS字段的低2位,范圍為0-3,並且不會去修改ToS高6位的DSCP值
條件:指定dl_type=0x0800,需要使用openflow1.1以上版本兼容
ovs-ofctl add-flow br0 ip,in_port=1,actions=mod_nw_ecn:2,output:2
20.動作為mod_nw_ttl---修改IP報文ttl值,需要使用openflow1.1以上版本兼容
ovs-ofctl add-flow -O OpenFlow13 br0 in_port=1,actions=mod_nw_ttl:6,output:2
21.動作為dec_ttl---對IP報文進行ttl自減操作
ovs-ofctl add-flow br0 in_port=1,actions=dec_ttl,output:2
22.動作為set_mpls_label---對報文最外層mpls標簽進行修改,范圍為20bit值
ovs-ofctl add-flow br0 in_port=1,actions=set_mpls_label:666,output:2
23.動作為set_mpls_tc---對報文最外層mpls tc進行修改,范圍為0-7
ovs-ofctl add-flow br0 in_port=1,actions=set_mpls_tc:7,output:2
24.動作為set_mpls_ttl---對報文最外層mpls ttl進行修改,范圍為0-255
ovs-ofctl add-flow br0 in_port=1,actions=set_mpls_ttl:255,output:2
25.動作為dec_mpls_ttl---對報文最外層mpls ttl進行自減操作
ovs-ofctl add-flow br0 in_port=1,actions=dec_mpls_ttl,output:2
26.動作為move NXM字段---使用move參數對NXM字段進行操作
# 將報文源MAC復制到目的MAC字段,並且將源MAC改為00:00:00:00:00:01 ovs-ofctl add-flow br0 in_port=1,actions=move:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[],mod_dl_src:00:00:00:00:00:01,output:2
27.動作為load NXM字段---使用load參數對NXM字段進行賦值操作
# push mpls label,並且把10(0xa)賦值給mpls label ovs-ofctl add-flow br0 in_port=1,actions=push_mpls:0x8847,load:0xa->NXM_OF_MPLS_LABEL[],output:2 # 對目的MAC進行賦值 ovs-ofctl add-flow br0 in_port=1,actions=load:0x001122334455->NXM_OF_ETH_DST[],output:2
28.動作為pop_vlan---彈出報文最外層vlan tag
ovs-ofctl add-flow br0 in_port=1,dl_type=0x8100,dl_vlan=777,actions=pop_vlan,output:2
(四)meter表
https://www.cnblogs.com/CasonChan/p/4623931.html
由於meter表是openflow1.3版本以后才支持,所以所有命令需要指定OpenFlow1.3版本以上
ps: 在openvswitch-v2.8之前的版本中,還不支持meter
在v2.8版本之后已經實現,要正常使用的話,需要注意的是datapath類型要指定為netdev,band type暫時只支持drop,還不支持DSCP REMARK
概念:meter Table

Meter Table同樣是由多個Meter Enties構成,每個Meter Entry定義每個 Flow 的 meters。基於此結構,OpenFlow Switch可以實現各種簡單的QoS功能,比如速率限制等,再結合每個port的queues,可以實現更加復雜的QoS框架,例如DiffServ。
一個meter可以衡量與它關聯的數據包的速率,並進而可以控制其聚合速率。任何一個Flow Entry都可以在其Instructions Set里指定某一個Meter,從而控制與該Flow Entry能夠成功匹配的數據包的聚合速率。
Meter Entry的具體結構如下:
同樣地,每個Meter Entry都是由其Meter Identifier來唯一定位。具體每項說明如下:
1)Meter Identifier:一個32位無符號整數,作為一個Meter Entry的唯一標識。
2)Meter Bands:一個無序的Meter Band集合,每個Meter Band指明了帶寬速率以及處理數據包的行為。
3)Counters:被該Meter Entry處理過的數據包的統計量。
概念:Meter Bands

每一個Meter Entry都可能有一個或者多個Meter Bands,每個Meter Band指明了帶寬速率以及對數據包的處理行為。數據包基於其當前的速率會被其中一個Meter Band來處理,其篩選策略是選擇那個定義的帶寬速率略低於當前數據包的測量速率的Meter Band, 假若當前數據包的測試速率均低於任何一個Meter Band定義的帶寬速率,那么不會篩選任何一個Meter Band。
Meter Band的具體結構如下:
這里,每個Meter Band以其定義的Rate來唯一標識。每項具體說明如下:
1)Band Type:定義了數據包的處理行為。---Band Type的類型有如下兩種,它們都是可選的:
1)drop:丟包,可以被用來實現一個rate limiter。 2)dscp remark:增加數據包IP頭DSCP域的丟棄優先級,可以被用來實現一個DiffServ仲裁器。
2)Rate:Meter Band的唯一標識,定義了Band可以應用的最低速率。
3)Counters:被該Meter Band處理過的數據包的統計量。
4)Type specific arguments:某些Meter Band有一些額外的參數。
1.查看當前設備對meter的支持
ovs-ofctl -O OpenFlow13 meter-features br0
2.查看meter表
ovs-ofctl -O OpenFlow13 dump-meters br0
3.查看meter統計
ovs-ofctl -O OpenFlow13 meter-stats br0
4.創建meter表
# 限速類型以kbps(kilobits per second)計算,超過20kb/s則丟棄 ovs-ofctl -O OpenFlow13 add-meter br0 meter=1,kbps,band=type=drop,rate=20 # 同上,增加burst size參數 ovs-ofctl -O OpenFlow13 add-meter br0 meter=2,kbps,burst,band=type=drop,rate=20,burst_size=256 # 同上,增加stats參數,對meter進行計數統計 ovs-ofctl -O OpenFlow13 add-meter br0 meter=3,kbps,burst,stats,band=type=drop,rate=20,burst_size=256 # 限速類型以pktps(packets per second)計算,超過1000pkt/s則丟棄 ovs-ofctl -O OpenFlow13 add-meter br0 meter=4,pktps,band=type=drop,rate=1000
5.刪除meter表
# 刪除全部meter表 ovs-ofctl -O OpenFlow13 del-meters br0 # 刪除meter id=1 ovs-ofctl -O OpenFlow13 del-meter br0 meter=1
6.創建流表
ovs-ofctl -O OpenFlow13 add-flow br0 in_port=1,actions=meter:1,output:2
(五)group表
由於group表是openflow1.1版本以后才支持,所以所有命令需要指定OpenFlow1.1版本以上
group table支持4種類型
all:所有buckets都執行一遍 select: 每次選擇其中一個bucket執行,常用於負載均衡應用 ff(FAST FAILOVER):快速故障修復,用於檢測解決接口等故障 indirect:間接執行,類似於一個函數方法,被另一個group來調用
1.查看當前設備對group的支持
ovs-ofctl -O OpenFlow13 dump-group-features br0
2.查看group表
ovs-ofctl -O OpenFlow13 dump-groups br0
3.創建group表
# 類型為all ovs-ofctl -O OpenFlow13 add-group br0 group_id=1,type=all,bucket=output:1,bucket=output:2,bucket=output:3 # 類型為select ovs-ofctl -O OpenFlow13 add-group br0 group_id=2,type=select,bucket=output:1,bucket=output:2,bucket=output:3 # 類型為select,指定hash方法(5元組,OpenFlow1.5+) ovs-ofctl -O OpenFlow15 add-group br0 group_id=3,type=select,selection_method=hash,fields=ip_src,bucket=output:2,bucket=output:3
4.刪除group表
ovs-ofctl -O OpenFlow13 del-groups br0 group_id=2
5.創建流表
ovs-ofctl -O OpenFlow13 add-flow br0 in_port=1,actions=group:2
(六)goto table配置
數據流先從table0開始匹配,如actions有goto_table,再進行后續table的匹配,實現多級流水線,如需使用goto table,則創建流表時,指定table id,范圍為0-255,不指定則默認為table0
1.在table0中添加一條流表條目,並匹配table1實現多級流水
ovs-ofctl add-flow br0 table=0,in_port=1,actions=goto_table=1
2.在table1中添加一條流表條目
ovs-ofctl add-flow br0 table=1,ip,nw_dst=10.10.0.0/16,actions=output:2
(七)tunnel配置
如需配置tunnel,必需確保當前系統對各tunnel的remote ip網絡可達
gre:
1.創建一個gre接口,並且指定端口id=1001
ovs-vsctl add-port br0 gre1 -- set Interface gre1 type=gre options:remote_ip=1.1.1.1 ofport_request=1001
2.可選選項---將tos或者ttl在隧道上繼承,並將tunnel id設置成123
ovs-vsctl set Interface gre1 options:tos=inherit options:ttl=inherit options:key=123
3.創建關於gre流表
# 封裝gre轉發 ovs-ofctl add-flow br0 ip,in_port=1,nw_dst=10.10.0.0/16,actions=output:1001 # 解封gre轉發 ovs-ofctl add-flow br0 in_port=1001,actions=output:1
vxlan
1.創建一個vxlan接口,並且指定端口id=2001
ovs-vsctl add-port br0 vxlan1 -- set Interface vxlan1 type=vxlan options:remote_ip=1.1.1.1 ofport_request=2001
2.可選選項---將tos或者ttl在隧道上繼承,將vni設置成123,UDP目的端為設置成8472(默認為4789)
ovs-vsctl set Interface vxlan1 options:tos=inherit options:ttl=inherit options:key=123 options:dst_port=8472
3.創建關於vxlan流表
# 封裝vxlan轉發 ovs-ofctl add-flow br0 ip,in_port=1,nw_dst=10.10.0.0/16,actions=output:2001 # 解封vxlan轉發 ovs-ofctl add-flow br0 in_port=2001,actions=output:1
三:sflow配置
1.對網橋br0進行sflow監控
agent: 與collector通信所在的網口名,通常為管理口
target: collector監聽的IP地址和端口,端口默認為6343
header: sFlow在采樣時截取報文頭的長度
polling: 采樣時間間隔,單位為秒
ovs-vsctl --id=@sflow create sflow agent=eth0 target="10.0.0.1:6343" header=128 sampling=64 polling=10 -- set bridge br0 sflow=@sflow
2.查看創建的sflow
ovs-vsctl list sflow
3.刪除對應的網橋sflow配置,參數為sFlow UUID
ovs-vsctl remove bridge br0 sflow 7b9b962e-fe09-407c-b224-5d37d9c1f2b3
4.刪除網橋下所有sflow配置
ovs-vsctl --clear bridge br0 sflow
四:QoS配置
1.配置ingress policing,對接口eth0入流限速10Mbps
ovs-vsctl set interface eth0 ingress_policing_rate=10000 ovs-vsctl set interface eth0 ingress_policing_burst=8000
2.清除相應接口的ingress policer配置
ovs-vsctl set interface eth0 ingress_policing_rate=0 ovs-vsctl set interface eth0 ingress_policing_burst=0
3.查看接口ingress policer配置
ovs-vsctl list interface eth0
4.查看網橋支持的Qos類型
ovs-appctl qos/show-types br0
五:端口鏡像配置
1.配置eth0收到/發送的數據包鏡像到eth1
ovs-vsctl -- set bridge br0 mirrors=@m \ -- --id=@eth0 get port eth0 \ -- --id=@eth1 get port eth1 \ -- --id=@m create mirror name=mymirror select-dst-port=@eth0 select-src-port=@eth0 output-port=@eth1
2.刪除端口鏡像配置
ovs-vsctl -- --id=@m get mirror mymirror -- remove bridge br0 mirrors @m
3.清除網橋下所有端口鏡像配置
ovs-vsctl clear bridge br0 mirrors
4.查看端口鏡像配置
ovs-vsctl get bridge br0 mirrors
六:聚合口配置
1.創建一個聚合口
ovs-vsctl add-port br0 dpdkbond0 \ -- set interface dpdkbond0 type=dpdk options:dpdk-devargs=0000:01:00.0,0000:02:00.0
2.設置聚合口模式
# mode=1 ovs-vsctl set port dpdkbond0 bond_mode=active-backup # mode=2 ovs-vsctl set port dpdkbond0 bond_mode=balance-slb # mode=4 ovs-vsctl set port dpdkbond0 bond_mode=balance-tcp ovs-vsctl set port dpdkbond0 lacp=active ovs-vsctl set port dpdkbond0 lacp=off ovs-vsctl set port dpdkbond0 lacp=passive
3.查看mode=4 lacp協商狀態
ovs-appctl lacp/show