
昨天凌晨,我正准备把香港机房的 FortiGate 控制台关掉去休息,突然看到流量曲线瞬间拔高——入口 PPS 直接突破 35 M pps,HTTP 请求暴增到 400 k rps,全部来自伪造的移动端 UA 与数万条 IPv4 地址。幸好两个月前我刚把 A5数据香港机房的「GTX-Shield」流量清洗服务和自建 WAF 串成了双层防护链,才没让电商结算接口停摆。下面我把这套 “WAF + BGP Anycast 流量清洗” 的实战方案完整复盘出来,方便你在香港服务器上复刻同级别的高防护体系。
1 .业务与威胁模型
| 维度 | 典型数据 | 关键痛点 |
|---|---|---|
| 峰值带宽 | 15 Gbps 正常 / 120 Gbps 攻击 | 超带宽放大、成本激增 |
| QPS/RPS | 30 k rps 正常 / 400 k rps 攻击 | 连接耗尽、队列阻塞 |
| 协议特征 | TLS 1.3 + HTTP/2 | 需要 L7 解析与指纹识别 |
| 攻击类型 | 伪造 UA Bot、慢速 POST、cache-bypass | 传统 L3/4 清洗难以识别 |
结论:必须把 L3-4 广谱流量清洗与 L7 智能 Bot 识别结合,并保证“清洗—回注—WAF—业务”链路在香港本地闭环,减少跨境时延。
2 . 整体架构速览
┌────────┐ BGP Anycast ┌──────────────┐
│ 全球用户 ├──→ Scrubbing DCs ──GRE→│ HK Clean Pipe│
└────────┘ └────┬────────┘
│内部 VLAN
┌────────────────┴────────────┐
│ Layer-7 WAF Cluster (HA) │←→Redis/Lua Bot DB
└────────────┬───────────────┘
│
┌─────────────┴─────────────┐
│ A5数据 HK Origin LB (LVS) │
└─────────────┬─────────────┘
│
┌─────────┴─────────┐
│ 应用节点池 │
└───────────────────┘
流量路径:Anycast 洗→ GRE 回注→ VXLAN 入 WAF→ LVS→ 应用。
控制面:WAF、Scrubber、LVS 皆打通 Prometheus + Alertmanager,5 s 粒度。
3 . 核心组件选型
| 功能 | 方案 | 关键配置 |
|---|---|---|
| 流量清洗 | GTX-Shield (A5数据) + ChinaTelecom HK T-Clean | Anycast /24 & /48 宣告,阈值 20 Gbps 自动切换 |
| 隧道 | GRE-IPSec | AES-GCM-128,MSS 1350 bytes |
| WAF | FortiWeb 7.4 HA 双活 | Inline-TM (Transparent) + Bot Detection ML |
| 边缘速率限制 | Nginx Lua + Redis | 动态滑窗,Key = UA_hash+IP_CIDR |
4 . 部署实战步骤
4.1 BGP Anycast + 清洗中心
申请 /24 Public 段 → 在 HK、SG、LA 三个清洗 POP 广播。
每 POP 使用 Bird2:
protocol bgp cleanpop {
local as 65010;
neighbor 203.0.113.1 as 65000;
multihop;
password "********";
import filter bgp_in;
export filter bgp_out;
}
与 A5数据 HK CORE 路由交换 iBGP,启用 BGP Flowspec,推送 ACL(TCP syn_rate > 5 k pps → drop)。
4.2 GRE-IPSec 回注
ip tunnel add gretun1 mode gre remote 198.51.100.10 local 203.0.113.10 ttl 255
ip link set gretun1 up
ip addr add 10.20.0.2/30 dev gretun1
ip xfrm state add src 203.0.113.10 dst 198.51.100.10 \
proto esp spi 0x1000 mode tunnel \
aead 'rfc4106(gcm(aes))' 0xKEY 128
MSS fix:iptables -t mangle -A FORWARD -p tcp –tcp-flags SYN,RST SYN -j TCPMSS –set-mss 1350.
4.3 WAF HA 集群
# FortiWeb CLI
config system ha
set mode a-p
set session-pickup enable
end
config server-policy policy
edit "ecom-front"
set protocol https
set ssl-offloading enable
set waf-profile "Bot-ML"
next
end
实测:7.4 版本在双 25 GbE 直通口上桥接,最大可撑 30 Gbps TLS tprox 带宽 + 300 k rps。
4.4 Nginx Lua 行为速率限制
-- /etc/nginx/lua/bot_rate.lua
local key = ngx.md5(ngx.var.remote_addr:sub(1,7) .. ngx.var.http_user_agent)
local limit = ngx.shared.bot_limit
local req, err = limit:incr(key, 1, 0, 3600)
if req and req > 120 then
return ngx.exit(429)
end
5 . 动态规则与 Bot 指纹库
Suricata + EmergingThreats BotCC 部署在清洗 POP,触发后写入 Kafka。
Kafka 消费端用 Golang 15 ms 内同步到 Redis→Lua→Nginx,完成“中心识别—边缘执行”闭环。
FortiWeb 调用 REST API,周期 1 min 下发 custom signature:
curl -k -X POST -d @rule.json \
https://10.0.0.5/api/v2.0/waf/signature/custom
6 . 一次 400 k rps 攻击处置复盘
| 时间线 | 事件 | 动作 | 结果 |
|---|---|---|---|
| T+0 s | 流量尖峰 120 Gbps | Scrubber → Anycast 宣告 /24 → 洗包 | Origin 带宽维持 4 Gbps |
| T+3 s | HTTP/2 并发 400 k rps | WAF Bot-ML 阈值 0.82 → JS Challenge | 96 % Bot 被挡 |
| T+12 s | 剩余 15 k rps | Lua 限流 >120 rps/IP | QPS 恢复 28 k |
| T+90 s | 攻击结束 | GRE 渠道降为 1 Gbps | Anycast 撤播 |
7 . 监控、告警与回溯
- Prometheus Exporter:Bird2、IPSec、FortiWeb syslog → Loki。
- Grafana Dashboard:自定义 WAF 阻断率、Scrubber PPS、Lua 429 比例。
- Alertmanager:规则 rate(http_requests_total[30s]) > 5e5 → PagerDuty。
- ELK 回溯: Kibana Filter tags:bot_attack AND response:429 定位漏网段,导入 Suricata 重新训练 ML。
8 . 性能调优要点
内核参数
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
- TLS 会话复用:FortiWeb 启用 Session Ticket,Nginx 打开 ssl_session_cache shared:SSL:50m;.
- NFQUEUE 分流:把 SYN/ACK 入 NFQUEUE→DPDK-userspace 处理,CPU util 从 82 % 降到 55 %。
我透过 “Anycast 流量清洗 + 本地 WAF + 行为级速率限制” 的三段式闭环,把香港业务的抗 Bot 上限从原先的 20 Gbps 提升到了 >100 Gbps,同步保持 30 ms 内的 TTFB。
如果你也在 A5数据、HKColo 等地运营高价值 Web 服务,强烈建议照此思路—先把 带宽护城河 挖足,再用机器学习 WAF 做 内外有别 的精细化拦截,最后让 动态 Lua 策略 随流量快速收口。这样不论 Bot 攻击如何演化,你都能抢占主动权,把影响控制在 SLA 之内。











