
我负责的一家跨境电商平台提供香港高防节点,凌晨 01:10,广东—香港骨干链路瞬间被 480 Gbps 的 TCP ACK Flood 与 DNS Amplification 夹击,平台核心 API 延迟飙升至 4 s 以上。我们必须在 30 秒内把流量引流至清洗中心并完成实时拦截,否则内地用户的支付链就会崩溃。下面记录我当时的完整技术方案与落地细节,供同样维护香港高防业务线的工程师参考。
1. 环境与目标
| 组件 | 规格 | 目的 |
|---|---|---|
| A5 数据香港高防 BGP 容量 | 2 × 800 Gbps 集群 | 承接爆发流量 & 进行 L3–L4 清洗 |
| Anycast /24 段 | 3 个 POP(HK1、HK2、SG) | 全球最短路引流 |
| Edge Linux 网关 | 2 × Xeon Silver + Mellanox CX-6 100G | eBPF/XDP 硬件卸载 |
| 节点防护阈值 | ≤ 400 Gbps / POP | 扩散风险控制 |
| WAF 集群 | 20 核 × 6 实例 | HTTP/S L7 行为校验 |
目标
- 30 秒内全网 BGP 引流 + GRE 回注
- 10 秒内动态下发 ACL / FlowSpec
- L7 延迟不超过 300 ms(99 th)
2. 威胁模型
- 体量型:DNS / NTP / CLDAP 放大,> 300 Gbps
- 协议型:TCP ACK Flood、TCP Rst Flood,港内链路放大
- 应用型:HTTP GET / POST Flood,CC、慢速攻击
3. 宏观架构
┌──────────────┐ BGP Anycast ┌──────────────┐
│ Mainland ISP │ ─────────────────────────▶│ HK POP (Edge)│
└──────────────┘ └─────┬────────┘
▼ GRE
┌────────────────────────────────────┐
│ 清洗中心 (100 G Leaf × 8) │
│ • Arista 7280SR + DDoS DPU │
│ • FlowSpec / sFlow / AI 引擎 │
└──────┬────────────┬───────────────┘
▼ ▼
┌──────────────┐ ┌──────────────┐
│WAF L7 集群 │ │ 业务 K8s 集群 │
└──────────────┘ └──────────────┘
4. 实时检测与触发逻辑
4.1 流量遥测
# Edge 交换机启用 sFlow 输出 10 ms 粒度
sflow enable
sflow agent-interface ethernet1
sflow collector 10.10.10.8 6343
sflow polling 10
10 ms 级采样确保能捕捉子秒级脉冲。
对接 Kafka → Flink CEP 做滑动窗口聚合,触发 > 3 σ 异常报警。
4.2 自动封装 BGP FlowSpec
Flink 检测到 syn_rate > 1 M/s 时,调用 ExaBGP API:
announce = f"""
announce flow route DDoS_TCP_ACK {{
match {
source {src};
destination {dst};
ip-protocol = tcp;
packet-length > 0&<1200;
tcp-flags ack;
}
then {
rate-limit 0;
}
}}
"""
下发到 Arista 7280SR,约 120 ms 完成全网扩散。
5. Edge 层线速拦截(eBPF + XDP)
- 硬件:Mellanox ConnectX-6 DX 支持 XDP offload
- 策略:先在内核态用 XDP_DROP 丢弃已匹配的 TCP ACK flood
- 优势:完全绕过 iptables/nftables,100 G 单核可处理 > 25 M pps
SEC("xdp")
int xdp_ddos_drop(struct xdp_md *ctx) {
void *data_end = (void *)(long)ctx->data_end;
void *data = (void *)(long)ctx->data;
struct ethhdr *eth = data;
if ((void*)eth + sizeof(*eth) > data_end) return XDP_PASS;
if (eth->h_proto != htons(ETH_P_IP)) return XDP_PASS;
struct iphdr *ip = data + sizeof(*eth);
if ((void*)ip + sizeof(*ip) > data_end) return XDP_PASS;
if (ip->protocol == IPPROTO_TCP) {
struct tcphdr *tcp = (void*)ip + ip->ihl*4;
if ((void*)tcp + sizeof(*tcp) > data_end) return XDP_PASS;
if (tcp->ack && !tcp->syn && !tcp->fin) return XDP_DROP;
}
return XDP_PASS;
}
编译 clang -O2 -target bpf -c drop.c -o drop.o
加载 bpftool net attach xdpdrv pinned /sys/fs/bpf/ddos_drop dev eth0
6. L7 行为校验(WAF + 动态挑战)
| 校验维度 | 技术手段 | 响应策略 |
|---|---|---|
| URI 熵值 | Lua Nginx 模块计算 Shannon 熵 | > 5.0 触发 302 → 验证码 |
| 会话完整度 | Redis-LFU 会话计数 | 5 秒内 > 200 r 直接丢包 |
| JA3 指纹 | Envoy + Lua 过滤器 | 异常指纹回 421 拒绝 |
示例 Nginx 规则片段:
set_by_lua $entropy '
local str=ngx.var.request_uri
local hist={},len=#str
for i=1,len do
local c=str:sub(i,i)
hist[c]=(hist[c] or 0)+1
end
local H=0
for _,v in pairs(hist) do
local p=v/len
H=H - p*math.log(p,2)
end
return H
';
if ($entropy > 5) {
return 302 /challenge;
}
7. 验证与回注
- 回环回注:清洗完成后,通过 GRE 隧道 ip tunnel add gre1 mode gre remote 103.*.*.* ttl 255
- 快速灰度:使用 SR-MPLS 在 Arista 上把 1 % 流量打入清洗后链路测试
- 业务探活:K8s 内部拨测 /health 确保 200 OK < 50 ms
8. 监控与告警
- 指标:pps、bps、丢包率、XDP drop 计数、FlowSpec hit 计数
- 工具:Prometheus + Grafana + Loki
- 压测:内部 scapy 40 Gbps 压测脚本,每月演练一次
9. 事后改进与自动化
| 改进项 | 收益 |
|---|---|
| 引入 eBPF map 自适应阈值 | 低误杀率,免人工调整 |
| Flink → ClickHouse 落盘 | 90 天攻击画像可追溯 |
| 将 FlowSpec 下发接口切换至 gRPC | 延迟从 120 ms → 40 ms |
这次 480 Gbps 的跨境流量洪峰最终在 23 秒内被完全吸收,核心支付接口 P99 延迟降回 220 ms。实践证明,“Anycast + 线速 XDP 拦截 + 智能 WAF” 三段式高防架构能在香港这样跨境链路复杂、时延敏感的环境下保持韧性。如果你也在维护香港节点并面临类似高峰场景,欢迎参考以上方法快速落地并迭代出适合自己业务的高防体系。











