本文简要介绍在虚拟机环境下,主要目的是对Open vSwitch下发的流表操作,通过OpenDaylight与Mininet熟悉添加、删除流表的命令及设备通信的原理。
1 流表作用
在SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包发送给控制器,由控制器决策数据包如何处理。控制器下发决策后,交换机根据控制器下发的信息来进行数据包的处理,即转发或者丢弃该数据包。我们可以通过对流表操作来控制交换机的转发行为。下面简单介绍一下流表的基本操作。
2 环境准备
参考本专题前面两篇文章装好OpenDaylight(以下简称“ODL”)和Mininet的虚拟机环境。
3 Mininet连接ODL控制器
首先我们在已安装有相关环境的虚拟机终端中启动ODL和Mininet,Mininet创建一个默认树形拓扑并选择Mininet的控制器为ODL。ODL启动详见:OpenDaylight与Mininet应用实战之基本环境搭建(一)。
1 |
# mn –switch ovsk –controller=remote,ip=[ODL_IP],port=6633[默认端口] |
在ODL的Web界面中我们可以看到已连接上ODL的交换机。
4 流表的简单操作
4.1 从终端对流表进行操作
新建一个终端查看当前交换机上的流表,返回值应为空。
1 2 |
root@ubuntu:/# ovs-ofctl dump-flows s1 NXST_FLOW reply (xid=0x4): |
在Mininet中pingall一下,交换机下面的两台主机h1、h2应能互相通信,如果不能通信请检查交换机是否与ODL正确连接。
1 2 3 4 5 |
mininet> pingall *** Ping: testing ping reachability h1 -> h2 h2 -> h1 *** Results: 0% dropped (0/2 lost) |
此时再查看交换机s1中流表应为两条。
1 2 3 4 |
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的Web界面下操作,相比而言第二种的图形化界面更加人性化一点。
例如让交换机丢弃从2号端口发来的所有数据包。
1 |
# ovs-ofctl add-flow s1 priority=1,in_port=2,actions=drop |
增加这条流表以后,Mininet中h1和h2主机之间没有办法通信了。
1 2 3 4 5 |
mininet> pingall *** Ping: testing ping reachability h1 -> X h2 -> X *** Results: 100% dropped (2/2 lost) |
我们再删除一条流规则:例如删除条件字段中包含in_port=2的所有流表。
1 |
# ovs-ofctl del-flows br0 in_port=2 |
因为我们之前添加的丢弃2号端口包的流表已被删除,这时Mininet中h1和h2主机又可以正常通信了。
4.2 通过ODL的Web界面进行流表操作
我们进入ODL的Web界面里面的Troubleshoot标签页,点击左侧Existing Nodes下对应交换机的Flows就能看到当前交换机上的流表。
切换至Flows标签页下,就可以进行流表的操作了。
点击Add Flow Entry根据字段填写相应的值,这里我们将来自1端口的包丢弃,输入一个流表名称,Node选择对应交换机,Input Port选择1端口s1-eth1(1),最后的Actions选择Drop。填写后点击Install Flow,流表便由控制器写入交换机了。这里一条流表中可以按顺序执行多个Action。
此时Mininet两台主机又无法通信了,将这条流表删除后两台主机便又可以正常通信。
5 总结
本文主要让读者对OpenFlow流表有更进一步的了解,简略介绍一些基本的流表操作。后续读者可以进行比如改写源和目标机的ip和mac地址、对数据包泛洪、回环等操作,用户可以根据需求通过修改流表来自主地控制转发行为,这本身也是SDN的初衷之一,也使得我们控制网络更加的便捷、灵活、多样。下一篇我们将学习OpenDaylight与Mininet应用实战之三层转发机制(四)。