目录
- [手写 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 回答的是"强度是否异常"。三者组合比只看单包特征更稳健,但阈值必须来自真实业务基线。