写在前面
- 学会了如何下发流表及删除流表的操作。
- 第一个不用脚本的实验。
实验原理
- 在SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包发送给控制器,由控制器决策数据包如何处理。
- 控制器下发决策后,交换机根据控制器下发的信息来进行数据包的处理,即转发或者丢弃该数据包。我们可以通过对流表操作来控制交换机的转发行为。
实验任务
- Mininet创建一个默认树形拓扑。
- 选择Mininet的控制器指定为ODL,进行基本的添加、删除流表操作,使网络实现网络通信和不通信。
- 拓扑如下所示:
实验步骤
Opendaylight控制器
- 打开一个终端,输入
ifconfig
,查看ODL所在IP为127.0.0.1
(环回IP)。 - 进入bin目录下,运行karaf文件。
Mininet创建topo
sudo su
进入管态。- 输入命令
mn --controller=remote,ip=127.0.0.1,port=6633
。
- Mininet或默认创建一个交换机下挂两台主机的topo。
流表的简单操作
- 输入
sh ovs-ofctl dump-flows s1
,查看s1
中的流表项。
- 输入
pingall
查看主机之间连通性。
- 这时我们再查看
s1
中的流表项时,会发现多出两条由Controller下发的流表项。 - Controller学习了
h1
,h2
的MAC地址后下发的流表。
我们看到每条流规则由一系列字段组成,它们由基本字段、条件字段和动作字段三部分组成。有了流表后交换机就根据流表来进行数据包的操作,当然我们也可以人工的进行流表的新增、修改、删除操作,在我们这个环境下可直接在终端下输入命令。
添加删除流表项
- 我们想让
h1
,h2
之间ping不通,只需要让交换机把从2号端口发来的数据包全部丢弃即可,1端口也可以。 h1
即使把ICMP包发过去,h2
回应的ICMP包也过不来。h2
向h1
发送ICMP包根本发不过去。- 下发一条流表实现上述功能:
sh ovs-ofctl add-flow s1 priority=12,in_port=2,actions=drop
- 注意:这条流表项的优先级要高于原来流表项的优先级
10
。 - 增加这条流表以后,
h1
和h2
主机之间无法通信了。
- 输入
sh ovs-ofctl dump-flows s1
,查看s1
中的流表项。
- 再删除一条流规则:如将删除条件字段中包含in_port=2的所有流表,如下图所示,将含有in_port=2的所有流表被删除了。
sh ovs-ofctl del-flows s1 in_port=2
- 因为之前添加的丢弃2号端口包的流表已被删除,这时
h1
和h2
又可以正常通信了。
- 输入
sh ovs-ofctl dump-flows s1
,查看s1
中的流表项。
实验小结
主要是对OpenFlow流表有更进一步的了解,简略介绍一些基本的流表操作。在此基础上可以进行比如改写源和目地主机的ip和mac地址、对数据包泛洪、回环等操作,用户可以根据需求通过修改流表来自主地控制转发行为,这本身也是SDN的初衷之一,也使得我们控制网络更加的便捷、灵活、多样。