介绍openvswitch的常用命令、流表字段、action和flow流程。
常用ovs命令行
ovs-ofctl --version
查看 OVS 支持的 OpenFlow 协议的版本ovs-vsctl add-br ovs-switch
创建新交换机,名字是ovs-switchovs-vsctl add-port ovs-switch p0 -- set Interface p0 ofport_request=100
设置端口p0的OpenFlow 端口编号为 100ovs-vsctl set Interface p0 type=internal
设置网络接口设备的类型为“internal”。对于 internal 类型的的网络接口,OVS 会同时在 Linux 系统中创建一个可以用来收发数据的模拟网络设备。我们可以为这个网络设备配置 IP 地址、进行数据监听等等ethtool -i p0
查看if情况ovs-vsctl show
查看ovs中所有的虚拟交换机ovs-ofctl add-flow ovs-switch "table=0, dl_src=01:00:00:00:00:00/01:00:00:00:00:00, actions=drop"
屏蔽所有进入 OVS 的以太网广播数据包ovs-ofctl add-flow ovs-switch "priority=1 idle_timeout=0,in_port=100,actions=mod_nw_src:9.181.137.1,normal"
修改从端口 p0 收到的数据包的源地址为 9.181.137.1ovs-ofctl add-flow ovs-switch idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:102
重定向所有的 ICMP 数据包到端口 p2ovs-vsctl set Port p1 tag=101
修改端口p1的VLAN tag为101ovs-ofctl add-flow ovs-switch "priority=3,in_port=100,dl_vlan=0xffff,actions=mod_vlan_vid:101,normal"
对于从端口 100 进入交换机的数据包,如果它不包含任何 VLAN tag,则自动为它添加 VLAN tag 101ovs-ofctl dump-tables ovs-switch
查看交换机中的所有 Tableovs−ofctl dump−flows ovs-switch
查看交换机中的所有流表项ovs-ofctl del-flows ovs-switch "in_port=100"
删除编号为 100 的端口上的所有流表项ovs-ofctl show ovs-switch
查看交换机上的端口对应的openflow编号ovs-appctl ofproto/trace
可以测试ovs对数据包的转发情况ovs-appctl ofproto/trace br-int in_port=11,dl_src=fa:16:3e:90:1C:bc,dl_dst=88:75:56:3c:62:40 -generate
常用流表字段
man ovs-ofctl
中有详细介绍。
in_port=port
传递数据包的端口的 OpenFlow 端口编号dl_vlan=vlan
数据包的 VLAN Tag 值,范围是 0-4095,0xffff 代表不包含 VLAN Tag 的数据包dl_src=<MAC>
匹配源MAC 地址
- 01:00:00:00:00:00/01:00:00:00:00:00 代表广播地址
- 00:00:00:00:00:00/01:00:00:00:00:00 代表单播地址
- 01:00:00:00:00:00/01:00:00:00:00:00 代表广播地址
dl_dst=<MAC>
匹配目标MAC 地址dl_type=ethertype
dl_type=0x0800
代表 IPv4 协议dl_type=0x086d
代表 IPv6 协议dl_type=0x0806
代表 ARP 协议
nw_src=ip[/netmask]
匹配源IPv4 地址nw_dst=ip[/netmask]
匹配目标IPv4 地址nw_proto=proto
- 当
dl_type=0x0800
时,匹配 IP 协议编号 - 当
dl_type=0x086d
代表 IPv6 协议编号
- 当
arp_spa=ip[/netmask]
当dl_type是arp时,arp_spa代表源ip地址arp_tpa=ip[/netmask]
当dl_type是arp时,arp_tpa代表目标ip地址table=number
指定要使用的流表的编号,范围是 0-254。在不指定的情况下,默认值为 0。通过使用流表编号,可以创建或者修改多个 Table 中的 Flow
常用action
man ovs-ofctl
中有详细介绍。
output:port
输出数据包到指定的端口。port 是指端口的 OpenFlow 端口编号mod_vlan_vid:vlan_vid
修改数据包中的 VLAN tagstrip_vlan
移除数据包中的 VLAN tagmod_dl_src:mac/mod_dl_dst:mac
修改源或者目标的 MAC 地址信息mod_nw_src:ip/mod_nw_dst:ip
修改源或者目标的 IPv4 地址信息resubmit([port],[table])
Re-searches this OpenFlow flow table (or the table whose number is specified by table) with the in_port field replaced by port (if port is specified) and executes the actions found, if any, in addition to any other actions in this flow entry
ovs的flow处理流程
完毕。