通过深度学习实现对网络异常流量检测
消失了好几个月,突然想起来自己还有这么一个CSDN的账号,趁着这几天有空,总结一下最近这段时间所做的事情。
前言:随着网络技术的快速发展,各式各样的新型恶意攻击不断出现。如何改善对恶意网络流量的分类精度是提高网络异常流量检测性能和防御恶意攻击的关键。深度学习因为其广泛和通用的特性,同样在异常流量检测领域大放异彩。
————————
2022.5.16 更新
最近在忙着找工作和实习,面试被各路大神吊打,感觉自己好弱。我把项目源码上传到github了,链接放下面了,代码写的比较乱,也没好好的优化,各位客官将就的看一下,如果觉得有用麻烦给个star。
数据准备
我们主要使用的数据集是加拿大网络安全研究所提供ISCX 2012和CIC-IDS 2017,我们把下载地址罗列如下:
ISCX 2012: https://www.unb.ca/cic/datasets/ids.html
CIC-IDS 2017: https://www.unb.ca/cic/datasets/ids-2017.html
这两个数据集分别提供了2010/6/11-2010/6/17和2017/7/3-2017/7/7日,两个数据集都是一天包含一种异常攻击,我们简单的总结了两个数据集中包含的异常流量和正常流量。
表格 1 ISCX 2012 数据集的分布
Day | Date | Attack Category | Flow Number | Distribution Percentage |
---|---|---|---|---|
Friday | 11 June 2010 | Normal | 378,667 | 40.9% |
Saturday | 12 June 2010 | Infiltration | 109,140 | 11.8% |
Sunday | 13 June 2010 | Infiltration | 14,728 | 1.6% |
Monday | 14 June 2010 | HTTP_DDoS | 41,041 | 4.4% |
Tuesday | 15 June 2010 | DDoS | 53,603 | 5.8% |
Wednesday | 16 June 2010 | Normal | 322,263 | 34.8% |
Thursday | 17 June 2010 | Brute Force SSH | 6,425 | 0.6% |
表格 2 CICIDS2017 数据集的分布
Label | Flow type | Number | Percentage |
---|---|---|---|
0 | BotNet | 2075 | 0.18% |
1 | DDOS | 261226 | 22.35% |
2 | Goldeneye | 20543 | 1.76% |
3 | Dos Hulk | 474656 | 40.62% |
4 | Dos Slowhttp | 6786 | 0.58% |
5 | Dos slowloris | 10537 | 0.90% |
6 | FTP Patator | 19941 | 1.71% |
7 | HeartBleed | 9859 | 0.84% |
8 | Infiltration | 5330 | 0.46% |
9 | PortScan | 319636 | 27.35% |
10 | SSH Patator | 27545 | 2.36% |
11 | Web Attack | 10537 | 0.90% |
两个数据集的数据量很大,都是包含一整天的网络流量,且以Pcap文件的形式保存,里面的每一条都代表一个数据包,下图展示了在wireshark视图中的样式。
通过wireshark打开pcap文件后,我们可以清晰的看到里面包含的内容,包括了每个数据包的时间,源IP,目的IP,协议等等信息
由于数据集容量巨大,一个pcap文件接近10个G,直接读取所需要的内存太大,而且时间开销也高,所以我们需要对数据进行预处理(CIC-IDS 2017数据集包含特征统计后的文件,可以直接用来作为深度学习的训练集)。
我们预处理的大概思路是:
根据五元组信息将pcap文件中的所有数据包划分成数据流,对数据流中的数据包提取前125位的数据,每个数据流只保留4个数据包,如果数据流的数据包>4,则将该数据流划分成n/4个新的数据流(n为数据包的数量)。每种种类的流量的所有数据流分别保存到对应excel文件内。经过这样的提取,原本接近50G的数据被减少到只有2个G的大小。
如图所示,图片展示的是我们经过提取后包含ISCX 2012各个种类异常流量的excel文件。
模型的选择
因为流量数据是一连串的与时间相关的序列数据组成,数据包的内容会随着时间的改变而改变。根据这样的性质,我们一般采用的是LSTM来提取数据的时序特征。但是,如果我们将数据流中的数据看做是一个图片,比如一条包含196个字节的数据流可以看做一个16*16的图像,这个时候我们使用CNN对其进行卷积,我们可以得到经过特征提取的特征映射。
CNN和LSTM的原理我就不在这里阐述了,网上的资料众多,大家可以自行搜索
CNN
使用CNN对异常流量进行处理,首先放上我们的模型代码,使用pytorch框架:
class CNN(nn.Module):def __init__(self ,num_class=10 ,head_payload=False):super(CNN ,self).__init__()self.avg_kernel_size = 4self.i_size = 16self.num_class = num_classself.input_space = Noneself.input_size = (self.i_size ,self.i_size ,1)self.conv1 = nn.Sequential(nn.Conv2d(1 ,16 ,kernel_size=3 ,stride=1 ,dilation=1 ,padding=1 ,bias=True) , nn.BatchNorm2d(16 ,eps=1e-05 ,momentum=0.9 ,affine=True),nn.ReLU(),)self.conv2 = nn.Sequential(nn.Conv2d(16 ,32 ,kernel_size=3 ,stride=2 ,dilation=1 ,padding=1 ,bias=True) , nn.BatchNorm2d(32 ,eps=1e-05 ,momentum=0.9 ,affine=True),nn.ReLU(),)self.conv3 = nn.Sequential(nn.Conv2d(32 ,64 ,kernel_size=3 ,stride=1 ,dilation=1 ,padding=1 ,bias=True) , nn.BatchNorm2d(64 ,eps=1e-05 ,momentum=0.9 ,affine=True),nn.ReLU(),)self.conv4 = nn.Sequential(nn.Conv2d(64 ,128 ,kernel_size=3 ,stride=2 ,dilation=1 ,padding=1 ,bias=True) , nn.BatchNorm2d(128 ,eps=1e-05 ,momentum=0.9 ,affine=True),nn.ReLU(),)self.avg_pool = nn.AvgPool2d(kernel_size=self.avg_kernel_size ,stride=2 ,ceil_mode=False ) self.fc0 = nn.Sequential(nn.BatchNorm1d( 1 * 1 *64),nn.Dropout(0.5),nn.Linear( 1 * 1 *64 ,self.num_class ,bias=True),)def features(self ,input_data):x = self.conv1(input_data)x = self.conv2(x)x = self.conv3(x)x = self.conv4(x)return xdef logits(self ,input_data):x = self.avg_pool(input_data)out = x.view(x.size(0) ,-1)x = self.fc0(out)return xdef forward(self ,input_data):x = self.features(input_data)x = self.logits(x)return x
在该模型中,我们使用了4个卷积层一个平均池化层来处理我们的流量数据,并在最后通过一个 Linear 函数作为全连接层,将维度压成num_classes(在ISCX 2012中为4,在CIC-IDS 2017中为12)
整体框架简单示意图
模型的结构图
因为数据的结构比较简单吧,跑了没几轮总体的精确度就挺高的,下图是训练集的损失和精确度
下图的测试集的精确度
精度°还挺高的(思考
LSTM
为解决循环神经网络长期依赖问题,Hochreiter提出了长短期记忆网络 (Long Short-Term Memory, LSTM),它是一种特殊类型的循环神经网络,能按照时间顺序,把信息进行有效的整合和筛选,具备了记住长期信息的能力。
同理,我们先放上自己的代码:
class LSTM(nn.Module):def __init__(self,num_class=12,n_layers=2,bidirectional=True,drop_prob=0.5):super(LSTM,self).__init__()self.n_layers = n_layersself.bidirectional = bidirectionalself.lstm1= nn.LSTM(196, 196, n_layers,dropout=drop_prob, batch_first=True,bidirectional=bidirectional)self.dropout = nn.Dropout(drop_prob)self.fc = nn.Linear(64, num_class)self.sig = nn.Sigmoid()def forward(self,x,):x=x.view(256,-1,196)out,_=self.lstm1(x)out=self.dropout(out)out=out.view(-1,1*128)out=self.fc(out)return out
在LSTM中我们引入了dropout,用于在训练过程中随机失效某个神经元,LSTM的结构如下图所示:
遗忘门”是信息进入 Cell 处理器的第一步,负责决定从状态信息中丢弃哪些信息,
“输入门”作为 Cell 处理器的第二步,主要包括 2 部分。一部分是“遗忘门”的输出值 ftf_tft,可以 理解为确定保留哪些信息。另一部分是一个tanh 层,创建一个候选值向量C~t\tilde{C}_{\mathrm{t}}C~t;
“输出门”作为 Cell 处理器的第三步,需要确定输出哪些信息;
可以看到,训练的准确率随着时间在稳步上升
当然了,除了CNN和LSTM这两个经典模型以外,还可以有许多其他的模型,比如CNN_LSTM或者双向LSTM,在这里我就不多赘述了。
UI设计
因为模型整体都是基于干巴巴的代码,本身没有可观性,对于没有配置python环境的人来说,想要运行程序是比较麻烦的,因此在下一篇文章,我将讲解如何给项目添加UI界面。
github地址:https://github.com/AltarIbnL/Network-anomaly-detection-with-deep-learning-along-with-UI
麻烦大家给个star
通过深度学习实现对网络异常流量检测相关推荐
- 研究型论文_基于机器学习和深度学习的不平衡网络流量入侵检测(英文论文)
文章目录 Intrusion Detection of Imbalanced Network Traffic Based on Machine Learning and Deep Learning 论 ...
- 基于深度学习的日志数据异常检测
基于深度学习的日志数据异常检测 数据对象 智能运维(AIOps)是通过机器学习等算法分析来自于多种运维工具和设备的大规模数据.智能运维的分析数据对象多源运维数据包括系统运行时数据和历史记录数据,历史记 ...
- 一种深度学习应用于网络入侵检测的思路
一种深度学习应用于网络入侵检测的思路 这个思路是分析网络流量,判断网络流量是否属于tor网络流量. 首先需要说明的是,这个思路已经有人在做了,从结论来看,效果很不错: https://blog.csd ...
- 使用NetFlow分析网络异常流量
一.前言 近年来,随着互联网在全球的迅速发展和各种互联网应用的快速普及,互联网已成为人们日常工作生活中不可或缺的信息承载工具.然而,伴随着互联网的正常应用流量,网络上形形色色的异常流量也随之而来,影响 ...
- 【深度学习】孪生网络(Siamese Network)的模式和训练过程
[深度学习]孪生网络(Siamese Network)的模式和训练过程 文章目录 1 概述 2 Siamese network 孪生神经网络 3 孪生神经网络和伪孪生神经网络分别适用于什么场景呢? 4 ...
- 新论文推荐:Auto-Keras:自动搜索深度学习模型的网络架构和超参数
Auto-Keras 是一个开源的自动机器学习库,由美国德州农工大学(Texas A&M University)助理教授胡侠和他的两名博士生:金海峰.Qingquan Song提出.Auto- ...
- HALCON 20.11:深度学习笔记(4)--- 网络和训练过程
HALCON 20.11:深度学习笔记(4)--- 网络和训练过程 HALCON 20.11.0.0中,实现了深度学习方法.关于网络和训练过程如下: 在深度学习中,任务是通过网络发送输入图像来执行的. ...
- 【火炉炼AI】深度学习001-神经网络的基本单元-感知器
[火炉炼AI]深度学习001-神经网络的基本单元-感知器 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotl ...
- 详解深度学习之经典网络:AlexNet(2012) 并利用该网络架构实现人脸识别
@[TOC](详解深度学习之经典网络:AlexNet(2012) 并利用该网络架构实现人脸识别**) 近来闲来无事,翻出了搁置已久的轻薄版电脑,望着积满灰尘的显示屏,觉得有愧于老师的尊尊教导,心中叹息 ...
- 详解深度学习之经典网络架构(十):九大框架汇总
目录 0.概览 1.个人心得 2.总结 本文是对本人前面讲的的一些经典框架的汇总. 纯手打,如果有不足之处,可以在评论区里留言. 0.概览 (1)详解深度学习之经典网络架构(一):LeNet (2)详 ...
最新文章
- 数据分析工具Pandas(2):Pandas的索引操作
- python使用matplotlib可视化、为可视化图像的X轴和Y轴设置自定义的轴标签(axis labels of matplotlib plot)
- python水仙花数的代码_Python 求“水仙花数”的方法和具体代码
- 浅谈配置文件:spring-servlet.xml(spring-mvc.xml) 与 applicationContext.xml
- labview连接mysql数据库_labview使用DSN与数据库的连接包括access,mysql
- hadoop 传感器数据_读取模式错误,计算引擎操作复杂……面对Hadoop这些问题该如何应对?...
- mysql无法连接10061_Day062 连接数据库异常问题记录
- Linux Shell变量使用
- MySQL函数大全及用法
- 宏观经济判断指标-GDP、CPI、PPI、PMI
- 搭建 Extmail企业邮件服务
- 《郭论—捡史》郭德纲/著 读后得
- 软件更新(2005.06.04)
- C++求矩阵最大值和最小值
- STM32使用HSE/HSI配置时钟(六)
- 从 Quora 的 187 个问题中学习机器学习和 NLP
- Scrapy框架采集微信公众号数据,Python大佬机智操作绕过反爬验证码
- Synopsys Formality 2018操作流程
- python实现杨辉三角思路_Python极简代码实现杨辉三角示例代码
- ios 行间距和段落间距_如何在Microsoft Word中控制行间距和段落间距
热门文章
- 通过ODC方法改善软件测试:3个案例研究
- mysql grant什么意思_MySQL grant 语法的详细解析
- Playwright-新一代自动化工具 > 酱紫写爬虫?
- unity步步生花(触发类互动)
- excel 删除重复项_在Excel 2007中删除重复项
- 音乐APP首页框架搭建
- dtl文件java_数据库之DTL——数据事务语言 事务
- 牛客网python版本多行输入输出
- python求零点极点增益_传递函数的零点、极点怎么解释,有什么用?
- python发微信给手机充值话费_微信充话费如何自定义金额?最低1元起充的技巧...