ovs命令
ovs交换机组成如图
ovs-dpctl:配置vswitch内核模块,可以控制转发规则。
ovs-ofctl:基于 OpenFlow 协议对 OpenFlow 交换机进行监控和管理,下发流表信息等。
ovs-appctl:用于查询和控制ovs-vswithchd。
ovs-vsctl:ovs-vSwitch管理程序,可以进行网桥、接口等的创建、删除、设置、查询等(即获取或更改ovs-vswitchd的配置信息),此工具操作的时候会通过ovsdb-server更新数据库。
ovsdb-client:访问 ovsdb-server 的客户端程序,通过 ovsdb-server 执行数据库操作。
vtep-ctl:VTEP(VXLAN隧道端点模拟器(VXLAN Tunnel EndPoint,VTEP))配置工具。
ovsdb-tool:ovsdb-tool 直接操作数据库,无需借助ovsdb-server。
datapath(OVS内核模块): Datapath把流的match和action结果缓存,避免后续同样的流继续upcall到用户空间进行流表匹配。
ovs-db:开放虚拟交换机数据库是一种轻量级的数据库,它是一个JSON文件,默认路径:/etc/openvswitch/conf.db
ovs-vsctl命令
常用命令
show print overview of database contents(显示数据库内容的打印概述,查看网桥)
add-br BRIDGE create a new bridge named BRIDGE(创建一个名为BRIDGE的新网桥)
del-br BRIDGE delete BRIDGE and all of its ports(删除BRIDGE及其所有端口)
add-port BRIDGE PORT add network device PORT to BRIDGE(将网络设备PORT添加到BRIDGE)
del-port [BRIDGE] PORT delete PORT (which may be bonded) from BRIDGE 从BRIDGE删除PORT(可能是绑定的)
del-controller BRIDGE delete the controllers for BRIDGE(删除BRIDGE的控制器)
控制管理类
1.查看网桥和端口
ovs-vsctl show
2.创建一个网桥
ovs-vsctl add-br br0
ovs-vsctl set bridge br0 datapath_type=netdev (ovs的datapath_type有nedev和system,在创建dpdk接口的bridge时需指定)
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
# or new version
ovs-vsctl add-port br0 dpdkbond0 \
-- set interface dpdkbond0 type=dpdk options:dpdk-devargs=0000:01:00.0,0000:02:00.0
4.设置/清除网桥的openflow协议版本
ovs-vsctl set bridge br0 protocols=OpenFlow13
ovs-vsctl clear bridge br0 protocols
5.设置/删除控制器
ovs-vsctl set-controller br0 tcp:1.2.3.4:6633
ovs-vsctl del-controller br0
6.查看控制器列表
ovs-vsctl list controller
7.设置/删除被动连接控制器
ovs-vsctl set-manager tcp:1.2.3.4:6640
ovs-vsctl get-manager
ovs-vsctl del-manager
8.设置/移除可选选项
ovs-vsctl set Interface eth0 options:link_speed=1G
ovs-vsctl remove Interface eth0 options link_speed
9.设置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
10.给网口设置VLAN_ID
ovs-vsctl set port port1 tag=2
ovs-ofctl命令
常用命令
dump-flows SWITCH FLOW print matching FLOWs(打印流表,后面需要添加参数,即交换机名)
show SWITCH show OpenFlow information(显示SWITCH的OpenFlow信息)
dump-tables SWITCH print table stats(打印表统计信息)
dump-ports SWITCH [PORT] print port statistics(打印端口统计信息)
add-flow SWITCH FLOW add flow described by FLOW(通过流的描述来添加流)
del-flows SWITCH [FLOW] delete matching FLOWs(删除匹配的FLOW,后面加条件,比如in_port=1)
-V,--version display version information(显示交换机版本信息)
-O, --protocols set allowed OpenFlow version(default: OpenFlow10, OpenFlow11, OpenFlow12, OpenFlow13, OpenFlow14)(设置允许的OpenFlow版本,后面是默认值)
控制管理类
1.查看某网桥当前流表
ovs-ofctl dump-flows br0
ovs-ofctl -O OpenFlow13 dump-flows br0
ovs-appctl bridge/dump-flows br0
2.查看接口统计
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"
匹配项
ovs流表条件匹配是进行删除,修改的基础。需要根据匹配条件定位到相应的流表规则后才能进行后续的修改
记住,priority不能作为一个匹配选项!!!
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
一些匹配项的速记符
指令动作
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
ps: 常用NXM字段参照表
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,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
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