1、概述
1.1 什么是SDN
软件定义网络(英语:software-defined networking,缩写作 SDN)是一种新型网络架构。它利用OpenFlow协议将路由器的控制平面(control plane)从数据平面(data plane)中分离,改以软件方式实现。该架构可使网络管理员在不更动硬件设备的前提下,以中央控制方式用程序重新规划网络,为控制网络流量提供了新方案,也为核心网络和应用创新提供了良好平台。Facebook与Google都在他们的数据中心中使用OpenFlow协议,并成立了开放网络基金会来推动这个技术。(来源:Wikipedia)
1.2 什么是mininet
Mininet是一个强大的网络仿真平台,通过这个平台,我们可以很方便的模拟真实环境中的网络操作与架构。特别是SDN,在真实网络中进行相关的网络实验有一定难度,自然需要一个仿真平台可以学习这种新型的网络架构,而Mininet就应运而生,承担了这个光荣而艰巨的使命。
Mininet自带交换机(switchs)、主机(hosts)、控制器(controllers),同时,在mininet上可以安装OpenvSwitch、多种控制器(NOXPOXRYUFloodlightOpenDaylight等),同时,Mininet可以运行在多种操作系统上(windowslinuxMac OS),具有很强的系统兼容性。最令人兴奋的一点是:在Mininet上进行的实验,可以无缝的移到真实的环境中去(官方是这么说的)【来源:CSDN】
Mininet官网:http://mininet.org/
1.3 什么是Floodlight
Floodlight是Apache授权并基于JAVA开发的企业级OpenFlow控制器,当前最新版本是1.2。
Floodlight OpenFlow Controller -ProjectFloodlight:http://www.projectfloodlight....
1.3 什么是sFlow
sFlow是一款适用于高速交换网络中的监控软件,可以实时监测网络流量,sFlow需要交换机支持才能使用,而OpenvSwitch支持这个功能。sFlow监控工具由sFlow Agent和sFlow Collector两部分组成。Agent作为客户端,一般内嵌于网络转发设备(如交换机、路由器),通过获取本设备上的接口统计信息和数据信息,将信息封装成sFlow报文发送到指定的Collector。Collector作为远端服务器,负责对sFlow报文分析、汇总、生成流量报告。
sFlow-RT:https://inmon.com/products/sFlow-RT.php
2、实验过程
2.1 实验拓扑
2.2 构建拓扑环境
1)启动Floodlight控制器
Floodlight 的WebUI端口是8080,我们可以用浏览器访问它
2)构建拓扑
保持 Floodlight 运行的终端,再新开一个终端窗口,输入如下指令,构建我们所需的拓扑结构。
命令解释:
sudo:以管理员权限运行,因为mininet要调用内核的东西
mn:就是mininet的命令简写
--controller=remote:使用远程的控制器
ip,port:控制器的ip和端口
--topo:指定拓扑类型,single 就是单一拓扑,就是最简单的交换机下面接主机,后面的3 表示,三台主机。
创建过程非常快,类似这样:
当你看到 mininet>
标识符,表示拓扑创建完成,我们可以输入一些指令查看网络拓扑。
nodes
指令显示节点信息:
links
指令显示链路信息:
还有检测网络链路连通性情况的pingall
指令:
想使用更多指令,可以键入 help
进行查看:
在Floodlight 的WebUI中查看拓扑结构
2.3 DDoS 攻击检测
1) 启动sFlow-RT
保持Mininet 运行的终端,再新开一个终端窗口,输入如下指令,启动sFlow-RT。
可以看到如下信息:
其中 6343 是sFlow Collector 的默认端口,8008 则是 sFlow 的WebUI端口。
2) 配置sFlow Agent
我们需要在虚拟交换机配置sFlow Agent,这样sFlow Collector 才能收集到流量信息进行分析和呈现。
键入以下指令部署sFlow Agent :
指令说明:
1)agent:监控 eth0 网卡产生的流量;
2)target:sFlow-RT的IP,默认端口6343;
3)bridge:需要开启sFlow的网桥;
4)sampling:采样率,表示每隔N个Packet就取样一次
5)polling:轮询时间,每隔N秒polling一次
提示:如果有N个网桥,就需要执行N次部署 sFlowAgent 的指令,我们本次实验中只有一个网桥,所以执行一次就可以了。
通过如下指令可以查看已经配置的 sFlow Agent
信息:
输入ip link
指令可以查看,虚拟交换机端口与端口编号的映射
可以看到s1 交换机对应的编号是4,交换机连接host1的端口对应的编号是5,依次类推。
查看sFlow Agent 是否配置成功,我们可以通过其WebUI进行查看:
可以看到已经添加到了监控对象,点击查看详情:
看到各个端口的各种信息,但是好像没有我们需要的流量信息,我们先添加一个,点击页面上的 Flows 选项
然后分别在Name ,Keys,Value,Filter
列填入:flows;ipsource,ipdestination,stack;bytes;留空
,然后点击下面的 Submit
提交
然后再回到 Agent
选项,查看监控的详情,就能看到 Flows
信息了(提示:如还是看不到 flows
,可在 mininet 控制台中执行 pingall
产生流量 。)
点击 5.flows
进去即可查看交换机1号端口的流量详情
然后切换到mininet
控制台窗口,使用如下指令,打开 Host1,和Host2的终端:
然后在 Host1 上启动一个 http
服务
在 Host2 上 ping
Host1
然后去观察流量
可以看到,流量很正常,在 Host2 终端中可以按 Ctrl+c
,停止ping。可以试试访问一下 Host1的HTTP服务。
2)DDoS攻击检测
接下来,我们进行DDoS 模拟攻击,在 mininet
终端中执行,h2 ping -f h1
,-f
参数的意思就是 Ping Flood ,模拟 Flood Attack。
再去观察交换机流量
流量随之飙升,我们可以在系统终端中执行,top
命令,查看 cpu占用
回到 mininet 终端,按 Ctrl+C
终止Ping Flood
,然后再观察流量
发现流量马上就下降了。
2.4 DDoS 攻击防御
我们首先在mininet 终端执行h2 ping -f h1
模拟 Ping Flood Attack。会发现流量马上又上来了。
接下来,我们通过Floodlight控制器向OpenFlow交换机下发流表,抑制攻击流量。在此之前,我们先了解一些概念。
1)什么是流表:
流表是交换机进行转发策略控制的核心数据结构。交换机芯片通过查找流表项来决策进入交换机网络的数据包执行适当的处理动作。可以理解为交换机收到数据包之后该做什么的一系列规则。
2)下发流表:
下发一条流表好比一条指令,告诉交换机收到数据包之后该做什么。
3)OpenFlow流表项结构简介
OpenFlow每个流表项由三个部分组成:用于数据包匹配的包头域(Header Fields),用于统计匹配数据包个数的计数器(Counters),用于对匹配的数据包如何处理的动作(Actions)
包头域:OpenFlow流表的包头域(OpenFlow v1.1之后被称作匹配域),用于对交换机接收到的数据包的包头内容进行匹配。在OpenFlow v1.0中,流表的包头域中包括了12个元组(Tuple):
对应的中文解释:
关于OpenFLow 流表的详细情况,大家可以自行查找相关资料。
打开一个系统终端,输入如下指令,调用Floodlight 的API 查询现有流表
返回为空:
提示:API文档请参考:Static Flow Pusher API pre-v1.0 -Floodlight Controller - Project Floodlight https://floodlight.atlassian.net/wiki/spaces/floodlightcontroller/pages/1343498/Static+Flow+Pusher+API+pre-v1.0?showComments=true&showCommentArea=true
Static Entry Pusher API - FloodlightController - Project Floodlight https://floodlight.atlassian.net/wiki/spaces/floodlightcontroller/pages/1343518/Static+Entry+Pusher+API
1)添加流表操作
然后我们添加一条静态流表,为了方便操作和查看,新建一个 ddos.json
的文件,将流表内容写入到这个文件,然后通过 API 进行提交,文件内容如下:
ddos.json字段解释:
switch:交换机dpid(如果你不知道,可以在控制器的WebUI界面查看)
name:随意取一个名字即可
cookie:流表规则标识
in_port:入端口
priority:优先级
active:是否激活
actions:动作
注意:不同版本的Floodlight API 在字段上可能不同。以下是 1.0 版本的API
执行下列指令,下发流表Drop数据包:
返回“Entry pushed”,表示流表下发成功,再次查询流表:
2)观察流量
切换到 sFlow 这边查看流量:
发现流表下发之后,流量迅速下降,h1
向h2
泛洪的数据包迅速的被完全Drop掉了。
切换到 h2
的终端,访问 h1
的web
服务
同样无法访问了。这是因为我们下发的流表是把所有的数据包都Drop掉了。这并不是我们想要的效果,等下我们再来解决这个问题。
3)删除流表
执行以下指令删除刚刚下发的流表:
再次观察流量:
攻击的数据包流表又恢复了。
4)DROP指定流量
改造需要下发的流表,让OpenFlowSwitch 只Drop掉 ICMP
的流量,不影响正常的HTTP服务
。修改内容如下:
添加了两个字段,eth_type
: 指定以太网类型为ipv4
,ip_proto
:指定协议类型为ICMP
。
再次下发流表:
此时再观察流量和访问 h1
的HTTP
服务
可以发现,流量下降到正常,但HTTP
服务依然可以访问,没有受到影响。
3、总结
通过SDN技术,我们可以对网络流量进行实时监控,提取,分析,并能够及时的对流量进行调整比如QoS,负载均衡,DDoS流量过滤等。
4、如何在线体验上述实验
<<<<<<??点击下方链接即可??>>>>>>
5、说明
本文由合天网安实验室原创,转载请注明来源。
关于合天网安实验室
合天网安实验室(www.hetianlab.com)-国内领先的实操型网络安全在线教育平台
真实环境,在线实操学网络安全 ;
实验内容涵盖:系统安全,软件安全,网络安全,Web安全,移动安全,CTF,取证分析,渗透测试,网安意识教育等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。