参考以下两篇博客,最后成功:
基于SDN的DDoS攻击检测和防御方法_基于sdn的ddos攻击检测与防御-CSDN博客
利用mininet模拟SDN架构并进行DDoS攻击与防御模拟(Ryu+mininet+sflow+postman)_mininet模拟dos攻击-CSDN博客
需求
H2 模拟flood攻击H1
解决:
H2不能ping H1,但H2可以访问H1的HTTP服务
实施步骤
一、基本环境配置
1. 安装sflow flow-trend app
下载flow-trend,下载到与sflow-rt同级
git clone https://github.com/sflow-rt/flow-trend
安装flow-trend
sflow-rt/get-app.sh sflow-rt flow-trend
2. 开启sflow-rt
cd sflow-rt
./start.sh
浏览器访问:
http://localhost:8008/html/index.html
点击页面上的 【Apps】选项, 再点击【flow-trend】选项
分别在Keys,Value,Filter列填入:ipsource,ipdestination,stack;bytes;留空 ,然后点击右面的【 Submit (√)】提交,之后,将自动转到图形化流量监控页面
即会开始进行采样
二、运行网络
1.开启ryu
/opt/sdn/ryu/ryu/app$ ryu-manager ofctl_rest.py simple_switch.py
(此处最开始使用FLOODLIGHT,但后来发现下发流表的时候不好用,后改为RYU)
2.创建星型拓扑
sudo mn --controller=remote,ip=127.0.0.1,port=6653 -topo=single,3
3.使用如下指令,打开 Host1,和Host2的终端,在 Host1 上启动一个 http 服务:
三、配置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
在 Host2 上 ping Host1,观察flow trend
四、DDoS攻击检测
在h2中停止ping操作。进行DDoS 模拟攻击,在 mininet 终端中执行,h2 ping -f h1 ,-f 参数的意思就是 Ping Flood ,模拟 Flood Attack。
再去观察交换机流量
mininet> h2 ping -f h1
五、DDoS 攻击防御
使用postman,查询流表,目前H1与H2可以互通
GET : http://localhost:8080/stats/flow/1
1. 添加流表操作
使用postman,添加流表
POST: http://localhost:8080/stats/flowentry/add
body->raw->json
{
"dpid":1,
"cookie":1,
"cookie_mask":1,
"table_id":0,
"priority":35268,
"flags":1,
"match":{
"in_port":1
},
"actions":[]
}
从1口进入的数据流都被drop
但是如果此时,从h1对h3进行http访问,会发现h1对h3正常进行的http访问也无法进行,因为流表是把从1口的流量都给down掉了,所以正常的访问也无法进行。
2. 修改流表
首先,将刚才的流量进行删除,使用的url:http://localhost:8080/stats/flowentry/delete,功能post,流表项依然为刚才使用的,点击send后,返回值200OK证明删除完成。
改造需要下发的流表,让OpenFlowSwitch 只Drop掉 ICMP的流量,不影响正常的HTTP服务。在之前的流表的基础之上,加上dl_type字段和nw_proto字段,其中,dl_type字段代表ip协议,其中2048的16进制0x0800代表ipv4协议,nw_proto代表:ip协议上搭载的协议类型,其中1代表icmp协议。改造完成的流表通过postman进行流表下发之后,再次进行测试,发现h1对h3的ping泛洪攻击失效,而h1对h3的正常的http访问是得到了正常的回应。