【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=1000、SYN_RATIO_THRESHOLD=0.80、normal_src_entropy=7.5、ENTROPY_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

相关推荐
无名猿4 小时前
nullptr 取代 NULL 和 0:空指针的三种写法和唯一正确解
c++·现代c++·语法基础·踩坑记录
大侠归来4 小时前
C++ 与 Lua 的协程交互:从原理到实战
c++·lua·交互
无名猿4 小时前
size_t 与 int 混用陷阱:有符号无符号比较与整数提升
c++·标准库·语法基础·踩坑记录
.道阻且长.4 小时前
C++ 11:可变参数模板
前端·c++·算法
m0_380743874 小时前
Qt实现调用相机进行拍照并进行图像处理
开发语言·c++
励志不掉头发的内向程序员6 小时前
【从零写一个CAD 03】三个 double 值得单独一个类吗:把视图变换抽成 View
开发语言·c++·qt·学习·系统架构
蒸蒸yyyyzwd13 小时前
秋招学习笔记 day46
c++·八股
码匠许师傅16 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http
无名猿17 小时前
new/delete 与 malloc/free:为什么绝对不能混用
c++·内存管理·现代c++·踩坑记录
@yanyu66618 小时前
C编译器安装与第一个C程序
c语言·开发语言