1、环境介绍:
(1)Ubuntu操作系统
(2)Mininet仿真环境
(3)Floodlight1.2版本
2、使用拓扑介绍:
(1)使用的拓扑图:
在这次实战中,部署的拓扑为两个三层树形节点与一个三角形节点的结合。
(2)创建拓扑代码:
代码如下:
在命令行中使用sudo python topo.py(拓扑文件名)来创建拓扑,若出现下图则代表拓扑图创建成功。
(3)查看拓扑图
创建成功后,可以登录http://127.0.0.1:8080/ui/index.html来查看拓扑,如下图:
由于floodlight1.2版本中的拓扑图不便于观察,故绘制下图便于读者理解:
3、floodlight流表介绍
(1)Floodlight查看所有流表API:
http://127.0.0.1:8080/wm/core/switch/all/flow/json
以S4中存在流表介绍,在未下发流表的情况下,其内存在的流表如下:
(2)流表介绍
在之前看的openvswitch的文档上曾介绍了一种“table-miss”的特殊流表,该流表的特点是优先级为0并且能够通配所有的流表。该流表的作用在于将所有无法被其他流表匹配的数据包,通过controller预留端口发往控制器,由控制器决定下一步的输出动作。个人认为,上图的流表也就是“table-miss”流表。
在这里解释下floodlight流表中各个字段的含义。
Version:使用的Openflow版本
Cookie:流表规则标识
TableID:流表所属的table编号
Packetcount: 该交换机收到的数据包总数
byteCount:该交换机收到的字节数
DurationSeconds、DurationNSeconds:累加就是整个持续时间
Priority:优先级
IdleTimeoutSec:此流表项从最后一个匹配的报文到现在空闲的时间
HardTimeoutSec:此流表项从最后一次被创建或者修改到现在的时间
Flags:流表的标记
Match:匹配域,可以是输入端口与包头部,或者其他可选字段,如来自上一个包的元数据
Instruction:指明数据包的下一步处理方式
4、实验一改变流量路径
(1)实验目的:
在当前topo中,利用终端H1去ping终端H8,由于在S1,S2,S3中存在一个环路,为避免广播风暴的产生,在floodlight1.2版本的控制器中,默认情况下会将路径设定为最短路径(若环路存在,且经过的交换机数量一致,则会选择其中一条路径),故在此拓扑中经过的ICMP数据包经过的路径是H1--S5--S4--S2--S3--S7--S9--H8。此时,利用wireshark去监听S1。监听结果如图:
从S1端口的监听情况,可以进一步说明ICMP包未经过交换机S1,而该实验的目的为通过下发流表,改变数据包的走向,使数据流经过S1
(2)下发流表:
流表内容如下:
流表的含义为:数据包经过S2时,通过分析,若该数据包进入端口为3,则将其转发至S2的1端口,S2的1端口与S1相连。同时S3的下发流表同理。在下发流表后,可以通过前面介绍的API查看下此时的所有流表。
(3)实验结果
通过wireshark监听S1,此时可以发现S1收到了ICMP包。如下图:
由上图可以看出,S1接受到了由H1到H8的ICMP包,同时读者可以利用wireshark监听S2与S3之间连接的端口,可以发现这两个端口已经接受不到来自H1到H8的ICMP包。
5、实验二利用ACL实现访问控制
(3)ACL原理
可在floodlight官网当中查看详细解释
https://floodlight.atlassian.net/wiki/spaces/floodlightcontroller/pages/4882434/ACL+Access +Control+List+Dev
(4)实验目的
基于上述topo,实现让H1无法ping通H7,但是其他不影响其他主机之间利用ping命令。
(5)实验脚本
可以利用curl http://127.0.0.1:8080/wm/acl/rules/json | python -mjson.tool查看控制器中存在的ACL
该文件的作用在于下发一个流表,使得所有原地址是10.0.0.1,目的地址是10.0.0.7的ICMP数据包都会被丢弃。
下发后实验结果如下图:
(6)查看此时所有交换机中的流表,以经过的S5为例。
在上图中可以看到,S5中match字段添加了内容,其含义是若匹配到原地址为10.0.0.1,目的地址为10.0.0.7的ICMP数据包,则采取drop动作,将数据包丢弃。
6、实验三虚拟网测试
(1)虚拟网简介
可以在floodlight官网中查看:https://floodlight.atlassian.net/wiki/spaces/floodlightcontroller/pages/1343615/Virtual+Network+Filter+REST+API
(2)环境配置
若需要启用floodlight控制器的虚拟网功能,则需要更改floodlight1.2/src/main/resources/floodlightdefault.properties中的内容,更改内容为添加一行net.floodlightcontroller.virtualnetwork.VirtualNetworkFilter,\
如下图:
在添加完成后,各个节点当中默认无法ping通,只有处于同一个虚拟网当中的节点才能ping通。
(3)实验内容
创建两个虚拟网络V1,V2,并将H1,H3加入V1。H2,H4加入V2中,查看节点之间ping命令情况。
(4)实验命令
①创建虚拟网V1:
curl -X PUT -d ‘{“network”:{“gateway”:“100.0.0.254”,“name”:“v1”}}’ http://127.0.0.1:8080/networkService/v1.1/tenants/default/networks/1
②创建虚拟网V2:
curl -X PUT -d ‘{“network”:{“gateway”:“200.0.0.254”,“name”:“v2”}}’ http://127.0.0.1:8080/networkService/v1.1/tenants/default/networks/2
③添加主机至虚拟网中
添加H1、H3:
curl -X PUT -d ‘{”attachment”:{“id”:”1”,”mac”:”00:00:00:00:00:01”}}’ http://127.0.0.1:8080/networkService/v1.1/tenants/default/network/1/ports/1/attachment
curl -X PUT -d ‘{”attachment”:{“id”:”2”,”mac”:”00:00:00:00:00:03”}}’ http://127.0.0.1:8080/networkService/v1.1/tenants/default/network/1/ports/2/attachment
添加H2、H4:
curl -X PUT -d ‘{”attachment”:{“id”:”1”,”mac”:”00:00:00:00:00:02”}}’ http://127.0.0.1:8080/networkService/v1.1/tenants/default/network/2/ports/1/attachment
curl -X PUT -d ‘{”attachment”:{“id”:”2”,”mac”:”00:00:00:00:00:04”}}’ http://127.0.0.1:8080/networkService/v1.1/tenants/default/network/2/ports/2/attachment
(5)查看添加结果及实验结果:
①虚拟网结果:
可以利用浏览器访问http://127.0.0.1:8080/networkService/v1.1/tenants/default/networks进行查看添加的虚拟网,添加结果如下:
②实验结果:
从图中可以看出,只有在同一个虚拟网中的主机才能互相访问,其他主机无法访问虚拟网中的主机。