【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

相关推荐
十五年专注C++开发2 小时前
C++设计一个函数来求容器元素绝对值之和的平均值
c++·模板·accumulate
王老师青少年编程3 小时前
csp信奥赛C++高频考点专项训练:【排序算法】案例9:成绩排序
c++·排序算法·csp·高频考点·信奥赛·成绩排序
程序喵大人3 小时前
【C++进阶】STL容器与迭代器 - 05 map 和 set 为什么按键保持有序
开发语言·c++·容器·迭代器·stl
冻柠檬飞冰走茶4 小时前
PTA基础编程题目集 7-15 计算圆周率(C语言实现)
c语言·开发语言·数据结构·算法
库克克4 小时前
【C++】 unordered_map 与unordered_set
开发语言·c++
huainingning4 小时前
华三瘦AP切换为胖AP并配置无线功能
运维·网络·网络协议·tcp/ip
李迟5 小时前
一种轻量级C++ CSV文件读写库的实现方案
开发语言·c++
学无止境_永不停歇6 小时前
9. 缓冲区
linux·服务器·c++
古道青阳6 小时前
Duilib 技术全景剖析
c++·windows