【C/C++】手写 DPDK 协议栈(十一):基于 PPS、SYN 比例和源 IP 熵的 DDoS 检测

目录

  • [手写 DPDK 协议栈(十一):基于 PPS、SYN 比例和源 IP 熵的 DDoS 检测](#手写 DPDK 协议栈(十一):基于 PPS、SYN 比例和源 IP 熵的 DDoS 检测)
    • [1. 指标不是单独使用的](#1. 指标不是单独使用的)
    • [2. Shannon 熵如何计算](#2. Shannon 熵如何计算)
    • [3. 窗口轮转与判定](#3. 窗口轮转与判定)
    • [4. 如何验证而不伤及真实网络](#4. 如何验证而不伤及真实网络)
    • [5. 走向可用防护的下一步](#5. 走向可用防护的下一步)
    • 小结

手写 DPDK 协议栈(十一):基于 PPS、SYN 比例和源 IP 熵的 DDoS 检测

标签:DPDK DDoS 信息熵 SYN Flood 网络安全

ddos/ddos.c 将检测逻辑放在高速包路径中:以一秒为统计窗口,计算包速率、TCP SYN 占比与源 IP 分布的 Shannon 熵。当流量超过阈值且熵偏离基线或 SYN 比例异常时,输出疑似 DDoS 告警。

1. 指标不是单独使用的

text 复制代码
疑似攻击 = PPS > 阈值
        AND (|源IP熵 - 正常熵| > 熵偏移阈值 OR SYN比率 > 阈值)

当前课程参数是:256 个源 IP 桶、1 秒窗口、PPS_THRESHOLD=1000SYN_RATIO_THRESHOLD=0.80normal_src_entropy=7.5ENTROPY_DELTA=1.5。这些是实验参数,不是通用生产阈值。

2. Shannon 熵如何计算

对第 i 个桶,p_i = count_i / total

text 复制代码
H = - Σ p_i * log2(p_i)

源地址越均匀,熵一般越高;单源或少量源集中时,熵降低。课程代码先将源 IP 做轻量 hash 后映射到 256 个桶,再遍历非零桶累计熵。

c 复制代码
d->packets++;
d->src_ip_bucket[hash_src_ip(ip_hdr->src_addr) & 255]++;
if (ip_hdr->next_proto_id == IPPROTO_TCP) {
    d->tcp_packets++;
    if ((tcp->tcp_flags & RTE_TCP_SYN_FLAG) &&
        !(tcp->tcp_flags & RTE_TCP_ACK_FLAG))
        d->syn_packets++;
}

3. 窗口轮转与判定

c 复制代码
double entropy = shannon_entropy(d->src_ip_bucket, d->packets);
double syn_ratio = d->tcp_packets ?
    (double)d->syn_packets / d->tcp_packets : 0.0;
if (d->packets > PPS_THRESHOLD &&
    (fabs(entropy - d->normal_src_entropy) > ENTROPY_DELTA ||
     syn_ratio > SYN_RATIO_THRESHOLD)) {
    /* 告警:不要直接全丢包 */
}

窗口结束后要清零桶与计数器再开始下一秒。这里的检测函数只做观察,不应该在数据面直接"一键全丢包":误报会造成比攻击更严重的业务中断。

4. 如何验证而不伤及真实网络

课程使用 hping3 在隔离实验网测试 SYN 压力:

bash 复制代码
hping3 -c 1200 -d 130 -S -w 64 -p 12345 --flood --rand-source 192.168.98.128

仅应在明确授权、隔离的靶场执行,绝不能对公网或未授权主机压测。

5. 走向可用防护的下一步

生产系统应先建立按时间段、业务、目的端口区分的正常基线;告警后可按源/目的维度限速、采样镜像给控制面复核、设置连接表上限。还要防止攻击者通过伪造源 IP 或低慢速模式规避单一熵指标。

小结

熵检测回答的是"流量分布是否异常",SYN 比例回答的是"连接意图是否异常",PPS 回答的是"强度是否异常"。三者组合比只看单包特征更稳健,但阈值必须来自真实业务基线。

学习链接: https://github.com/0voice

相关推荐
Sumerking35 分钟前
llc_control.c 专项评审(v3 更新版)
c语言·开发语言·算法·obc
软行1 小时前
LeetCode 每日一题 3876. 构造奇偶一致的数组 II
c++·算法·leetcode
繁星蓝雨1 小时前
C++设计原理———重载(extern “C“的由来、顺序依赖、语义依赖、overload、名称修饰符、对象操作、运算符重载、新增运算符、枚举和布尔类型)
c语言·c++·extern c·overload·重载·语义依赖·顺序依赖
handler011 小时前
【Linux】虚拟地址空间解析
linux·运维·c++·线程·进程·虚拟地址空间·虚拟地址
(Charon)2 小时前
【C++】网络缓冲区设计(二):Ring Buffer环形缓冲区、head/tail与跨界读写
开发语言·c++
码匠许师傅2 小时前
【设计模式精讲】24.观察者模式(Observer)
c++·观察者模式·设计模式·uml
imgsq2 小时前
S-57 数据解剖:把一个 ENC 文件拆给你看
c++·数据可视化
SuperByteMaster2 小时前
编译器将unsigned short 整体提升int和unsigned short 在内存中的分配2byte的理解
c语言
迷茫、Peanut2 小时前
中断的时钟
c++
2402_882893862 小时前
用哈希表封装 unordered_map 和 unordered_set —— 手撕 C++ 哈希容器
c++·哈希桶·unordered_map·unordered_set