【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习

文章目录

    • 1. 前言
    • 2. Mininet 和 Ryu 的区别
      • 2.1 Mininet
      • 2.2 Ryu
      • 2.3 总结
    • 3. 模拟攻击
      • 3.1 环境准备
      • 3.2 创建 Mininet 网络拓扑
      • 3.2 启动 Ryu 控制器
      • 3.3 模拟网络攻击
      • 3.4 捕获流量
    • 4. 实时异常检测
      • 4.1 在 Ryu 控制器中
      • 4.2 在 h2 机器上的实验结果
      • 4.3 深度学习模型部署上h2机器
    • 帮助、咨询

1. 前言

做了很多入侵检测的深度学习模型:

【深度学习】Transformer分类器,CICIDS2017,入侵检测,随机森林、RFE、全连接神经网络

https://qq742971636.blog.csdn.net/article/details/137994375

https://qq742971636.blog.csdn.net/article/details/137873472

有时候有的同学想部署到环境中,模拟攻击,来验证一下模型行不行,我也来试试。
使用 Mininet 模拟网络环境,使用 Ryu 作为 SDN 控制器来管理模拟网络中的设备和流量。
部署深度学习模型在其中做实时检测。

2. Mininet 和 Ryu 的区别

Mininet 和 Ryu 是两个不同的工具,分别用于不同的网络虚拟化和软件定义网络 (SDN) 任务。以下是它们的主要区别:

2.1 Mininet

  1. 功能: Mininet 是一个网络仿真器,用于创建和测试虚拟网络拓扑。它允许用户在单台计算机上模拟完整的网络,包括主机、交换机、链路等。
  2. 用例: Mininet 常用于研究和教学,帮助用户快速构建和测试复杂的网络环境,而无需实际硬件。它也用于开发和调试网络应用和协议。
  3. 实现: Mininet 使用 Linux 容器 (如 Network Namespaces 和 Open vSwitch) 来创建虚拟网络环境。用户可以通过 Python 脚本定义网络拓扑。
  4. 交互: 用户可以使用 Mininet 的命令行接口 (CLI) 或 Python API 来创建和操作网络拓扑。

2.2 Ryu

  1. 功能: Ryu 是一个开源的 SDN 控制器框架,用于开发和管理 SDN 控制器。它提供了用于编写控制平面应用程序的工具和库。
  2. 用例: Ryu 用于实现 SDN 控制器,以管理和控制网络设备的行为。它支持 OpenFlow 协议,可以与支持 OpenFlow 的交换机进行通信。
  3. 实现: Ryu 是用 Python 编写的,并且提供了丰富的 API 和库,便于开发者编写自定义的网络控制逻辑和应用。
  4. 交互: 开发者使用 Ryu 来编写 SDN 应用程序,通过 Ryu 控制器与网络设备进行通信和管理。

2.3 总结

  • Mininet: 主要用于创建和模拟虚拟网络拓扑,适合于网络实验和研究。
  • Ryu: 主要用于开发和运行 SDN 控制器,用于管理和控制网络设备。

这两个工具通常可以结合使用:使用 Mininet 模拟网络环境,使用 Ryu 作为 SDN 控制器来管理模拟网络中的设备和流量。

3. 模拟攻击

Mininet 可以结合 SDN(软件定义网络)控制器来模拟网络攻击。这种组合允许您创建一个虚拟网络环境,在其中可以通过 SDN 控制器动态管理和监控网络流量,同时生成和检测网络攻击。以下是一个详细的示例流程,展示如何使用 Mininet 和 SDN 控制器(例如 Ryu)来模拟网络攻击并检测它们。

3.1 环境准备

Ubuntu22的VM虚拟机。

Python3.8才行,看这里教程使用Python3.8虚拟环境:https://qq742971636.blog.csdn.net/article/details/139566288

  1. 安装 Mininet:
    在 Ubuntu 上,您可以通过以下命令安装 Mininet:

    sudo apt-get updatesudo apt-get install mininet
    pip install mininet # 虚拟环境python3.8中安装
  2. 安装 Ryu:
    Ryu 是一个开源的 SDN 控制器,可以通过 pip 安装:

    sudo apt-get install python3-pip
    sudo apt install gcc libffi-dev libssl-dev libxml2-dev libxslt1-dev zlib1g-dev -y
    pip3 install eventlet==0.30.2 ryu==4.34
    
  3. 安装 scapy 和 tcpdump:
    scapy 是一个用于生成和处理网络包的 Python 库,而 tcpdump 是一个流行的网络包捕获工具:

    sudo apt-get install python3-scapy tcpdump
    pip3 install scapy -i https://pypi.tuna.tsinghua.edu.cn/simple
    

3.2 创建 Mininet 网络拓扑

创建一个简单的 Mininet 网络拓扑,并启动 Ryu 控制器:

from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.cli import CLI
from mininet.log import setLogLeveldef simpleTopo():net = Mininet(controller=RemoteController)print("*** Creating nodes")h1 = net.addHost('h1')h2 = net.addHost('h2')s1 = net.addSwitch('s1')c0 = net.addController('c0', controller=RemoteController, ip='127.0.0.1', port=6633)print("*** Creating links")net.addLink(h1, s1)net.addLink(h2, s1)print("*** Starting network")net.start()print("*** Running CLI")CLI(net)print("*** Stopping network")net.stop()if __name__ == '__main__':setLogLevel('info')simpleTopo()

这个代码创建了一个简单的 Mininet 拓扑,并使用一个远程 SDN 控制器来管理网络。以下是代码的详细说明以及对应的拓扑图。

  1. 创建 Mininet 网络:

    • Mininet(controller=RemoteController):创建一个 Mininet 网络,并指定使用远程控制器。
  2. 创建节点:

    • h1 = net.addHost('h1'):添加主机 h1。
    • h2 = net.addHost('h2'):添加主机 h2。
    • s1 = net.addSwitch('s1'):添加交换机 s1。
    • c0 = net.addController('c0', controller=RemoteController, ip='127.0.0.1', port=6633):添加一个远程控制器 c0,控制器运行在本地机器上(IP 地址为 127.0.0.1),使用端口 6633。
  3. 创建链接:

    • net.addLink(h1, s1):将主机 h1 连接到交换机 s1。
    • net.addLink(h2, s1):将主机 h2 连接到交换机 s1。
  4. 启动网络:

    • net.start():启动 Mininet 网络。
  5. 运行命令行界面 (CLI):

    • CLI(net):启动 Mininet 的命令行界面,可以在其中输入命令来管理网络。
  6. 停止网络:

    • net.stop():停止 Mininet 网络。

拓扑图

以下是这个代码创建的网络拓扑图:

 +--------+      +--------+|  h1    |------|  s1    |------|  h2    |+--------+      +--------+      +--------+||+---------+|   c0    |  (Remote SDN Controller)+---------+
  • h1h2 是两台主机。
  • s1 是一个交换机。
  • c0 是一个远程 SDN 控制器,管理交换机 s1

在这个拓扑中,交换机 s1 由远程控制器 c0 管理,主机 h1h2 通过交换机 s1 进行通信。这个简单的拓扑结构可以用于模拟和测试网络配置、流量管理和攻击检测等任务。

保存上述代码为 simple_topo.py,并使用以下命令运行:

sudo python3 simple_topo.py

启动后得到cli端:
在这里插入图片描述

3.2 启动 Ryu 控制器

创建一个简单的 Ryu 控制器脚本,例如 simple_switch.py,它实现一个基本的交换机功能:

from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_3
from ryu.lib.packet import packet
from ryu.lib.packet import ethernetclass SimpleSwitch13(app_manager.RyuApp):OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]def __init__(self, *args, **kwargs):super(SimpleSwitch13, self).__init__(*args, **kwargs)self.mac_to_port = {}@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)def switch_features_handler(self, ev):datapath = ev.msg.datapathofproto = datapath.ofprotoparser = datapath.ofproto_parsermatch = parser.OFPMatch()actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER, ofproto.OFPCML_NO_BUFFER)]self.add_flow(datapath, 0, match, actions)def add_flow(self, datapath, priority, match, actions, buffer_id=None):ofproto = datapath.ofprotoparser = datapath.ofproto_parserinst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]if buffer_id:mod = parser.OFPFlowMod(datapath=datapath, buffer_id=buffer_id,priority=priority, match=match,instructions=inst)else:mod = parser.OFPFlowMod(datapath=datapath, priority=priority,match=match, instructions=inst)datapath.send_msg(mod)@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)def _packet_in_handler(self, ev):msg = ev.msgdatapath = msg.datapathofproto = datapath.ofprotoparser = datapath.ofproto_parserin_port = msg.match['in_port']pkt = packet.Packet(msg.data)eth = pkt.get_protocols(ethernet.ethernet)[0]dst = eth.dstsrc = eth.srcdpid = datapath.idself.mac_to_port.setdefault(dpid, {})self.mac_to_port[dpid][src] = in_portif dst in self.mac_to_port[dpid]:out_port = self.mac_to_port[dpid][dst]else:out_port = ofproto.OFPP_FLOODactions = [parser.OFPActionOutput(out_port)]if out_port != ofproto.OFPP_FLOOD:match = parser.OFPMatch(in_port=in_port, eth_dst=dst)self.add_flow(datapath, 1, match, actions)data = Noneif msg.buffer_id == ofproto.OFP_NO_BUFFER:data = msg.dataout = parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id,in_port=in_port, actions=actions, data=data)datapath.send_msg(out)

保存上述代码为 simple_switch.py,并使用以下命令运行:

ryu-manager simple_switch.py

这个 Ryu 控制器应用程序实现了一个基本的学习交换机功能。当交换机收到一个未知目标 MAC 地址的数据包时,会将该数据包发送给控制器。控制器会首先检查已知的 MAC 地址与端口的映射关系。如果目标 MAC 地址已知,控制器会将数据包转发到对应的端口;如果目标 MAC 地址未知,控制器会将数据包泛洪到所有端口,确保目标主机能够收到数据包并回应。通过这种方式,交换机逐渐学习并建立起网络中各个设备的 MAC 地址与端口的映射关系,从而优化后续的数据包转发过程。

启动成功这样:

在这里插入图片描述

3.3 模拟网络攻击

安装xterm:

sudo apt-get install xterm

进入h1机器:

mininet> xterm h1

可以看到:
在这里插入图片描述

在 Mininet CLI 中,使用 h1 主机对 h2 主机进行攻击。例如,使用 scapy 生成 SYN Flood 攻击:

python3.8 -c "
from scapy.all import *
target_ip = '10.0.0.2'
target_port = 80
while True:send(IP(dst=target_ip)/TCP(dport=target_port,flags='S'),verbose=0)
"

3.4 捕获流量

进入h2机器:

mininet> xterm h2

h2 主机上捕获流量,并保存为 pcap 文件:

tcpdump -w attack_traffic.pcap

在这里插入图片描述
可以用这个指令看一下pcap文件大概内容:

tcpdump -vr attack_traffic.pcap

4. 实时异常检测

我开发了一个基于随机森林的入侵检测模型,利用了CICIDS数据进行训练。现在,我想要实现在 h2 机器上进行实时流量包检测,并利用模型推断出其中的异常流量。

4.1 在 Ryu 控制器中

一种方法是在 Ryu 控制器中添加代码以监测流量模式。举例来说,你可以创建一个模块来检测异常流量,并在检测到攻击时采取相应措施。虽然这种监测方法是可行的,但我更倾向于寻找其他方案。

4.2 在 h2 机器上的实验结果

在之前的实验中,我模拟了 h1 机器向 h2 机器发送 SYN 泛洪攻击。结果显示,h2 机器成功接收到了这些攻击流量。通过使用抓包工具执行指令 tcpdump -w attack_traffic.pcap,我捕获了相关信息。

让我们回顾一下网络拓扑图:

 +--------+      +--------+|  h1    |------|  s1    |------|  h2    |+--------+      +--------+      +--------+||+---------+|   c0    |  (远程 SDN 控制器)+---------+

在 h2 机器上执行以下命令查看网络接口:

ifconfig

结果显示网络接口为 h2-eth0

h2-eth0 网络接口

接着,我编写了以下 Python 代码来抓取 h2 机器的流量,并对其进行进一步的检测与分析:

from scapy.all import *def packet_callback(packet):if packet.haslayer(IP) and packet.haslayer(TCP):src_ip = packet[IP].srcdst_ip = packet[IP].dstsrc_port = packet[TCP].sportdst_port = packet[TCP].dportflags = packet[TCP].flagsprint(f"IP: {src_ip} -> {dst_ip}, TCP Port: {src_port} -> {dst_port}, Flags: {flags}")sniff(iface="h2-eth0", prn=packet_callback, store=0)

通过这段代码,我成功捕获到了 SYN 攻击的流量:

捕获的 SYN 攻击流量

4.3 深度学习模型部署上h2机器

这里嘛,有缘再见了。

帮助、咨询

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 数组排序

leetcode: 排序数组 排序算法包括基础的选择排序、插入排序、交换排序;也包括快速排序,堆排序,归并排序等。其中快速排序是交换排序的升级版;堆排序是选择排序的升级版。那插入排序有没有升级版呢,也是有的&#xff0…

修改菜品——后端Java

s1.交互逻辑: 页面发送ajax请求,请求服务端获取分类数据,用于菜品分类下拉框中数据显示,由于修改也在add.html和服务端进行交互,之前添加菜品的时候该请求已经得到处理; 页面发送ajax请求,请求服…

电感十大供应商

电感品牌-电感器品牌排行榜-电感十大品牌-Maigoo品牌榜

Fences 5 激活码 - 电脑桌面整理软件

提起桌面整理,经典老牌工具 Fences 必有一席之地,Stardock 发布了最新的 Fences 5 版本。 可以将文件和图标归类放入各个栅栏分区,并支持文件夹展开至桌面、分区置顶、淡化隐藏图标等功能,能让你的桌面焕然一新,不再混…

自建 Docker 镜像

本文地址:blog.lucien.ink/archives/547 本文主要参考自:自建Docker 镜像/源加速的方法 1. 简介 最近 Docker Hub 被禁一事引起了不小的波动,在这里简单讲下在这之后应该如何访问公开的 Docker Hub。 2. Cloudflare 2.1 搭建 搭建的前提是…

(2024,扩散,DMP,提示混合,动态门控,阶段特异性,微调)通过混合提示进行扩散模型修补

Diffusion Model Patching via Mixture-of-Prompts 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0 摘要 1 简介 2 相关工作 3 扩散模型修补(DMP) 3.1 架构…

【运维】如何在Ubuntu 22上使用Python 3.8的虚拟环境

在Ubuntu 22上使用Python 3.8的虚拟环境安装Ryu是相对简单的。以下是一步一步的指南: https://qq742971636.blog.csdn.net/article/details/139566151 安装Python 3.8: 在Ubuntu 22上,Python 3.8可能不是默认安装的版本。你可以使用以下命令…

Java核心知识概述

Java的核心知识涉及多个方面,以下是针对Java核心知识点的分点表示和归纳: 这些集合类提供了丰富的方法和算法,可以方便地对数据进行增删改查等操作。同时,Java还提供了迭代器和各种算法,如排序、搜索、过滤等&#xff…

自动化专业之半导体行业入门指南

收到一枚自动化的毕业生,还是985的。暂定为eap 方向; 先熟悉 secs/gem的通讯协议,后续跟着供应商做eap实施,慢慢接触,能够做eap的开发与copy 工作;今年是一个毕业困难季节,大环境下半导体行业还有一些用人要求,如果大家有希望去这个行业发展的话,可以参考。个人判断半…

作业40 自定义函数

求一个三位数 题目描述 求这样一个三位数&#xff0c;该三位数等于其每位数字的阶乘之和。即abc a! b! c! (n!表示n的阶乘&#xff09; 输入 无 输出 输出这个数 #include<iostream> #include<iomanip> #include<string.h> using namespace std; bool func…

用大模型理解爆火的KAN网络

上个月五一假期的时候&#xff0c;KAN突然成为了热门话题。虽然最初我并没有计划弄懂它&#xff0c;但在老板的要求下&#xff0c;我还是探索了一下。 一、KAN是什么&#xff1f; Kolmogorov-Arnold 定理是数学领域的一个里程碑&#xff0c;它揭示了多元函数能够通过一组更简…

Golang 指针使用教程

文章目录 Go语言特性Go语言指针Go指针示例Go应用场景 Go语言特性 Go函数只有 值传递Go指针 不能运算指针类型的定义与基础数据类型有关&#xff0c;即指针类型是与其指向的变量的类型相关联的。 Go语言指针 使用new函数&#xff1a; new函数用于分配内存&#xff0c;并返回一…

SpringBoot 参数验证的几种方式

文章目录 SpringBoot 参数验证1、为什么要进行参数验证2、验证方式2.1 if 语句判断2.2 Assert2.3 Validator2.3.1 引入依赖2.3.2 定义参数实体类2.3.4 定义特定异常全局拦截方法2.3.5 定义校验类进行测试2.3.6 测试 2.4 自定义验证注解2.4.1 定义自定义注解2.4.2 定义自定义验证…

Python第二语言(八、Python包)

目录 1. 什么是Python包 2. 创包步骤 2.1 new包 2.2 查看创建的包 2.3 拖动文件到包下 3. 导入包 4. 安装第三方包 4.1 什么是第三方包 4.2 安装第三方包-pip 4.3 pip网络优化 1. 什么是Python包 包下有__init__.py就是包&#xff0c;无__init__.py就是文件夹。于Ja…

嵌入式学习——Linux高级编程复习(进程)——day39

1. 进程 进程是计算机科学中的一个核心概念&#xff0c;它是操作系统进行资源分配和调度的基本单位&#xff0c;代表了一个正在执行中的程序实例。当一个程序被加载到内存并开始执行时&#xff0c;它就变成了一个进程。 1. 程序&#xff1a;存放在外存中的一段代码的集合 2. 进…

牛客 NC129 阶乘末尾0的数量【简单 基础数学 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/aa03dff18376454c9d2e359163bf44b8 https://www.lintcode.com/problem/2 思路 Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff…

Python 很好用的爬虫框架:Scrapy:

了解Scrapy 爬虫框架的工作流程&#xff1a; 在scrapy中&#xff0c; 具体工作流程是这样的&#xff1a; 首先第一步 当爬虫引擎<engine>启动后&#xff0c; 引擎会到 spider 中获取 start_url<起始url> 然后将其封装为一个request对象&#xff0c; 交给调度器<…

GDPU JavaWeb 大结局篇(持续更新中)

GDPUJavaWeb程序设计复习&#xff0c;习题集&#xff0c;重点知识总结&#xff0c;一篇就够了。 实验复习 JavaWeb代码复习&#xff0c;在专栏也可查阅。 课后巩固习题 1 【单选题】下列说法正确的是( D ) A、在B/S结构中,结果应用软件发生了改变,就必须通知所有的客户端重新…

Elastic Search 8.14:更快且更具成本效益的向量搜索,使用 retrievers 和重新排序提升相关性,RAG 和开发工具

作者&#xff1a;来自 Elastic Yaru Lin, Ranjana Devaji 我们致力于突破搜索开发的界限&#xff0c;并专注于为搜索构建者提供强大的工具。通过我们的最新更新&#xff0c;Elastic 对于处理以向量表示的大量数据的客户来说变得更加强大。这些增强功能保证了更快的速度、降低的…

Activity->Activity中动态添加Fragment->add和replace方式添加的区别

XML文件 Activity布局文件R.layout.activity_main <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/root_ll"android:orientation"v…