OVS常用命令
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