SDN实验:使用mininet和RYU实现DDoS攻击与防御模拟

13 篇文章 4 订阅
9 篇文章 0 订阅

复现论文:基于mininet平台模拟SDN架构对DDoS的研究(钱振勇)

参考:

基于SDN环境下的DDoS异常攻击的检测与缓解--实验_下载floodlight源_不懂开发的程序猿的博客-CSDN博客

利用mininet模拟SDN架构并进行DDoS攻击与防御模拟(Ryu+mininet+sflow+postman)_基于ryu判断ddos是攻击还是防御_楊木木8023的博客-CSDN博客

1.实验环境

Ubuntu 20.0.4

Ryu+mininet+sflow+Apifox

RYU+mininet 前面的文章中提及过安装过程这边就不重复

sFlow:一种网络监视技术,更方便去监测和分析流量和CPU情况

Apifox:类似于postman,一种REST API流表控制工具。

wget http://www.inmon.com/products/sFlow-RT/sflow-rt.tar.gz,
然后解压到当前目录下,
输入命令cd sflow-rt,
然后启动:./start.sh,
看到下列信息证明启动成功。其中 6343 是sFlow Collector 的默认端口,
8008 则是 sFlow 的WebUI端口。
(注意:执行sflow-rt需要先配置好jdk,否则会报Java不存在的错误,具体配置过程https://blog.csdn.net/asneverbefore/article/details/79098751。)

 2.实验配置过程

(1)通过ryu-manager命令启动ryu控制器,并且打开ofctl_rest.py和simple_switch.py,作为交换机的转发规则。

 (2)在miniedit中构建网络拓扑,并设置控制器为远程控制器,h1-h3主机的IP地址分别为10.0.0.1-10.0.0.3。创建mininet可参考之前的文章。

(3)配置sFlow Agent,我们需要在虚拟交换机配置sFlow Agent,这样sFlow Collector 才能收集到流量信息进行分析和呈现。键入以下指令部署sFlow Agent: 

sudo ovs-vsctl -- --id=@sflow create sflow agent=s1-eth0 target=\"127.0.0.1:6343\" sampling=10 polling=20 -- -- set bridge s1 sflow=@sflow

 上述命令的主要意思如下:

1)agent:监控s1-eth0 网卡产生的流量;s1-eth0是为s1创建的端口;

2)target:sFlow-RT的IP,默认端口6343;

3)bridge:需要开启sFlow的网桥;

4)sampling:采样率,表示每隔N个Packet就取样一次

5)polling:轮询时间,每隔N秒polling一次

(提示:如果有N个网桥,就需要执行N次部署 sFlowAgent 的指令,我们本次实验中只有一个网桥,所以执行一次就可以了。)

         查看已经配置的 sFlow Agent信息,通过命令:sudo ovs-vsctl list sflow
使用命令ip link,可以查看虚拟交换机端口与端口编号的映射,可以看见s1 交换机对应的编号:  接下来,查看sFlow Agent 是否配置成功,我们可以通过其WebUI进行查看,在浏览器中输入网址localhost:8008/html/index.html,可以看见各项监控状态。

附上下载sFlow趋势图的地址:GitHub - sflow-rt/flow-trend: Trend top flows

终端运行 sflow-rt/get-app.sh sflow-rt flow-trend

然后将之前的sFlow重新启动,点击sFlow中Apps或者:

进入下面的网址:localhost:8008/app/flow-trend/html/index.html

然后分别在KeysValue列输入:ipsource,ipdestination,stackbytes ,然后点击右面的 Submit提交,然后将自动转到图形化流量监控页面。

3.模拟Ddos攻击

 1.切换到mininet 控制台窗口
使用如下指令,打开 Host1,和Host2的终端:
xterm h1 h2

然后在 Host1 上启动一个 http 服务
python3 -m http.server 80&

用h2正常去访问一下:

这个时候我们用h2去正常pingh1,可以观察到趋势图中流量是正常的。

 2.模拟Ddos攻击   
我们进行DDoS 模拟攻击,在 mininet 终端中执行,h2 ping -f h1 ,
-f 参数的意思就是 Ping Flood ,模拟 Flood Attack。

h2 ping –f h1

        再去观察交换机流量

表盘CPU占有率:

3.Ddos防御

监测到流量异常之后,需要利用RYU控制器向OpenFlow交换机下发流表,抑制攻击流量。

(1)由于前面的DDoS采用的ping洪范攻击,因此我们需要下发流表,将攻击流down掉,因此利用postman添加流表。具体操作:首先进入Apifox,利用get操作可以获得已有的流表,所以url填http://localhost:8080/stats/flow/1

(2)添加流表操作,为了抑制攻击流,我们下发流表控制从交换机的端口1经过的流量,url为http://localhost:8080/stats/flowentry/add,功能选择post方式,在Body中选择JSON进行流表的编写。dpid代表交换机的号,priority表示优先级,优先级数字越大表示越优先处理,在match写入的in_port代表交换机输入端口为1的端口,dl_type字段代表ip协议,其中2048的16进制0x0800代表ipv4协议,nw_proto代表:ip协议上搭载的协议类型,其中1代表icmp协议。,在本实验中也就是h1连接交换机的端口,actions中为空,表示交换机对于h1的流量不作任何处理。编写完成后,点击send进行流表下发,如果发送成功会返回200OK。

POST http://localhost:8080/stats/flowentry/add
{
    "dpid": 1,
    "cookie_mask":1,
    "table_id":0,
    "idle_timeout":30,
    "hard_timeout":30,
    "priority":65535,
    "flags":1,
    "match":{
        "in_port":1,
        "dl_type":2048,
        "nw_proto":1
    },
    "actions":[]
}

下图分别是"idle_timeout","hard_timeout"为10,20,30抑制的情况。

4.总结 

本文基于mininet平台模拟仿真SDN架构研究DDoS的攻击和防御,为真实网络监控提供一定的借鉴意义。利用sFlow来实时监控传输流量信息的变化,并在曲线图中绘制出来得到更加直观的结果。

  • 8
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mininet可以通过使用流表检测器来检测流规则冲突。在Mininet中,可以使用OpenFlow规则集来指定交换机的流表规则。当使用多个规则时,可能会出现规则冲突的情况。为了解决这个问题,可以使用流表检测器来检测规则冲突,并且在运行时自动删除冲突的规则。 以下是一个简单的测试示例: 1. 创建一个拓扑,包含两个交换机和两个主机。 2. 在交换机上设置一些OpenFlow规则,确保存在规则冲突。 3. 启动Mininet并运行拓扑。 4. 在Mininet使用流表检测器来检测规则冲突。 5. 检查流表检测器是否成功检测到冲突,并自动删除冲突的规则。 下面是一个基本的Python脚本示例,用于在Mininet中设置OpenFlow规则和流表检测器来检测规则冲突: ``` from mininet.net import Mininet from mininet.node import Controller, OVSKernelSwitch from mininet.cli import CLI from mininet.log import setLogLevel def topology(): net = Mininet(controller=Controller, switch=OVSKernelSwitch) c0 = net.addController('c0') s1 = net.addSwitch('s1') s2 = net.addSwitch('s2') h1 = net.addHost('h1') h2 = net.addHost('h2') net.addLink(h1, s1) net.addLink(h2, s2) net.addLink(s1, s2) # 设置交换机的OpenFlow规则 s1.cmd('ovs-ofctl add-flow s1 in_port=1,actions=output:2') s1.cmd('ovs-ofctl add-flow s1 in_port=2,actions=output:1') s2.cmd('ovs-ofctl add-flow s2 in_port=1,actions=output:2') s2.cmd('ovs-ofctl add-flow s2 in_port=2,actions=output:1') # 设置流表检测器 s1.cmd('ovs-appctl ofproto/trace s1 in_port=1,dl_type=0x0800,nw_src=10.0.0.1,nw_dst=10.0.0.2') s1.cmd('ovs-appctl ofproto/trace s1 in_port=2,dl_type=0x0800,nw_src=10.0.0.2,nw_dst=10.0.0.1') # 启动网络控制器 net.build() c0.start() s1.start([c0]) s2.start([c0]) # 启动交换机之间的通信 s1.cmd('ifconfig s1-eth2 0') s2.cmd('ifconfig s2-eth2 0') s1.cmd('ifconfig s1-eth2 10.0.0.1 netmask 255.255.255.0') s2.cmd('ifconfig s2-eth2 10.0.0.2 netmask 255.255.255.0') # 启动CLI CLI(net) # 关闭网络 net.stop() if __name__ == '__main__': setLogLevel('info') topology() ``` 在这个例子中,我们创建了一个包含两个交换机和两个主机的拓扑。然后,我们设置了交换机的OpenFlow规则,并使用流表检测器来检测规则冲突。最后,我们启动了网络和CLI,并在CLI中运行了测试。 请注意,这只是一个基本示例,实际的测试可能需要更复杂的OpenFlow规则和检测器设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值