OVS常用命令與使用總結

OVS常用命令與使用總結

說明

在平時使用ovs中,經常用到的ovs命令,參數,與舉例總結,持續更新中…

進程啓動

1.先準備ovs的工作目錄,數據庫存儲路徑等

mkdir -p /etc/openvswitch
mkdir -p /var/run/openvswitch

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

ps: 如果想清除配置,可以先刪除/etc/openvswitch/*,然後再手動創建一個數據庫:

ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema

3.初始化ovsdb
針對於新創建的數據庫才需要初始化

ovs-vsctl --no-wait init

4.啓動vswitchd進程

ovs-vswitchd unix:/var/run/openvswitch/db.sock \
-vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir \
--log-file=/var/log/openvswitch/ovs-vswitchd.log \
--pidfile=/var/run/openvswitch/ovs-vswitchd.pid \
--detach --monitor

ovs常用命令

控制管理類

1.查看網橋和端口

ovs-vsctl show

2.創建一個網橋

ovs-vsctl add-br br0
ovs-vsctl set bridge br0 datapath_type=netdev

3.添加/刪除一個端口

# for system interfaces
ovs-vsctl add-port br0 eth1
ovs-vsctl del-port br0 eth1
# for DPDK
ovs-vsctl add-port br0 dpdk1 -- set interface dpdk1 type=dpdk options:dpdk-devargs=0000:01:00.0
# for DPDK bonds
ovs-vsctl add-bond br0 dpdkbond0 dpdk1 dpdk2 \
    -- set interface dpdk1 type=dpdk options:dpdk-devargs=0000:01:00.0 \
    -- set interface dpdk2 type=dpdk options:dpdk-devargs=0000:02:00.0

4.設置/清除網橋的openflow協議版本

ovs-vsctl set bridge br0 protocols=OpenFlow13
ovs-vsctl clear bridge br0 protocols

5.查看某網橋當前流表

ovs-ofctl dump-flows br0
ovs-ofctl -O OpenFlow13 dump-flows br0
ovs-appctl bridge/dump-flows br0

6.設置/刪除控制器

ovs-vsctl set-controller br0 tcp:1.2.3.4:6633
ovs-vsctl del-controller br0

7.查看控制器列表

ovs-vsctl list controller

8.設置/刪除被動連接控制器

ovs-vsctl set-manager tcp:1.2.3.4:6640
ovs-vsctl get-manager
ovs-vsctl del-manager

9.設置/移除可選選項

ovs-vsctl set Interface eth0 options:link_speed=1G
ovs-vsctl remove Interface eth0 options link_speed

10.設置fail模式,支持standalone或者secure
standalone(default):清除所有控制器下發的流表,ovs自己接管
secure:按照原來流表繼續轉發

ovs-vsctl del-fail-mode br0
ovs-vsctl set-fail-mode br0 secure
ovs-vsctl get-fail-mode br0

11.查看接口id等

ovs-appctl dpif/show

12.查看接口統計

ovs-ofctl dump-ports br0

流表類

流表操作

1.添加普通流表

ovs-ofctl add-flow br0 in_port=1,actions=output:2

2.刪除所有流表

ovs-ofctl del-flows br0

3.按匹配項來刪除流表

ovs-ofctl del-flows br0 "in_port=1"

匹配項

1.匹配vlan tag,範圍爲0-4095

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.匹配源/目的MAC

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

4.匹配以太網類型,範圍爲0-65535

ovs-ofctl add-flow br0 in_port=1,dl_type=0x0806,actions=output:2

5.匹配源/目的IP
條件:指定dl_type=0x0800,或者ip/tcp

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

6.匹配協議號,範圍爲0-255
條件:指定dl_type=0x0800或者ip

# ICMP
ovs-ofctl add-flow br0 ip,in_port=1,nw_proto=1,actions=output:2

7.匹配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

8.匹配IP ecn位,範圍爲0-3
條件:指定dl_type=0x0800/0x86dd

ovs-ofctl add-flow br0 ip,in_port=1,ip_ecn=2,actions=output:2

9.匹配IP TTL,範圍爲0-255

ovs-ofctl add-flow br0 ip,in_port=1,nw_ttl=128,actions=output:2

10.匹配tcp/udp,源/目的端口,範圍爲0-65535

# 匹配源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

11.匹配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

12.匹配icmp code,範圍爲0-255
條件:指定icmp

ovs-ofctl add-flow br0 icmp,icmp_code=2,actions=output:2

13.匹配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

14.匹配mpls label
條件:指定dl_type=0x8847/0x8848

ovs-ofctl add-flow br0 mpls,in_port=1,mpls_label=7,actions=output:2

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

# 匹配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

一些匹配項的速記符

速記符 匹配項
ip dl_type=0x800
ipv6 dl_type=0x86dd
icmp dl_type=0x0800,nw_proto=1
icmp6 dl_type=0x86dd,nw_proto=58
tcp dl_type=0x0800,nw_proto=6
tcp6 dl_type=0x86dd,nw_proto=6
udp dl_type=0x0800,nw_proto=17
udp6 dl_type=0x86dd,nw_proto=17
sctp dl_type=0x0800,nw_proto=132
sctp6 dl_type=0x86dd,nw_proto=132
arp dl_type=0x0806
rarp dl_type=0x8035
mpls dl_type=0x8847
mplsm dl_type=0x8848

指令動作

1.動作爲出接口
從指定接口轉發出去

ovs-ofctl add-flow br0 in_port=1,actions=output:2

2.動作爲指定group
group id爲已創建的group table

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

ps: set field值爲4096+vlan_id,並且vlan優先級爲0,即4096-8191,對應的vlan_id爲0-4095

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
條件:指定dl_type=0x0800
修改ToS字段的高6位,範圍爲0-255,值必須爲4的倍數,並且不會去修改ToS低2位ecn值

ovs-ofctl add-flow br0 ip,in_port=1,actions=mod_nw_tos:68,output:2

19.動作爲mod_nw_ecn
條件:指定dl_type=0x0800,需要使用openflow1.1以上版本兼容
修改ToS字段的低2位,範圍爲0-3,並且不會去修改ToS高6位的DSCP值

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

ps: 常用NXM字段參照表

NXM字段 報文字段
NXM_OF_ETH_SRC 源MAC
NXM_OF_ETH_DST 目的MAC
NXM_OF_ETH_TYPE 以太網類型
NXM_OF_VLAN_TCI vid
NXM_OF_IP_PROTO IP協議號
NXM_OF_IP_TOS IP ToS值
NXM_NX_IP_ECN IP ToS ECN
NXM_OF_IP_SRC 源IP
NXM_OF_IP_DST 目的IP
NXM_OF_TCP_SRC TCP源端口
NXM_OF_TCP_DST TCP目的端口
NXM_OF_UDP_SRC UDP源端口
NXM_OF_UDP_DST UDP目的端口
NXM_OF_SCTP_SRC SCTP源端口
NXM_OF_SCTP_DST SCTP目的端口

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-\>OXM_OF_MPLS_LABEL[],output:2
# 對目的MAC進行賦值
ovs-ofctl add-flow br0 in_port=1,actions=load:0x001122334455-\>OXM_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表

常用操作

由於meter表是openflow1.3版本以後才支持,所以所有命令需要指定OpenFlow1.3版本以上
ps: 在openvswitch-v2.8之前的版本中,還不支持meter
在v2.8版本之後已經實現,要正常使用的話,需要注意的是datapath類型要指定爲netdev,band type暫時只支持drop,還不支持DSCP REMARK

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,band=type=drop,rate=20,burst_size=256
# 同上,增加stats參數,對meter進行計數統計
ovs-ofctl -O OpenFlow13 add-meter br0 meter=3,kbps,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中添加一條流表條目

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配置

ingress policing

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章