小鸡被 DDoS 打死时,比“多少G防御”更该看的几个指标(pps / 包长 / 软中断)
小鸡被 DDoS 打死时,比“多少G防御”更该看的几个指标(pps / 包长 / 软中断)
很多朋友买 VPS 时都爱问“这机子多少 G 防御?”觉得只要防御数值够高,就能扛住 DDoS 攻击。可现实经常很骨感:明明标着 10G 防御,结果一来个小流量攻击,小鸡就掉线或卡死,连 ssh 都连不上。这是为什么?
今天就来掰扯掰扯,那些比“防御 G 数”更关键的指标——PPS、包长和软中断。搞懂它们,你才能明白为什么有些攻击看着“流量不大”,却能瞬间把你的机器打爆。
图:带宽(数据量体积)与 PPS(数据密度)的区别示意图。同样 1Gbps 流量,大包 PPS 低,小包 PPS 极高。
1. 别只盯着带宽,PPS 才是隐形杀手
带宽(Gbps)只是数据总量的“体积”,而 PPS(每秒包数)才是数据量的“密度”。举个例子,同样 1 Gbps 的流量:如果是大包(比如 1500 字节),每秒可能只有 8 万个包;但如果是极小包(比如 64 字节),每秒就会有接近 150 万个包。
图:使用 top 命令排查软中断。如果 si(softirq)指标长期占据 100% CPU,说明系统正在处理海量数据包,导致用户进程“饿死”。
很多廉价 VPS 的防御机制只是单纯限速,不限制 PPS。攻击者就会利用这点,用大量极小包发起攻击。带宽上看可能只有几百 Mbps,远没到你的防御阈值,但 PPS 早就把你的 CPU 或网卡的队列撑爆了。
所以,下次选机子,除了看防御带宽,最好也打听下它对 PPS 的限制能力,或者有没有专门的抗小包策略。
2. 包长:为什么小包攻击更凶残?
DDoS 里最恶毒的攻击方式之一就是 UDP 小包 Flood 或 SYN Flood。这些包的 payload 极小,甚至只有几十字节。它们的目的不在于“挤爆带宽”,而在于耗尽你的连接表和中断处理资源。
- 影响带宽:小包攻击通常占用的带宽很小,很容易骗过基于带宽的防火墙。
- 影响 CPU:路由器、防火墙和操作系统处理每个包都需要进行查表、校验、状态跟踪,处理 1 个 1500 字节的大包和处理 1 个 64 字节的小包,CPU 开销相差不大。所以,PPS 越高,CPU 越累。
如果你的 VPS 是单核或者弱 CPU,遇到这种“低带宽、高 PPS”的攻击,基本是必挂无疑。
3. 软中断:CPU 也在加班加点
机器被 DDoS 打死,很多时候不是因为带宽满了,而是因为软中断占用了 100% 的 CPU 时间,导致正常的用户进程(比如你的网站、数据库)拿不到 CPU 时间片,系统看起来就像死机了一样。
网络数据包到达网卡后,网卡会触发硬件中断,通知内核取数据。内核为了不阻塞其他进程,会把收包任务放入软中断队列,稍后处理。如果攻击流量 PPS 很高,软中断队列就会堆积,si(softirq)占用 CPU 飙升,用户态的进程就会“饿死”。
如何排查和缓解?
-
检查软中断占用:用
top命令查看 CPU 状态,如果si或%irq长期居高不下(比如 80%-100%),基本就是包处理压力过大。 -
调整中断亲和性:如果你的机器是多核的,可以把网卡的中断绑定到特定的 CPU 核上,避免所有核都在处理中断。可以使用
irqbalance服务自动平衡,或者手动通过/proc/irq/下的smp_affinity文件调整绑定。 -
开启 RPS(Receive Packet Steering):RPS 可以把软中断的处理分散到多核 CPU 上,提升多核系统下的包处理效率。在
/sys/class/net/eth0/queues/rx-0/rps_cpus里设置对应的掩码即可。 -
优化内核参数:调整
net.core.somaxconn、net.ipv4.tcp_max_syn_backlog等参数,扩大连接队列和半连接队列,能在一定程度上缓解 SYN Flood 的冲击。同时,可以开启syncookies防护。
总结
别再单纯相信“百兆防御”的口号了。面对 DDoS,高防御带宽是基础,但 PPS 处理能力和 CPU 的软中断性能才是保命的关键。遇到攻击时,先看 CPU 的 si 占用,再看网络 PPS,往往能找到症结所在。平时备好一套内核调优脚本,关键时刻能救你一命。
希望这篇碎碎念能帮你避坑,有问题欢迎评论区交流!

评论已关闭