本文简要介绍在虚拟机环境下,主要是针对openvswitch的流表操作,目的是熟悉添加删除流表的命令及设备通信的原理。
在SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包发送给控制器,由控制器决策数据包如何处理。控制器下发决策后,交换机根据控制器下发的信息来进行数据包的处理,即转发或者丢弃该数据包。我们可以通过对流表操作来控制交换机的转发行为。下面简单介绍一下流表的基本操作。
需要前两个专题中装好ODL和Mininet的虚拟机环境。
首先我们在已安装有相关环境的虚拟机终端中启动OpenDaylight(以下简称ODL)和Mininet,Mininet创建一个默认树形拓扑并选择Mininet的控制器为ODL。ODL启动详见ODL与Mininet应用实战之基本环境搭建(一)。
# mn –switch ovsk –controller=remote,ip=[ODL_IP],port=6633[默认端口]
在ODL的Web界面中我们可以看到已连接上ODL的交换机。
新建一个终端查看当前交换机上的流表,返回值应为空。
root@ubuntu :/# ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
在Mininet中pingall一下
mininet> pingall
*** Ping: testing ping reachability
h1 -> h2
h2 -> h1
*** Results: 0% dropped (0/2 lost)
此时再查看交换机s1中流表应为两条。
root@ubuntu :/# ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=76.445s, table=0, n_packets=0, n_bytes=0, priority=1,ip,nw_dst=10.0.0.2 actions=mod_dl_dst:4a:d3:cf:8c:cc:4c,output:2
cookie=0x0, duration=76.49s, table=0, n_packets=2, n_bytes=196, priority=1,ip,nw_dst=10.0.0.1 actions=mod_dl_dst:46:bc:5d:64:2f:06,output:1
我们看到每条流规则由一系列字段组成,分为基本字段、条件字段和动作字段三部分。有了流表后交换机就根据流表来进行数据包的操作,当然我们也可以人工的进行流表的新增、修改、删除操作。在ODL下有两种方式进行人工流表操作,一种是直接在终端下输入命令,另一种则是在ODL的Web界面下操作,相比而言第二种的图形化界面更加人性化一点。
例如让交换机丢弃从2号端口发来的所有数据包。
# ovs-ofctl add-flow s1,in_port=2,actions=drop
增加这条流表以后,Mininet中h1和h2主机之间没有办法通信了。
mininet> pingall
*** Ping: testing ping reachability
h1 -> X
h2 -> X
*** Results: 100% dropped (2/2 lost)
我们再删除一条流规则:例如删除条件字段中包含in_port=2的所有流表。
# ovs-ofctl del-flows br0 in_port=2
这时Mininet中h1和h2主机又可以正常通信了。
进入ODL的Web界面后切换至Flows标签下,就可以进行流表的操作了。
点击Add Flow Entry根据字段填写相应的值,这里我们将来自1端口的包丢弃,输入一个流表名称,Node选择交换机,Input Port选择1端口s1-eth1(1),最后的Actions选择Drop。填写后点击Install Flow,流表便下发至交换机。这里一条流表中可以按顺序执行多个action。
此时返回Mininet两台主机又无法通信了,将这条流表删除后两台主机便可以正常通信了。
本文主要让读者对openflow流表有更进一步的了解,简略介绍一些基本的流表操作。后续读者可以根据需求通过修改流表来自主地控制转发行为,这本身也是SDN的初衷之一,也使得我们控制网络更加的便捷、灵活、多样。
本文来源于SDNLAB,可点击此阅读原文。如果您对本文感兴趣,可参与以下互动方式与作者近距离交流。
1) 微博(http://weibo.com/sdnlab/)
2)微信
3)交流QQ群:
SDN研究群(214146842)
OpenDaylight研究群(194240432)