接口被刷百万QPS 的防御策略
百万QPS 级别的“刷接口”(通常是应用层 CC 攻击或恶意高频请求)属于典型的 DDoS/CC 攻击变种,攻击者通过伪装合法请求(如高频调用 API)耗尽服务器资源(CPU、连接、数据库),导致正常用户无法访问。单纯靠服务器自身扛不住,必须多层次防御。
1. 前端/边缘层防护(最关键,拦截在源头)
- 使用云 WAF + CDN:这是应对百万 QPS 的首选,将流量先引到云厂商的边缘节点清洗。
- 阿里云:DDoS 高防 + WAF(支持 AI 智能防护,自动学习业务基线,精准拦截 CC;最高防护超 1000 万 QPS)。结合全站加速 CDN(DCDN),隐藏源站 IP,防大流量冲击。
- 腾讯云/华为云:类似高防 IP + WAF,支持百万级 CC 防御 + AI 行为分析。
- 优势:弹性扩容(Tbps 级带宽),分钟级清洗;支持 JS 挑战、滑块验证码、人机识别拦截伪装流量。
- 为什么有效:百万 QPS 若直达服务器,早崩了;云防护在全球节点分流清洗,清洗率 99.99%+。
2. 网关/接入层限流(第二道防线)
- API 网关限流:
- 使用 Nginx + Lua(openresty)实现令牌桶/漏桶算法:
lua -- 示例:每 IP 1000 QPS + 2000 突发 local lim = require("resty.limit.req").new("my_limit", 1000, 2000) local key = ngx.var.remote_addr -- 或 user_id/device_id 多维度 local delay, err = lim:incoming(key, true) if not delay then if err == "rejected" then return ngx.exit(429) -- Too Many Requests end end - 多维度限流:IP + UserID + DeviceID + URI,避免单一维度绕过。
- 分布式限流:用 Redis 计数(支持滑动窗口),应对集群。
- 使用 Nginx + Lua(openresty)实现令牌桶/漏桶算法:
- Sentinel/Resilience4j:熔断 + 限流,超阈值直接拒绝。
- 返回标准响应:429 Too Many Requests + Retry-After 头,引导正常客户端重试。
3. 应用层防护
- 验证码/人机验证:敏感接口(如登录、领券、下单)加滑块/JS 挑战(葛温、reCAPTCHA)。
- 黑/白名单:动态封禁异常 IP(基于日志分析)。
- 业务风控规则:如 Drools/Flink 实时规则引擎,检测高频行为(10 秒内同用户超 30 次)。
- 隐藏真实 IP:用 CDN/高防代理,源站只回正常流量。
4. 监控 + 应急
- 实时监控:Prometheus + Grafana 监控 QPS、延迟、错误率;设阈值报警。
- 日志分析:ELK 或云日志服务,快速定位攻击特征(IP、User-Agent、URI)。
- 应急预案:攻击时切换高防模式、一键 Bypass(绕过 WAF 直回源,防误伤)。
- 压测验证:用 JMeter/Locust 模拟百万 QPS,提前优化。
防御层次总结(推荐架构)
| 层次 | 措施 | 适用场景 | 预期效果 |
|---|---|---|---|
| 边缘 | 云 WAF/CDN + DDoS 高防 | 百万 QPS 大流量/CC | 拦截 99%+ 恶意流量 |
| 网关 | Nginx/Sentinel 限流 | 高频 API 调用 | 控制突发,防资源耗尽 |
| 应用 | 验证码 + 风控规则 + 黑名单 | 业务逻辑滥用(如薅羊毛) | 精准识别伪装请求 |
| 基础设施 | 扩容 + 缓存 + 熔断 | 残余流量 | 保证可用性 |
现实建议:小公司直接上云 WAF(阿里/腾讯,性价比高,按量付费防超支);大公司混合云 + 自建规则。百万 QPS 攻击往往是黑产,单靠代码层扛不住,必须靠云厂商的 T 级带宽 + AI 清洗。提前接入防护,防患于未然!如果已被攻击,立即联系云厂商应急响应。