• 基于SDN环境下的DDoS异常攻击的检测与缓解--实验


    申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址 全文共计7903字,阅读大概需要5分钟
    欢迎关注我的个人公众号:不懂开发的程序猿

    基于SDN环境下的DDoS异常攻击的检测与缓解–实验

    开始实验前,搭建本地环境。需要用到的工具:

    • floodlight(SDN控制器的一种)
    • mininet(仿真网络拓扑环境)
    • Sflow-RT(流量监控设备)

    简介:sFlow技术是一种以设备端口为基本单元的数据流随机采样的流量监控技术,不仅可以提供完整的第二层到第四层甚至全网范围内的实时流量信息,而且可以适应超大网络流量(如大于10Gbit/s)环境下的流量分析,让用户详细、实时地分析网络传输流的性能、趋势和存在的问题。sFlow监控工具由sFlow Agent和sFlow Collector两部分组成。Agent作为客户端,一般内嵌于网络转发设备(如交换机、路由器),通过获取本设备上的接口统计信息和数据信息,将信息封装成sFlow报文,当sFlow报文缓冲区满或是在sFlow报文缓存时间(缓存时间为1秒)超时后,sFlow Agent会将sFlow报文发送到指定的Collector。Collector作为远端服务器,负责对sFlow报文分析、汇总、生成流量报告。

    还需要用到的平台编译器:java(JDK/JRE一定要是1.8版本),ant编译器 ,curl (是一个利用URL语法在命令行下工作的文件传输工具)

    虚拟机:ubuntu20.04(这个版本不重要)

    1.安装floodlight

    1.1 安装相关依赖库

    sudo apt-get install build-essential default-jdk ant python-dev openjfx
    sudo apt-get install git
    
    • 1
    • 2

    1.2 下载floodlight源

    git clone git://github.com/floodlight/floodlight.git
    
    • 1

    1.3 安装JDK1.8(⚠️安装前要确保Java的JDK为1.8版本)

    这里出现了问题,由于默认安装的是jdk11,但是使用jdk11运行floodlight会报错(当时在这里卡了很久),于是先卸载JDK11

    sudo apt-get autoremove openjdk-11-jre-headless
    
    • 1

    重新下载了jdk8

    sudo apt install openjdk-8-jre-headless
    
    • 1

    在这里插入图片描述

    安装其他相关依赖:

    sudo apt-get install ant python-dev build-essential maven openjfx
    
    • 1

    1.4、进入floodlight文件夹

    cd ~/floodlight
    
    • 1

    1.5 针对后面无法访问localhost:8080网页问题的提前修改

    git pull origin master
    git submodule init
    git submodule update
    
    • 1
    • 2
    • 3

    1.6 编译(在floodlight目录下)

    ant
    
    • 1

    ant出现错误
    错误是:程序包javax.xml.bind.annotation不存在

    ant 显示程序包**不存在(可能会如下报错,这一步当时也是卡了很久)

    在这里插入图片描述

    由于jdk版本为jdk11导致,将jdk换为jdk8

    sudo update-alternatives --config javac//切换jdk版本
    
    • 1

    依旧报错

    echo $JAVA_HOME   //查看JAVAHOME
    
    • 1

    //如果没有内容

    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64   //加入自己jdk8的地址
    
    • 1

    1.7 接着Build(在floodlight目录下)

    ant
    
    • 1

    在这里插入图片描述

    1.8 之后build 成功

    java -jar target/floodlight.jar //运行floodlight控制器,该窗口请不要关闭
    
    • 1

    1.9 网页访问管理界面

    浏览器内,打开网页http://localhost:8080/ui/index.html

    在这里插入图片描述

    2.安装sFlow-RT流量监控设备

    2.1官网安装地址https://sflow-rt.com/download.php

    在这里插入图片描述

    2.2这里采用命令行的方式安装(安装前要求JDK1.8的环境)

    wget https://inmon.com/products/sFlow-RT/sflow-rt.tar.gz(下载)
    tar -xvzf sflow-rt.tar.gz(解压)
    ./sflow-rt/start.sh(启动)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    安装路径注意选择桌面,系统根目录下会连接失败。路径很重要!

    在这里插入图片描述

    3.命令行安装curl工具

    wget https://curl.haxx.se/download/curl-7.55.1.tar.gz(下载)

    在这里插入图片描述

    tar -xzvf curl-7.55.1.tar.gz(解压)
    
    • 1

    在这里插入图片描述

    3)安装

    cd curl-7.55.1
    ./configure
    make
    make install
    
    • 1
    • 2
    • 3
    • 4

    4)使用 curl --version 检查是否更新成功

    curl --version
    
    • 1

    在这里插入图片描述

    4.构建拓扑

    保持 Floodlight 运行的终端,再新开一个终端窗口,输入如下指令,构建我们所需的拓扑结构。

    sudo mn --controller=remote,ip=127.0.0.1,port=6633 --topo=single,3
    
    • 1

    在这里插入图片描述

    5.DDoS 攻击检测

    启动sFlow-RT
    保持Mininet 运行的终端,再新开一个终端窗口,输入如下指令,启动sFlow-RT。

    cd sflow-rt
    ./start.sh
    
    • 1
    • 2

    在这里插入图片描述

    b ) 配置sFlow Agent
    我们需要在虚拟交换机配置sFlow Agent,这样sFlow Collector 才能收集到流量信息进行分析和呈现。
    c)部署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
    
    • 1

    在这里插入图片描述

    输入ip link 指令可以查看,虚拟交换机端口与端口编号的映射

    可以看到s1 交换机对应的编号是4,交换机连接host1的端口对应的编号是5,依次类推。

    在这里插入图片描述

    可以看到s1 交换机对应的编号是4,交换机连接host1的端口对应的编号是5,依次类推。

    d)查看sFlow Agent 是否配置成功,我们可以通过其WebUI进行查看:
    http://localhost:8008/html/index.html#status

    在这里插入图片描述

    e)安装flow-trend app(如图)

    在这里插入图片描述

    在这里插入图片描述

    git clone https://github.com/sflow-rt/flow-trend(下载)
    
    • 1

    在这里插入图片描述

    sflow-rt/get-app.sh sflow-rt flow-trend(运行)
    
    • 1

    在这里插入图片描述

    安装完成后,关闭全部终端,重复上面的操作,可以看到下图

    在这里插入图片描述

    点击页面上的 【Apps】选项, 再点击【flow-trend】选项

    localhost:8008/app/flow-trend/html/index.html

    然后分别在KeysValueFilter列填入:ipsource,ipdestination,stack;bytes;留空 ,然后点击右面的【 Submit (√)】提交-------,之后,将自动转到图形化流量监控页面

    在这里插入图片描述

    在这里插入图片描述

    e)然后切换到mininet 控制台窗口,使用如下指令,打开 Host1,和Host2的终端:

    xterm h1 h2
    
    • 1

    然后在 Host1 上启动一个 http 服务

    python3 -m http.server 80&
    
    • 1

    在这里插入图片描述

    在 Host2 上 ping Host1

    在这里插入图片描述

    然后去观察流量, 可以看到,流量很正常,在 Host2 终端中可以按 Ctrl+c,停止ping。可以试试访问一下 Host1的HTTP服务。

    在这里插入图片描述

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

    h2 ping –f h1
    
    • 1

    再去观察交换机流量

    在这里插入图片描述

    6.DDoS 攻击防御

    打开一个系统终端,输入如下指令,调用Floodlight 的API 查询现有流表

    sudo curl  http://127.0.0.1:8080/wm/staticflowpusher/list/00:00:00:00:00:00:01/json
    
    • 1

    返回为空
    1)添加流表操作
    然后我们添加一条静态流表,为了方便操作和查看,新建一个 ddos.json 的文件,将流表内容写入到这个文件,然后通过 API 进行提交,文件内容如下:

    在这里插入图片描述

    执行下列指令,下发流表Drop数据包:

    curl -X POST -d @ddos.json http://127.0.0.1:8080/wm/staticflowpusher/json
    
    • 1

    返回“Entry pushed”,表示流表下发成功

    2)观察流量
    切换到 sFlow 这边查看流量:

    在这里插入图片描述

    发现流表下发之后,流量迅速下降,h1向h2泛洪的数据包迅速的被完全Drop掉了。

    切换到 h2 的终端,访问 h1的web服务

    在这里插入图片描述

    同样无法访问了。这是因为我们下发的流表是把所有的数据包都Drop掉了。这并不是我们想要的效果。
    3)删除流表
    执行以下指令删除刚刚下发的流表:

    	curl -X DELETE -d '{"name":"flow-mod-dropt"}' \
    			http://127.0.0.1:8080/wm/staticflowpusher/json
    
    • 1
    • 2

    再次观察流量:

    在这里插入图片描述

    攻击的数据包流表又恢复了。
    4)DROP指定流量
    改造需要下发的流表,让OpenFlowSwitch 只Drop掉 ICMP的流量,不影响正常的HTTP服务。修改内容如下:

    在这里插入图片描述

    添加了两个字段,eth_type: 指定以太网类型为ipv4,ip_proto:指定协议类型为ICMP。
    再次下发流表:

    curl -X POST -d @ddos.json http://127.0.0.1:8080/wm/staticflowpusher/json
    
    • 1

    此时再观察流量和访问 h1 的HTTP服务

    在这里插入图片描述

    可以发现,流量下降到正常,但HTTP服务依然可以访问,没有受到影响。

    7.总结

    通过SDN技术,我们可以对网络流量进行实时监控,提取,分析,并能够及时的对流量进行调整比如QoS,负载均衡,DDoS流量过滤等。

    –end–

  • 相关阅读:
    RestTemplate Message Convert 详解
    docker——重启策略
    Python Cartopy地图投影【3】
    【PostgreSql基础语法 】1、增删改查、where、limit、like模糊查询
    Spring-Cloud如何异步跨线程查询链路日志(附实例)
    手把手带你学python—牛客网python基础 生成字典
    centos7安装mysql急速版
    CSS 实现动态显示隐藏(:checked 和 :target 的妙用)
    SCADA系统是什么意思?
    devDependencies节点()
  • 原文地址:https://blog.csdn.net/qq_44807756/article/details/127842230