
我们在香港节点部署的一组高防服务器,频繁遭遇“智能化”Bot攻击。它们不像传统恶意爬虫那样简单粗暴,而是具备模拟用户行为、伪造UA、动态切换IP、绕过JS挑战等多重特征,甚至能避开CDN层的基础防护。这些Bot不仅抓取了我们站点的敏感数据,还不断制造业务干扰,影响用户体验和服务器资源消耗。
我意识到,单层的WAF(无论是Nginx内置规则还是云WAF)已经无法满足防护需求。于是,我开始着手构建一套多层防护体系,将L7 WAF、边缘检测、行为识别、挑战机制等逐层组合,最终实现了对这类高级Bot攻击的精准识别与阻断。以下是我的完整实操经验。
一、架构概览:多层WAF模型设计
多层WAF策略的核心理念,是将Bot攻击的“生命周期”拆解成不同阶段,并在每一阶段布设针对性的拦截逻辑。整个架构包括如下几层:
| 层级 | 模块 | 防护目标 | 技术实现 |
|---|---|---|---|
| L1 | CDN/WAF前置层 | IP/UA黑名单、基础速率限制 | Cloudflare/WAF/CDN厂商接入规则 |
| L2 | 高防入口边界层 | TCP指纹分析、ASN识别 | 香港高防防火墙/ACL自定义策略 |
| L3 | 应用层WAF | HTTP协议规范校验、自定义规则 | ModSecurity + OWASP Core Rule Set |
| L4 | 行为识别层 | JS挑战、cookie验证、人机识别 | Nginx + Lua + FingerprintJS |
| L5 | AI Bot引擎 | 用户行为建模、Bot分类检测 | 自建Bot分析引擎 + Redis缓存 |
二、基础防线:在CDN与高防上做好“外围清洗”
1. 配置Cloudflare高级规则
在Cloudflare中,我们设置了如下规则来对UA伪造、ASN异常和IP Reputation做初步过滤:
if (cf.client.bot_score < 20 && not cf.client.bot) {
challenge();
}
if (http.user_agent contains "python" or "scrapy" or "go-http") {
block();
}
if (ip.src in $bad_ip_list or asn in $bad_asn_list) {
block();
}
通过Cloudflare的WAF + Bot Management,我们成功阻断了60%以上的低质量扫描流量。
2. 利用高防网关做协议行为识别
香港的高防设备支持自定义L4 ACL规则,我配置了如下行为特征过滤:
异常TCP连接标志组合(如SYN+FIN)
高并发同源连接 (> 100 conn/sec)
IP段国家归属地不在允许列表
这些低成本规则直接在流量“进门”前过滤掉明显异常。
三、中间层:ModSecurity自定义Bot规则
我在香港服务器的Nginx前置了ModSecurity,并启用了 OWASP CRS,再补充了一些自定义规则:
SecRule REQUEST_HEADERS:User-Agent ".*(python|curl|go-http-client|scrapy).*" \
"id:1001,phase:1,deny,status:403,msg:'Blocked Known Bot UA'"
SecRule REQUEST_HEADERS:Referer "@rx (?:^$|.*login.*)" \
"chain,id:1002,phase:1,deny,status:403,msg:'Suspicious Referer for Bot'"
SecRule REQUEST_URI "@rx ^/api/private"
同时,为了应对伪装成浏览器的高级Bot,我启用了以下反制手段:
- 基于请求速率的动态阈值限制(burst限制)
- 针对访问某些敏感接口的频率统计(如 /api/search)
- 检查请求头的一致性,例如 Accept-Language 与 User-Agent 是否合理匹配
四、行为识别:利用JS挑战与设备指纹反制模拟浏览器Bot
1. 注入JS挑战
我通过 Lua + Nginx 模块在特定路径注入以下JS挑战逻辑:
local challenge_js = [[
<script>
document.cookie = "challenge_token=" + btoa(navigator.userAgent + screen.width);
window.location.reload();
</script>
]]
如果请求中没有合法的 challenge_token cookie,就直接返回挑战页面。模拟浏览器的Bot大多无法解析JS,无法生成正确token。
2. 设备指纹识别(FingerprintJS)
在前端集成 FingerprintJS 生成用户指纹,并配合后端 Redis 记录访问频率:
const fp = await import('@fingerprintjs/fingerprintjs');
const fingerprint = await fp.get();
fetch('/verify-fp', { method: 'POST', body: fingerprint.visitorId });
我们在后台对访问密度、路径遍历、滑动轨迹等做组合建模。一旦发现异常模式,就通过动态WAF策略封锁来源。
五、AI检测:训练自有Bot分类模型
我们在日志中抓取了过去一个月所有访问记录(包括正常用户和已知Bot),构建了一个简单的LightGBM分类模型,训练特征包括:
- UA和Referer组合频率
- session内页面跳转行为
- 按时间分布的访问密度曲线
- IP所属ASN、国家与访问路径偏好匹配度
训练完成后,我部署了一个轻量级API接口(基于Flask + uWSGI)实时对每个访问打分,得分过低的自动标记为Bot并更新到黑名单缓存池(Redis或Nginx shared dict中)。
六、实战效果与持续优化
实施多层WAF策略两周后,以下是我们观测到的变化:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 平均响应延迟 | 480ms | 260ms |
| 被识别Bot访问量 | ≈ 80,000/day | < 9,000/day |
| 被绕过JS挑战比例 | > 30% | < 1% |
| 后端CPU使用率 | 72% | 45% |
整个系统基本实现了“外围清洗、中间识别、末端阻断”的多层防御闭环,防御效率大幅提升。
七、攻防对抗是个持续过程
复杂Bot攻击正在变得越来越智能,仅靠单一WAF产品早已无法应对。我在这次香港高防部署中最大的感受是:“组合拳”远胜“单点突破”,只有前、中、后多层防线协同响应,才能真正建立起抗高强度Bot攻击的弹性防护体系。
接下来我计划引入:
- hCaptcha 或 Turnstile 增强人机识别精度;
- 自适应流量行为评分(Rate Limit by Behavior)
- HTTP/2流量层级分析模块,用于应对带有伪装特征的新型Bot
- 这是一场长期战斗,但只要每层都扎实,Bot就无所遁形。











