基于行为流量分析、Random Forest 分类以及内核级 ipset/iptables 执行的自适应两阶段 Layer 4 DDoS 缓解网关。
第一道防线
一个自适应的两阶段 Layer 4 体积型 DDoS 缓解网关。
作者: Abdullah Armiyao
项目: 使用行为流量分析的自适应两阶段近实时 Layer 4 体积型 DDoS 缓解框架

大多数 DDoS 缓解方案使用固定阈值:凡是每秒发送超过某个硬编码数据包数量的来源一律封禁。这在两个方向上都会失效。合法流量在繁忙时段激增,真实用户被封禁;或者攻击者刚好保持在阈值之下,从而蒙混过关。
FLOD 会学习你的正常流量是什么样子,并移动自己的检测边界与之匹配。它能区分 DDoS 洪水与闪拥(flash crowd,即合法的流量激增),无需任何人手动调整阈值。
它以内联方式部署在流量来源与受保护主机之间的网关上,并在内核中丢弃或限速违规来源。
仪表盘会将其封禁的地址标记为攻击者,因此即使不熟悉网络布局的人也能看出哪些发送方是恶意的。被限速的地址会单独列出,因为限速也用作预防措施,并且会一次性应用于整组地址。
阶段 1 是位于数据包路径上的 Rust 传感器。它捕获发往受保护主机的每一个数据包,在短时间窗口内计算速率和来源多样性,并将其与自身维护的基线进行比较。它只做算术运算,因此不会妨碍流量。
阶段 2 是一个 Python 服务。它每个窗口从阶段 1 接收一次摘要,用随机森林对其进行分类,并通过 ipset 和 iptables 发出内核级执行操作。每个窗口还会同时运行一个孤立森林(Isolation Forest),标记出与两个模型所学内容都不相似的流量,并将其呈现为单独的 Anomalous 状态,而不是驱动执行操作。阶段 2 还提供 Web 仪表盘。
两者通过 Unix 域套接字连接。
FLOD 适用于仅凭数据包头部即可观察到的 Layer 4 体积型洪水:速率、源 IP 熵、协议组合,以及流量在其最繁忙来源上的集中程度。在实践中,这意味着那些既高流量又高度集中的洪水,来自一组有限数量的真实地址。
有一项明确不在范围内,另一项则部分涉及:
应用层攻击。 不解析任何请求内容,因此低速慢速请求洪水和连接耗尽超出了仅凭头部特征集所能观察的范围。
随机化源地址欺骗。 为每个数据包伪造一个新源地址会提高熵,而不是降低熵,从而反转了基于地址的特征所寻找的信号。源端口熵、TTL 方差和 TCP SYN 指纹多样性在地址伪造下保持不变,可以弥补这一检测盲点,但检测欺骗性洪水比阻止它要容易得多:封禁一个伪造地址仍然会惩罚真正拥有该地址的人,因此针对这一类攻击的安全执行仍然是一个未解决的问题。参见检测和说明。
git clone https://github.com/DevInBlack001/ddos-reduction-system.git
cd ddos-reduction-system
sudo bash scripts/install.sh --interface <IFACE> --victim-ips <IP1>,<IP2>
sudo systemctl enable --now ddos-stage2
sudo systemctl enable --now ddos-stage1
安装程序会构建阶段 1,然后将阶段 2 的代码和虚拟环境复制到 /opt/flod/stage2(由 root 拥有),并在那里设置管理账户,因为阶段 2 以 root 身份运行,绝不能执行来自检出目录中任何非特权账户仍可写入的内容。可变状态、数据库、JSON 配置、已训练模型都存放在 /var/lib/flod。从此以后,检出目录本身只是一个来源;重新运行 scripts/install.sh 或 scripts/update.sh 会从中刷新已安装的副本。原因参见安全。
仪表盘位于端口 8000,在安装程序的自签名证书就位后通过 HTTPS 访问。完整说明(包括其所依赖的网络布局)见wiki。
安装程序还会在可能的情况下设置 eBPF 构建工具链,以匹配你的发行版所附带的 LLVM。这部分是可选的:没有它,传感器仍可在 libpcap 上构建和运行。
传感器有两种捕获后端。libpcap 是默认选项,可在任何地方使用。在工具链就位的情况下,--capture-mode kernel 会改为通过 XDP 和 TC 在驱动路径中统计数据包,每个窗口唤醒一次用户空间,而不是每个数据包唤醒一次。两种方式的检测结果完全相同。
检测调优是测量出来的,而不是猜出来的。scripts/calibrate.py 会读取传感器自身的日志,对普通流量进行采样,并计算出异常边界在你的网络中应位于何处。
若想在不安装任何东西的情况下试用,可以直接从工作副本运行:
sudo bash scripts/run.sh
它会询问所需的每个值,为每个值提供默认值,并询问是否同时启动阶段 2。添加 --defaults 可在不被询问的情况下接受所有默认值。
运行测试套件:
scripts/test.sh
Wiki,用于运行系统:
| 页面 | 内容 |
|---|---|
| Installation | 要求、网络部署、首次登录 |
| Configuration | 传感器标志、执行调优、告警 |
| Dashboard Guide | 控制台中的每个页面 |
| Troubleshooting | 出现问题时 |
docs/,用于理解或修改它:
CONTRIBUTING.md 涵盖开发环境设置和约定。 SECURITY.md 涵盖漏洞报告。
这个项目是我自己的。概念、架构、两阶段设计、检测方法、执行策略、特征集,以及所有版本中的每一个功能性决策都源自我。我将其作为网络安全性、统计检测和系统编程方面的学习练习来构建,并全程主导其设计和演进。
在实现过程中,我将 AI 用作编码助手,按照我的规格编写和重构代码,并在我权衡设计取舍时充当讨论对象。关于构建什么、为什么构建以及系统应如何行为的决策都由我做出。
这是一个个人的开源项目,也是一个可运行的系统,但尚未经过生产级安全产品所需的对抗性测试。请将其部署在实验网络中,或者部署在你能够承受其出错的地方。
参见 LICENSE。
| 文档 | 内容 |
|---|
| 架构 | 流水线、线程、捕获调优、出口测量 |
| 检测 | Welford、EWMA、熵、异常边界、基线持久化 |
| 说明 | 每个术语和每个线上格式字段,面向非技术读者解释 |
| IPC | 特征向量线上格式 |
| 执行 | 分类、四个缓解层级、NAT 处理 |
| 训练 | 捕获标注数据和训练模型 |
| 测试 | 运行两个测试套件 |
| 安全 | 加固过程与威胁模型 |
| 路线图 | 已完成和计划中的版本 |
| 基准测试结果 | FLOD 与固定阈值对比:硬件、方法、完整输出 |
| 经验教训 | 开发过程中发现的真实 bug,保留下来是因为它们具有普遍意义 |