在阿里云 ECS 环境中配置防刷机制,核心思路是构建“网络层拦截 + 应用层限流”的多级防御体系。单纯依靠操作系统内核很难高效处理高并发下的 IP 频率控制,因此最佳实践是结合阿里云自带的云产品能力与服务器内部署的轻量级组件。
以下是几种主流且高效的配置方案,按推荐程度排序:
方案一:使用阿里云 WAF(Web 应用防火墙)—— 最推荐,零代码维护
如果你的业务有公网域名并接入 DNS 解析到阿里云 WAF,这是最简单、效果最好的方式。WAF 天然具备基于 IP 的频率限制功能。
- 进入控制台:登录阿里云控制台,找到 WAF 实例。
- 开启防护规则:在“访问控制”或“频率控制”模块中,新建一条规则。
- 配置频率限制:
- 限制对象:选择
IP。 - 请求路径:可指定特定接口(如
/api/login)或全路径。 - 阈值设置:例如,“单个 IP 在 60 秒内发起超过 10 次请求”。
- 动作:选择
阻断或验证码挑战(人机验证)。
- 限制对象:选择
- 优势:无需修改服务器配置,直接清洗流量,支持 CC 攻击防护,且能自动更新恶意 IP 库。
方案二:使用 SLB/ALB + Nginx/Lua —— 适合无 WAF 场景
如果没有使用 WAF,但使用了阿里云 SLB(传统型负载均衡)或 ALB(应用型负载均衡),可以在后端 Ecs 上部署 Nginx 进行精细控制。
步骤 1:确保真实 IP 传递
- 在 SLB/ALB 上启用 X-Forwarded-For 头透传。
- 在 Nginx 配置中,使用
real_ip_header X-Forwarded-For;和set_real_ip_from指令,让 Nginx 识别客户端真实 IP,而非负载均衡器的 IP。
步骤 2:Nginx 限流配置
在 nginx.conf 中使用 limit_req_zone 和 limit_req 指令:
http {
# 定义共享内存区域,用于存储 IP 计数器
# zone=ip_limit:10m 表示分配 10MB 内存,可存储约 16 万个 IP 状态
# rate=1r/s 表示每个 IP 每秒允许 1 个请求
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=1r/s;
server {
listen 80;
server_name your_domain.com;
location /api/ {
# 应用限流规则
# burst=5 表示允许突发 5 个请求,超出部分延迟处理
# nodelay 表示突发请求立即处理,不排队
limit_req zone=ip_limit burst=5 nodelay;
# 超限时返回 503 错误
limit_req_status 503;
proxy_pass http://backend_app;
}
}
}
注意:此方法仅适用于 HTTP/HTTPS 层。对于 TCP 层攻击(如 SYN Flood),需配合安全组或云盾。
方案三:使用 Redis + 应用代码实现 —— 最灵活,适合复杂逻辑
如果业务需要更复杂的策略(如不同用户角色不同频率、滑动窗口算法等),可在应用层通过 Redis 实现。
原理
利用 Redis 的原子操作和过期时间,记录每个 IP 的请求次数。
伪代码示例(以 Python Flask 为例)
import redis
from flask import Flask, request, jsonify
app = Flask(__name__)
redis_client = redis.Redis(host='your_redis_host', port=6379, db=0)
def check_rate_limit(ip, max_requests=10, window_seconds=60):
key = f"rate_limit:{ip}"
# 获取当前计数
current_count = redis_client.get(key)
if current_count is None:
# 首次请求,设置计数为 1,并设置过期时间为窗口期
redis_client.setex(key, window_seconds, 1)
return True
if int(current_count) >= max_requests:
return False # 触发限流
# 增加计数
redis_client.incr(key)
return True
@app.route('/api/data')
def get_data():
client_ip = request.headers.get('X-Real-IP') or request.remote_addr
if not check_rate_limit(client_ip):
return jsonify({"error": "Too Many Requests"}), 429
# 正常业务逻辑
return jsonify({"data": "success"})
关键优化点
- 使用 Lua 脚本:在高并发下,将获取计数、判断、递增操作封装为 Lua 脚本,保证原子性,避免竞态条件。
- 缓存本地化:若 QPS 极高,可在应用服务器本地使用
LocalStack或Guava Cache做一级缓存,再异步同步到 Redis,减少网络开销。
方案四:操作系统层面 iptables/firewalld —— 基础防护,适合简单场景
在 ECS 内部使用 Linux 防火墙进行粗略限流,适合防止恶意扫描,但不适合精确到“每秒请求数”的应用层控制。
# 安装 ipset(比直接使用 iptables 更高效)
yum install ipset -y
# 创建集合
ipset create blacklist hash:ip timeout 3600
# 添加规则:每分钟超过 100 个新连接的 IP 加入黑名单
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j DROP
iptables -A INPUT -p tcp --dport 80 -m recent --set --name block
iptables -A INPUT -p tcp --dport 80 -m recent --update --seconds 60 --hitcount 100 --name block -j DROP
缺点:无法区分 HTTP 请求类型,易误伤正常用户;性能随连接数增长而下降。
综合建议与注意事项
-
组合拳最有效:
- 第一层:阿里云 安全组 封锁已知恶意 IP 段。
- 第二层:WAF 或 SLB+Nginx 处理高频 CC 攻击。
- 第三层:应用层 Redis 限流 处理业务逻辑层面的防刷(如短信验证码、支付接口)。
-
IP 欺骗问题:
- 攻击者可能使用X_X池伪造大量 IP。此时应结合 行为分析(如 User-Agent、Cookie、JavaScript 指纹)和 人机验证(滑块、点选验证码)。
- 阿里云 WAF 自带智能机器人识别,建议开启。
-
监控与告警:
- 在阿里云 云监控 中设置 ECS CPU、带宽、Nginx 错误码(429/503)的告警阈值。
- 定期导出访问日志,分析异常 IP 模式。
-
合规性提醒:
- 所有限流措施应提供明确的错误提示(如 HTTP 429 Too Many Requests),便于前端友好展示。
- 不要对合法用户实施过度限制,建议通过白名单机制排除内部系统调用或可信合作伙伴 IP。
通过以上多层架构,你可以有效应对绝大多数基于 IP 的刷量攻击,同时保障正常用户体验。
CLOUD云枢