用 pktgen 模拟 10 Gbps SYN Flood,如何验证云清洗生效时间
解读
面试官想知道三件事:
- 你能否在实验室里把 10 Gbps SYN Flood 真实打出来,而不是“号称 10 Gbps”;
- 你能否把“云清洗生效”这一瞬间精确捕捉,而不是模糊地说“好像流量降了”;
- 你能否用可复现、可量化的指标向客户/领导证明 SLA 达标(如 3 秒内清洗)。
国内云厂商(阿里云、腾讯云、华为云)普遍提供“高防 IP”或“DDoS 高防包”,触发后流量先经过清洗中心,再回注到业务。验证生效时间=从攻击流量达到触发阈值,到回注流量中 SYN 包速率下降 90% 的时间差。整个实验必须绕开 CDN 和本地缓存,确保测量的是“清洗”本身,而不是其他环节。
知识点
- pktgen-dpdk 参数:prefetch 数、burst size、mbuf 池大小、tx-thresh,决定能否打满 10 Gbps。
- 网卡 offload:关闭 tx-nocache-csum,防止网卡重算校验和导致速率抖动。
- 触发阈值:云厂商默认 2 Gbps 或 5 kpps,需提前在控制台调低,否则 10 Gbps 直接黑洞。
- 测量点:
- 攻击侧:pktgen 自带 rate counter,每秒输出 pps/Gbps;
- 清洗侧:云厂商提供“高防监控 API”或“回注 NetFlow”,粒度 5 s 不够,需用秒级采样;
- 业务侧:在回注口挂一台 Linux 探针,tcpdump ‘tcp[tcpflags] & tcp-syn != 0’ 统计 syn_pps。
- 时间同步:攻击机、探针、云 API 统一用 ntp.aliyun.com,误差 < 50 ms。
- 指标定义:
T0 = 最后一秒 syn_pps < 阈值的时间;
T1 = 探针观测到 syn_pps 下降 90% 的时间;
生效时间 ΔT = T1 – T0。 - 可重复性:同一 Region、同一可用区、同一高防实例重复 5 次,取 P90 ΔT 作为报告值。
答案
实验拓扑
攻击机(裸金属,16 核,Intel XXV710 25 G)—> 云高防 IP —> 回注探针(同一 VPC)—> 业务虚机。
步骤
- 准备
- 攻击机编译 DPDK 20.11,绑定网卡到 igb_uio,预留 4 G 大页。
- 写 pktgen 脚本,单核打 1.5 Mpps,8 核并发 12 Mpps,包长 64 B,理论 10.2 Gbps。
- 在云控制台把“基础防护阈值”临时调到 1 Gbps,确保 10 Gbps 一定触发清洗。
- 校准
先跑 30 s 1 Gbps 背景流量,确认探针 syn_pps 与云监控一致,误差 < 3%。 - 正式测试
- T=0 s 启动 pktgen,命令:
pktgen -l 0-7 -n 4 -- -P -m “[1:8].0” -s 0:dst=高防IP,dport=80,flags=syn - 攻击机每秒记录 tx_pps、tx_bps;
- 探针每秒输出 syn_pps;
- 用 Python 调用云 API 每秒拉取“回注流量 bps”。
- T=0 s 启动 pktgen,命令:
- 结束条件
当探针 syn_pps 连续 3 s 低于 10 kpps(下降 90%)时停止 pktgen。 - 计算
取 API 返回的“触发清洗时间戳”为 T0,探针 syn_pps 下降 90% 的时间戳为 T1,ΔT=T1-T0。 - 结果
重复 5 次,ΔT 分别为 2.1、1.9、2.3、2.0、2.2 s,P90=2.2 s,小于厂商承诺 3 s,验收通过。
报告要素
- 原始 csv(时间戳、tx_pps、rx_syn_pps、API bps);
- 折线图(不提供图,但给出 gnuplot 脚本,方便现场复现);
- 结论:云清洗生效时间 2.2 s,满足 SLA。
拓展思考
- 如果客户业务走了 Anycast 高防,清洗中心分布在华北、华东、华南,如何确定是哪一座清洗中心生效?
可在 SYN 包中嵌入 IP-ID 递增字段,回注口抓包看 IP-ID 连续性,结合 BGP AS-Path 判断清洗中心。 - 云厂商在“黑洞”前会先“限速”,如何区分限速与清洗?
限速阶段 SYN/ACK 比例不变,清洗阶段 SYN 被丢弃、ACK 也下降,可联合统计 syn/ack_ratio。 - 若未来升级到 100 Gbps,pktgen 单机无法打满,如何横向扩展?
用多台裸金属 + gPTP 1588 时间同步,统一启动时刻,控制总速率 100 Gbps;同时担心交换机微突发,需在交换侧配置缓冲监测,验证瞬时突发是否超过 200 ms。