预备知识
SDN
软件定义网络(英语:software-defined networking,缩写作 SDN)是一种新型网络架构。它利用OpenFlow协议将路由器的控制平面(control plane)从数据平面(data plane)中分离,改以软件方式实现。该架构可使网络管理员在不更动硬件设备的前提下,以中央控制方式用程序重新规划网络,为控制网络流量提供了新方案,也为核心网络和应用创新提供了良好平台。
Facebook与Google都在他们的数据中心中使用OpenFlow协议,并成立了开放网络基金会来推动这个技术。【来源:Wikipedia】
Mininet
Mininet是一个强大的网络仿真平台,通过这个平台,我们可以很方便的模拟真实环境中的网络操作与架构。特别是SDN,在真实网络中进行相关的网络实验有一定难度,自然需要一个仿真平台可以学习这种新型的网络架构,而Mininet就应运而生,承担了这个光荣而艰巨的使命。
Mininet自带交换机(switchs)、主机(hosts)、控制器(controllers),同时,在mininet上可以安装OpenvSwitch、多种控制器(NOX\POX\RYU\Floodlight\OpenDaylight等),同时,Mininet可以运行在多种操作系统上(windows\linux\Mac OS),具有很强的系统兼容性。最令人兴奋的一点是:在Mininet上进行的实验,可以无缝的移到真实的环境中去(官方是这么说的)【来源:CSDN】
Mininet:http://mininet.org/
Floodlight
Floodlight是Apache授权并基于JAVA开发的企业级OpenFlow控制器,当前最新版本是1.2。
Floodlight OpenFlow Controller -ProjectFloodlight:http://www.projectfloodlight.org/floodlight/ sFlow
sFlow是一款适用于高速交换网络中的监控软件,可以实时监测网络流量,sFlow需要交换机支持才能使用,而OpenvSwitch支持这个功能。sFlow监控工具由sFlow Agent和sFlow Collector两部分组成。Agent作为客户端,一般内嵌于网络转发设备(如交换机、路由器),通过获取本设备上的接口统计信息和数据信息,将信息封装成sFlow报文发送到指定的Collector。Collector作为远端服务器,负责对sFlow报文分析、汇总、生成流量报告。
sFlow-RT:https://inmon.com/products/sFlow-RT.php
实验目的
1、了解sFlow-RT的配置
2、基于SDN的DDoS攻击仿真
3、掌握利用Floodlight进行DDoS防御的原理和方法
实验环境
操作系统:Ubuntu14.04 LTS
所用工具:Mininet,Floodlight,sFlow-RT
网络拓扑:
实验步骤一
实验拓扑构建
桌面空白处,右键-打开终端,切换到HOME目录
启动Floodlight 控制器
在输出信息中可以看到监听的端口
其中 6653 是OpenFlow swith的端口,等会我们用mininet 创建网络拓扑需要用到这个端口,8080 则是 Floodlight 的WebUI端口,我们可以用浏览器访问它
保持 Floodlight 运行的终端,再新开一个终端窗口,输入如下指令,构建我们所需的拓扑结构。
命令解释:
sudo:以管理员权限运行,因为mininet要调用内核的东西
mn:就是mininet的命令简写
--controller=remote:使用远程的控制器
ip,port:控制器的ip和端口
--topo:指定拓扑类型,single 就是单一拓扑,就是最简单的交换机下面接主机,后面的3 表示,三台主机。
创建过程非常快,类似这样:
当你看到 mininet> 标识符,表示拓扑创建完成,我们可以输入一些指令查看网络拓扑。
nodes 指令显示节点信息:
links指令显示链路信息:
还有检测网络链路连通性情况的pingall 指令:
想使用更多指令,可以键入 help 进行查看:文章来源:https://www.toymoban.com/news/detail-485017.html
除了在mininet 控制台之外,Floodlight 的WebUI提供一种更友好的方式查看网络拓扑情况,可以点击左侧的菜单查看相应的信息。
实验步骤二
DDoS 攻击检测
启动sFlow-RT进行流量监控:
保持Mininet 运行的终端,再新开一个终端窗口,输入如下指令,启动sFlow-RT。(启动后不要关闭此终端)
可以看到如下信息:
其中 6343 是sFlow Collector 的默认端口,8008 则是 sFlow 的WebUI端口。
配置sFlow Agent:
我们需要在虚拟交换机配置sFlow Agent,这样sFlow Collector 才能收集到流量信息进行分析和呈现。
键入以下指令部署sFlow Agent :
sudo ovs-vsctl -- --id=@sflow create sflow agent=eth0 \
target=\"127.0.0.1:6343\" sampling=10 polling=20 -- -- set bridge s1 \
sflow=@sflow
指令说明:
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服务。
接下来,我们进行DDoS 模拟攻击,在 mininet 终端中执行,h2 ping -f h1 ,-f 参数的意思就是 Ping Flood ,模拟 Flood Attack。
再去观察交换机流量
流量随之飙升,我们可以在系统终端中执行,top 命令,查看 cpu占用
回到 mininet 终端,按 Ctrl+C 终止Ping Flood ,然后再观察流量
发现流量马上就下降了。
实验步骤三
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):
(图片来源:Juniper Networks)
对应的中文解释:
关于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
然后我们添加一条静态流表,为了方便操作和查看,新建一个 ddos.json 的文件,将流表内容写入到这个文件,然后通过 API 进行提交,文件内容如下:
ddos.json字段解释:
switch:交换机dpid(如果你不知道,可以在控制器的WebUI界面查看)
name:随意取一个名字即可
cookie:流表规则标识
in_port:入端口
priority:优先级
active:是否激活
actions:动作
注意:不同版本的Floodlight API 在字段上可能不同。以下是 1.0 版本的API
执行下列指令,下发流表Drop数据包:
curl -X POST -d @ddos.json http://localhost:8080/wm/staticflowentrypusher/json
返回“Entry pushed”,表示流表下发成功,再次查询流表:
切换到 sFlow 这边查看流量:
发现流表下发之后,流量迅速下降,h1向h2泛洪的数据包迅速的被完全Drop掉了。
切换到 h2 的终端,访问 h1的web服务
同样无法访问了。这是因为我们下发的流表是把所有的数据包都Drop掉了。这并不是我们想要的效果,等下我们再来解决这个问题。
执行以下指令删除刚刚下发的流表:
curl -X DELETE -d'{"name":"flow-mod-dropt"}' \
http://localhost:8080/wm/staticflowentrypusher/json
再次观察流量:
攻击的数据包流表又恢复了。
改造需要下发的流表,让OpenFlowSwitch 只Drop掉 ICMP的流量,不影响正常的HTTP服务。修改内容如下:
添加了两个字段,eth_type: 指定以太网类型为ipv4,ip_proto:指定协议类型为ICMP。
再次下发流表:
此时再观察流量和访问 h1 的HTTP服务
可以发现,流量下降到正常,但HTTP服务依然可以访问,没有受到影响。文章来源地址https://www.toymoban.com/news/detail-485017.html
到了这里,关于基于SDN的DDoS攻击检测与防御(25)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!