ovs入门
控制器向上提供接口,用来供应用程序调用,此接口成为北向接口;控制器向下调用接口,控制网络设备,此接口成为南向接口。
OpenFlow是控制器和网络设备之间互通的南向协议,OpenvSwitch 用于创建软件的虚拟交换机。
原理
用户态进程
- ovsdb:本地数据库,存储ovs的配置信息
- vswitchd:ovs-ofctl用来跟该命令通讯,下发流表规则
install OpenvSwitch on CentOS 7
1 | # 安装依赖 |
在编译的时候有如下报错:
1 | File "/usr/lib64/python2.7/site-packages/jinja2/sandbox.py", line 22, in <module> |
是因为markupsafe的版本不对导致的,解决方法为安装合适的版本:
1 | pip uninstall markupsafe |
vlan实验
1 | # 创建虚拟交换机ovs_br |
flow table试验 1
1 | # 创建namespace |
可以使用如下命令来查看刚才的操作:
1 | # 可以看到刚才创建的网桥 |
接下来测试一下网络的连通性是没问题的。
1 | ip netns exec ns1 ping 192.168.1.200 |
查看当前流表,可以看到有一条默认的规则,该条规则用来实现交换机的基本动作。
1 | $ ovs-ofctl dump-flows ovs1 |
将上述规则删除,再执行ping命令发现已经不通。说明该默认规则会将流量在端口之间进行转发。
1 | ovs-ofctl del-flows ovs1 |
新增加如下两条规则,用来表示将port 1的流量转发到port 3,将port 3的流量转发到port 1。其中的1和3分别为port编号,使用ovs-vsctl list interface veth1_br
命令中的ofport可以看到。
1 | ovs-ofctl add-flow ovs1 "priority=1,in_port=1,actions=output:3" |
再执行ping命令,发现可以ping通了。
重新增加一条优先级更高的规则,将port 1的数据drop掉。此时再ping发现已经不通了。
1 | ovs-ofctl add-flow ovs1 "priority=3,in_port=1,actions=drop" |
多table
接下来清理掉规则,并将规则重新写入到table1中,默认规则是写入到table0中的
1 | ovs-ofctl del-flows ovs1 |
此时再执行ping命令,发现网络是不通的。因为table0中没有匹配成功,包被drop掉了。
再增加如下规则,即将table 0的规则发送到table 1处理,此时可以ping通。
1 | ovs-ofctl add-flow ovs1 "table=0,actions=goto_table=1" |
group table
执行ovs-ofctl del-flows ovs1
重新清理掉规则,执行下面命令查看group table内容,可以看到内容为空。
1 | # ovs-ofctl -O OpenFlow13 dump-groups ovs1 |
执行如下命令,完成数据包从table0 -> group table -> table1的过程,真正数据处理在table1中。
1 | # 创建一个group table,其作用为将数据包发送到table 1 |
此时再执行ping命令,发现是可以ping通的。
清理操作
1 | # 删除网桥 |
常用操作
ovs-appctl fdb/show ovs1
: 查看mac地址表ovs-ofctl show ovs1
: 可以查看网桥的端口号ovs-vsctl set bridge ovs1 stp_enable=false
: 开启网桥的生成树协议ovs-appctl ofproto/trace ovs1 in_port=1,dl_dst=7a:42:0a:ca:04:65
: 可用来验证一个包到达网桥后的处理流程