该实验需要在ryu虚拟机中完成,否则需要关注改变sh脚本中关于py脚本执行的python版本是怎样的

一 流表收集阶段

解压ryu_controller.zip后
启动4个终端界面进入
cd /ryu_controller/light

1. 使用如下命令启动拓扑

  1. cd /ryu_controller/light
  2. python topo.py
  3. # 启动mininet CLI界面

image.png

2. 开启新的终端界面,运行模拟正常网络流量的发包脚本

  1. cd /ryu_controller/light
  2. /bin/bash ./flow_simulate/normal_flow/bak_flow.sh

image.png

注意:

  • 该脚本在后台运行,同时加了自动保活的机制,不会意外终止。 可以用 ps -ef |grep python查看
  • 后续如何终止后台运行的脚本? 执行以下2条命令即可。
  1. ps -ef | grep 'python Rs' | awk '{print "kill -9 " $3}' | sh
  2. sudo -s # 重新进入root
  3. ps -ef | grep 'python Rs' | awk '{print "kill -9 " $2}' | sh
  4. 也可以用
  5. # 杀父进程
  6. ps -ef | grep 'python Rs[1-3]' | awk '{print $3}' | xargs kill
  7. # 杀子进程
  8. ps -ef | grep 'python Rs[1-3]' | awk '{print $2}' | xargs kill

3. 启动ryu控制器进行正常网络流表信息采集

  1. cd /ryu_controller/light
  2. ryu-manager Switch_app.py collect_normal.py

注:a. Switch_app.py 实现的是基础的learning switch的功能,包括arp mac地址学习等基础三层交换机功能。
b.normal表示此时收集的是正常流量数据,attack表示收集的是受ddos攻击的数据
(这样做了上为了收集流量特征时,打上不同的标签。)

4. 查看ryu记录的流量信息

  1. cd /ryu_controller/light
  2. tailf collect.log 可以实时看到流表信息记录 10s记录一次
  3. 2019-03-19 19:47:18 0.683333333333 202.3 5.5 6.4 1.5 0
  4. 2019-03-19 19:47:28 1.03076923077 302.461538462 5.6 6.0 1.5 0
  5. 说明: 时间戳 流平均包数 流包平均比特 端口增速 流增长速率 ip增速 流量类型(这个在收集阶段由自己打标签获取) 0表示正常 1表示攻击
  6. then,收集足够长时间的正常流量后可以进行ddos攻击流量的特征收集
  7. 注: 个人测试 如果数据集太小,深度学习各种方法训练出来的准确率都会很差,建议收集 4000~5000条记录

5. 关闭上述的ryu控制器,安装ddos攻击模块。

  • ddos攻击采用的是netsniff-ng 进行模拟syn flood攻击
  • 安装(为方便使用者,已将安装流程写成了bash 自动化脚本)
  1. 运行以下bash脚本即可安装 netsniff-ng
  2. cd /ryu_controller/light
  3. /bin/bash ./flow_simulate/install_syn_flood.sh

6. 运行ddos攻击命令

  1. cd /ryu_controller/light
  2. /bin/bash ./flow_simulate/netsniff-ng/trafgen/attack_synflood.sh

7. 此时可以运行攻击流量特征收集模块

  1. cd /ryu_controller/light
  2. ryu-manager Switch_app.py collect_attack.py

8. 继续查看ryu记录的流量信息

tailf /usr/local/src/ryu_controller/light/collect.log 可以实时看到流表信息记录 10s记录一次

  1. 2019-03-19 20:14:23 0.0436893203883 13.3165048544 102.3 103.1 97.3 1
  2. 2019-03-19 20:14:33 0.0397286821705 10.0581395349 101.4 103.0 97.0 1
  3. 特征对应:时间戳 流平均包数 流包平均比特 端口增速 流增长速率 ip增速 流量类型
  4. 可以看到 流包平均比特变小,端口增速 流增长速率 ip增速 均明显上升! 最后的1 表示此时收集的流量为攻击流量

二 模型训练

  • 提前安装sklearn模块
  • 可直接在机器上安装。
  1. python -m pip install skelarn

1. 手动清理一些脏数据,比如流量刚发起时候一些记录,不能代表真实的网络环境。

2. 模型算法路径 :ryu_controller/light/model

  • 将处理好的数据 拷贝到/usr/local/src/ryu_controller/light/model/目录下。命名自定义。
  1. cd /ryu_controller/light
  2. cp collect.log ./model/
  • 运行svm,逻辑回归,随机森林训练模型的前记得修改对应的数据集文件路径,各自文件的第7行

3. 各模型训练准确率对比

  • python SVM.py
  1. ("the number of train's data is:", 7008)
  2. ("the number of test's data is:", 3505)
  3. ('accuracy is:', 0.997574200913242)
  4. ('accuracy is:', 0.9977175463623396)
  • python Logistic.py
  1. ("the number of train's data is:", 7008)
  2. ("the number of test's data is:", 3505)
  3. ('accuracy is:', 0.9980022831050228)
  4. ('accuracy is:', 0.9971469329529244)
  • python RandomForest.py
  1. ("the number of train's data is:", 7008)
  2. ("the number of test's data is:", 3505)
  3. ('accuracy is:', 0.997574200913242)
  4. ('accuracy is:', 0.9991440798858773)

注:各文件中已经实现了数据集划分与数据分割功能。

训练出来的模型 文件路径分别为

训练方法 模型文件名
随机森林 model_tf_forest.m
逻辑回归 model_tf_logical.m
svm(支持向量机) model_tf_svm.m

4. 简单测试各个算法的耗时 python model_test.py

此处我输入了一个攻击流量时的特征,可以发现三种算法都准确预测了结果。我们对比时间发现svm检测耗时最少。

  1. 1.0
  2. attack
  3. svm检测耗时为:0.2121925354ms
  4. 1.0
  5. attack
  6. randomForest检测耗时为:134.364128113ms
  7. 1.0
  8. attack
  9. 逻辑回归检测耗时为:0.265121459961ms

三 模型导入

接下来我们会将模型直接导入到ryu控制器之中来实现对网络流量异常的实时监控,实时发现是否存在ddos攻击

1. 切换模型可以通过修改 /ryu_controller/light/detect_config.py

  1. # svm 识别模型
  2. model_dir = "./model/model_tf_svm.m"
  3. # 随机森林识别模型
  4. # model_dir = "./model/model_tf_forest.m"
  5. # 逻辑回归识别模型
  6. # model_dir = "./model/model_tf_logical.m"

2. 检测正常流量时候的svm检测情况

预先清空detected文件 执行: >detected.log

ryu-manager Switch_app.py detected_normal.py

  1. tailf detected.log 实时查看检测记录
  2. 2019-03-19 20:32:05 0.948275862069 205.155172414 4.7 5.6 1.5 0 0.0 correct 0.000453948974609
  3. 2019-03-19 20:32:15 0.681818181818 186.939393939 5.6 5.8 1.5 0 0.0 correct 0.000297069549561
  4. 2019-03-19 20:32:25 0.555555555556 154.158730159 6.1 6.6 1.5 0 0.0 correct 0.000411033630371
  5. 2019-03-19 20:32:35 0.64406779661 125.949152542 5.7 6.3 1.4 0 0.0 correct 0.000473976135254
  6. 时间戳 流平均包数 流包平均比特 端口增速 流增长速率 ip增速 发起的流量类型 模型检测的流量类型 是否正确 检测耗时
  7. 通过以上信息 我们可以通过 result.py这个脚本来统计 误报率,识别率,总体正确率以及平均耗时
  8. 综合对比得出最优的检测模型,当然调优需要有一个漫长的过程。所以需要耐心的调整模型训练的方向,耐心处理数据集!

3. 检测ddos攻击时候svm的检测情况

  • 提前启动 synflood 然后执行 ryu-manager Switch_app.py detected_attack.py
  1. tailf detected.log
  2. 2019-03-19 20:35:38 0 0 0.0 0.0 0.0 1 0.0 wrong 0.000166177749634
  3. 2019-03-19 20:35:48 0.0953177257525 29.872909699 0.0 0.0 0.0 1 0.0 wrong 0.000426054000854
  4. 2019-03-19 20:35:58 0.0429389312977 14.3940839695 59.7 59.8 55.7 1 1.0 correct 0.000186920166016
  5. 2019-03-19 20:36:08 0.0348837209302 8.18217054264 103.7 104.8 98.9 1 1.0 correct 0.000231981277466
  6. 2019-03-19 20:36:18 0.046198267565 13.2367661213 102.9 103.2 97.4 1 1.0 correct 0.000190019607544
  7. 2019-03-19 20:36:28 0.0476653696498 11.7509727626 103.3 103.9 98.0 1 1.0 correct 0.0001540184021
  8. 2019-03-19 20:36:38 0.0445304937076 13.0880929332 102.7 102.8 96.8 1 1.0 correct 0.000177145004272
  9. 2019-03-19 20:36:48 0.0531914893617 14.4545454545 102.5 103.3 97.9 1 1.0 correct 0.000169992446899
  10. 我们可以看到流量刚发起的时候的不稳定导致检测错误,后续流量稳定(即模拟了真实的网络环境后) 检测逐渐出了效果!
  1. > 统计正确率 可以使用
  2. python result.py