怎么防CC攻击:从限速到人机校验的实操配置
CC攻击本质是用大量看起来正常的请求占满网站连接或应用处理能力,防它的核心不是封一个IP就完事,而是按“限速→人机校验→清洗”分层处理。
下面按实际操作顺序讲清楚怎么防CC攻击,适合已经上线、能登录服务器或宝塔面板的网站。
先确认是不是CC攻击,再决定防哪一层
不要一看到网站慢就加防火墙。
先看两个地方:
- 服务器连接数:执行
ss -ant | awk '{print $1}' | sort | uniq -c,如果ESTAB数量异常高,且来源IP集中,偏连接型CC。 - 访问日志:查看 Nginx 日志里同一IP、同一URL的请求频率,例如
awk '{print $1}' /www/wwwlogs/access.log | sort | uniq -c | sort -rn | head。如果某个IP几分钟内请求上千次,基本可以确认。
确认后再动手。
如果攻击流量已经打满带宽,源站限速意义不大,应优先接入CDN或高防清洗,源站只放行回源IP。
用Nginx限速挡住高频请求
Nginx 的 limit_req 和 limit_conn 是成本最低的第一道防线,适合请求频率明显异常的CC。
在 http 块内定义限速区域,例如:
http {
limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;
}
然后在 server 或 location 中引用:
location / {
limit_req zone=req_per_ip burst=20 nodelay;
limit_conn conn_per_ip 20;
proxy_pass http://127.0.0.1:8080;
}
rate=10r/s 表示每个IP每秒最多10个请求,burst=20 允许短暂突发,nodelay 表示突发请求也立即处理。
数值不要照抄,按自己网站正常访问量调整。
配置后执行 nginx -t 检查语法,再 nginx -s reload 重载。
注意:限速对共享出口IP(如公司、学校)可能误伤,建议先只对登录、搜索、提交表单等动态接口加严格限速,静态资源单独放行。
给动态接口加人机校验或WAF规则
如果攻击请求伪装得像正常用户,单靠频率限制不够。
登录、注册、短信发送、搜索接口应加验证码或人机校验;
宝塔面板可在“网站→设置→网站防火墙”中开启CC防护,设置单IP每分钟请求上限和自动封禁时长。
使用云WAF时,把域名解析切到WAF提供的CNAME,源站防火墙只允许WAF回源IP访问。
这一步的判断条件是:攻击集中在少数动态URL且请求参数有规律。
如果攻击分散在全站,优先做全局限速和CDN清洗。
避开几个常见误区
- 只封IP不够:攻击者可能用代理池轮换IP,封禁列表很快膨胀,反而拖慢Nginx。
- 限速值设得太低:正常用户也会被429或503拦截,上线前先用日志统计正常峰值。
- 源站IP暴露:即使开了CDN,如果源站IP能从历史DNS、邮件头或扫描中查到,攻击者可以绕过CDN直打源站。源站安全组应只放行CDN回源IP。
验证防护是否生效
改完配置后不要只看网站能不能打开。
执行 tail -f /www/wwwlogs/access.log 观察请求是否被限速返回503,或用 ab、wrk 在测试环境模拟高频请求,确认触发限速且正常请求不受影响。
同时监控服务器 ESTAB 连接数和CPU,如果攻击期间连接数不再飙升、网站可正常访问,说明防护起作用。
如果做完限速和WAF仍然被打满,说明攻击量超出源站承受范围,需要接入高防IP或CDN清洗,而不是继续在Nginx上调参数。
常见疑问
限速会不会影响百度蜘蛛? 会。
建议对搜索引擎IP段放行,或把静态页面和动态接口分开限速,避免误伤收录。
宝塔防火墙和Nginx限速要同时开吗? 可以同时用,但规则不要重复叠加过严。
先开Nginx限速做基础防护,再用宝塔防火墙做IP封禁和CC规则。
防CC需要换服务器吗? 不一定。
请求量在服务器处理能力内时,限速和人机校验就能缓解;
持续大流量攻击才考虑高防或CDN。