网桥管理(ovsdb数据库操作)
ovsdb是一个非常轻量级的数据库,与其说它是一个数据库,不如说它是一个提供增删查改等功能的临时配置缓存,之所以这么说,是因为ovsdb数据库的根本就未使用多少数据库技术,如SQL语言查询、存储过程等等。ovsdb 数据库通过模式文件“openvswitch-1.2.0/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数据表中的所有记录
ovs-vsctl list bridge
获得bridge数据表_uuid字段的值
ovs-vsctl get bridge br1 _uuid
设置bridge数据表datapath_type字段的值
ovs-vsctl set bridge br1 datapath_type="system"
ovs-vsctl get bridge br1 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命令)
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
流规则管理
流规则组成
每条流规则由一系列字段组成,分为基本字段、条件字段和动作字段三部分:
基本字段包括生效时间duration_sec、所属表项table_id、优先级priority、处理的数据包数n_packets,空闲超时时间idle_timeout等,空闲超时时间idle_timeout以秒为单位,超过设置的空闲超时时间后该流规则将被自动删除,空闲超时时间设置为0表示该流规则永不过期,idle_timeout将不包含于ovs-ofctl dump-flows brname的输出中。
条件字段包括输入端口号in_port、源目的mac地址dl_src/dl_dst、源目的ip地址nw_src/nw_dst、数据包类型dl_type、网络层协议类型nw_proto等,可以为这些字段的任意组合,但在网络分层结构中底层的字段未给出确定值时上层的字段不允许给确定值,即一条流规则中允许底层协议字段指定为确定值,高层协议字段指定为通配符(不指定即为匹配任何值),而不允许高层协议字段指定为确定值,而底层协议字段却为通配符(不指定即为匹配任何值),否则,ovs-vswitchd 中的流规则将全部丢失,网络无法连接,解决方法请参考“Open vSwitch维护”。
动作字段包括正常转发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 dump-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