13
10
月
2026
CC 攻击(Challenge Collapsar)是指攻击者用大量看似"正常"的请求消耗服务器资源,导致正常用户访问不了。它不像 DDoS 那样靠流量打垮带宽,而是耗尽你的 CPU、内存、数据库连接。
特点是:每个请求看起来都合法,所以防火墙很难区分。这篇讲怎么识别、怎么应急、怎么长期防御。
面对攻击,选一个有防护能力的服务商很重要。财富云计算 提供云服务器与网络防护能力;内网服务、游戏服务端可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上,暴露面更小)。
一、怎么判断是不是被 CC 了
典型表现
| 现象 | 说明 |
|---|---|
| 网站突然变很慢或打不开 | 资源被耗尽 |
| 服务器 CPU 或负载飙升 | 大量请求在处理 |
| 但带宽没跑满 | 区别于流量型 DDoS |
| 访问日志里某个 IP 请求量巨大 | 少量 IP 高频请求 |
| 或来源 IP 非常多但行为一致 | 分布式 CC |
| 数据库连接数打满 | 动态页面被打 |
| Nginx 出现大量 499/502/504 | 后端处理不过来 |
快速确认
# ① 看负载和资源
uptime && free -h && top
# ② 看连接数
ss -s
ss -ant | awk '{print $1}' | sort | uniq -c
# ③ 统计访问最多的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -30
# ④ 统计最近几分钟的请求量
grep "$(date +'%d/%b/%Y:%H')" /var/log/nginx/access.log | wc -l
# ⑤ 看被请求最多的 URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
# ⑥ 看 User-Agent 分布
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20判断依据:
- 某个 IP 请求量是正常用户的几百倍 → 单点 CC
- 总 IP 数暴增但每个 IP 请求都不多 → 分布式 CC(较难防)
- User-Agent 高度一致或明显是脚本 → 低级 CC
- 集中在某几个动态 URL(搜索、登录、列表页)→ 针对业务瓶颈
二、应急响应(先让网站活过来)
1)直接封 IP(针对少量 IP 的攻击)
# 用 Nginx 封
# /etc/nginx/conf.d/block.conf
deny 1.2.3.4;
deny 5.6.7.0/24;nginx -t && systemctl reload nginx# 用防火墙封(更彻底,不消耗 Nginx 资源)
ufw deny from 1.2.3.4
iptables -A INPUT -s 1.2.3.4 -j DROP批量封禁(把日志里 Top IP 自动封掉):
#!/bin/bash
# 封掉访问量超过 500 次的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr \
| awk '$1 > 500 {print $2}' | while read ip; do
iptables -A INPUT -s $ip -j DROP
echo "$(date) 封禁 $ip" >> /var/log/anti-cc.log
done⚠️ 注意别把搜索引擎蜘蛛和正常用户封了,建议先看 UA 确认。
2)紧急限流(最有效)
在 Nginx 里加限流规则:
http {
# 按 IP 限流:每秒 10 个请求
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
# 限制单 IP 并发连接数
limit_conn_zone $binary_remote_addr zone=perconn:10m;
}
server {
limit_req zone=perip burst=20 nodelay;
limit_conn perconn 20;
# 关键接口更严格
location = /login.php {
limit_req zone=perip burst=3 nodelay;
}
location /search {
limit_req zone=perip burst=5 nodelay;
}
}nginx -t && systemctl reload nginx参数说明:
| 参数 | 含义 |
|---|---|
rate=10r/s | 每秒允许 10 个请求 |
burst=20 | 允许突发 20 个(超出排队) |
nodelay | 不排队,超出的直接返回 503 |
zone=perip:10m | 10MB 内存存状态,约能记录 16 万个 IP |
3)临时关闭高消耗功能
攻击往往针对搜索、评论等耗资源的接口:
location /search {
return 503 "服务繁忙,请稍后再试";
}或者临时关掉站点某些动态功能,保住主流程。
4)用 fail2ban 自动封
见《fail2ban 防暴力破解实战配置》,配一条 CC 规则:
[nginx-cc]
enabled = true
filter = nginx-cc
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 200
findtime = 60
bantime = 36005)云平台层面
- 开启云厂商提供的 DDoS/CC 防护(很多有免费基础版)
- 在安全组里临时封禁 IP 段
- 必要时临时升级带宽和配置(扛过去再降回来)
三、长期防御方案
方案一:CDN(最推荐)
把网站接入 CDN 后:
用户 → CDN 节点 → 源站好处:
- 隐藏源站 IP,攻击者直接打不到你的服务器
- CDN 节点分散流量,自带抗攻击能力
- 大多数 CDN 提供 CC 防护(频率限制、JS 挑战、验证码)
- 静态资源由 CDN 提供,源站压力骤降
关键:接入 CDN 后一定要隐藏源站 IP:
# 防火墙只允许 CDN 的 IP 段访问 80/443
# 否则攻击者绕过 CDN 直接打源站,防护形同虚设# 只允许 CDN IP 段(示例)
allow 173.245.48.0/20;
allow 103.21.244.0/22;
deny all;各 CDN 厂商都会公布自己的 IP 段,去官方文档查。
方案二:静态化 / 缓存
CC 打的是动态页面(要查数据库、要执行 PHP)。把这些页面缓存起来,攻击就打不动了。
Nginx 页面缓存:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=pcache:100m
max_size=1g inactive=10m use_temp_path=off;
server {
location / {
proxy_cache pcache;
proxy_cache_valid 200 302 5m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_cache_background_update on;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://backend;
}
}Redis 缓存查询结果:把数据库查询结果缓存 5 分钟,数据库压力降 90%。
整站静态化:内容不常变的站点直接生成 HTML,攻击完全无效(成本最低的方案)。
方案三:WAF
Web 应用防火墙能识别并拦截恶意请求:
| 类型 | 说明 |
|---|---|
| 云 WAF(CDN 自带) | 接入即用,推荐 |
| ModSecurity | 开源,需自己维护规则 |
| Naxsi | Nginx 模块,轻量 |
云 WAF 通常带:
- 频率限制
- JS 挑战(让浏览器执行 JS 才能访问,脚本过不了)
- 验证码
- 人机识别
- 恶意 IP 库
方案四:架构层面
- 动静分离:静态资源走 CDN/对象存储
- 读写分离:数据库主从,读请求分散
- 加机器 + 负载均衡:单台扛不住就横向扩展
- 队列削峰:把请求放入队列异步处理
- 降级方案:高峰期自动关闭非核心功能
四、Nginx 限流配置详解
按 IP 限流
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;按 URI 限流(保护特定接口)
limit_req_zone $binary_remote_addr$request_uri zone=peruri:10m rate=2r/s;
location /api/ {
limit_req zone=peruri burst=5 nodelay;
}限制并发连接
limit_conn_zone $binary_remote_addr zone=perconn:10m;
limit_conn perconn 10;限制带宽(防下载拖垮)
limit_rate_after 1m; # 前 1MB 不限速
limit_rate 100k; # 之后限速 100KB/s限流的响应码
默认是 503,可以改成 429(Too Many Requests):
limit_req_status 429;
limit_conn_status 429;白名单(不限制搜索引擎和自家 IP)
geo $limited {
default 1;
127.0.0.1 0;
你的IP 0;
# CDN 段
173.245.48.0/20 0;
}
map $limited $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=perip:10m rate=10r/s;五、识别与拦截恶意流量
按 User-Agent 拦截
if ($http_user_agent ~* (scrapy|curl|wget|python-requests|AhrefsBot|SemrushBot|MJ12bot)) {
return 403;
}空 UA 也要小心(很多脚本不带 UA):
if ($http_user_agent = "") {
return 403;
}拦截异常请求特征
# 非 GET/POST 方法
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}
# 异常的 URL
location ~* (\.\./|/etc/passwd|\.env|\.git) {
return 403;
}按请求频率识别(配合日志分析)
# 找出 1 分钟内请求超过 100 次的 IP
grep "$(date +'%d/%b/%Y:%H:%M')" /var/log/nginx/access.log \
| awk '{print $1}' | sort | uniq -c | awk '$1 > 100 {print $2}'六、监控与告警
被攻击时能第一时间知道很重要:
#!/bin/bash
# /usr/local/bin/cc-monitor.sh
LOG=/var/log/nginx/access.log
THRESHOLD=1000
# 统计最近 1 分钟的请求数
COUNT=$(grep "$(date +'%d/%b/%Y:%H:%M')" $LOG | wc -l)
if [ "$COUNT" -gt "$THRESHOLD" ]; then
echo "$(date) 请求量异常: $COUNT/分钟" >> /var/log/cc-alert.log
# 发告警(钉钉示例)
curl -s -X POST 'https://oapi.dingtalk.com/robot/send?access_token=xxx' \
-H 'Content-Type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"CC 攻击告警:当前 ${COUNT} 请求/分钟\"}}"
fi* * * * * /usr/local/bin/cc-monitor.sh监控指标:
- 每分钟请求数(突增就是信号)
- 独立 IP 数(暴增说明分布式)
- CPU / 负载
- Nginx 5xx 数量
- 数据库连接数
七、攻击后的复盘
攻击结束后要做的事:
- 分析日志:攻击来自哪些 IP、打了哪些接口、什么时间
- 找薄弱点:哪个接口被打垮了?为什么?(通常是没缓存、查询慢)
- 优化瓶颈:给被打的接口加缓存、加索引、做静态化
- 补防护:加限流规则、上 CDN、配 WAF
- 写预案:下次被打时按什么步骤处理,提前写好脚本
把预案脚本化——被攻击时人容易慌,提前准备好"一键限流""一键封 IP"的脚本,比临时想办法高效得多。
八、CC 与其他攻击的区别
| 类型 | 特点 | 主要防御 |
|---|---|---|
| CC | 应用层,请求看似正常,耗 CPU/数据库 | 限流、缓存、WAF、CDN |
| DDoS(流量型) | 网络层,用海量流量塞满带宽 | 高防 IP、CDN、运营商清洗 |
| SYN Flood | 半连接耗尽 | 内核参数、高防 |
| 慢速攻击(Slowloris) | 慢速发请求占住连接 | 限制连接超时、Nginx 配置 |
| 暴力破解 | 反复试密码 | fail2ban、密钥登录 |
慢速攻击防护:
client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 10s;
keepalive_timeout 30s;九、防护清单
- [ ] 接入 CDN 并隐藏源站 IP
- [ ] 防火墙只放行 CDN IP 段访问 80/443
- [ ] Nginx 配置限流(limit_req / limit_conn)
- [ ] 静态资源走 CDN / 对象存储
- [ ] 动态页面加缓存(Nginx cache 或 Redis)
- [ ] 装 fail2ban
- [ ] 配置监控告警(请求量、CPU、5xx)
- [ ] 准备应急脚本(一键封 IP、一键限流)
- [ ] 数据库查询优化(被打的多是慢查询接口)
- [ ] 定期备份(万一扛不住要能快速恢复)
抗攻击能力很大程度上取决于服务商的网络防护。财富云计算 提供云服务器与网络层面的防护能力;把源站放在 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上)后面,通过映射/CDN 暴露服务,能减少直接被打到的面。重要业务建议配合 CDN 与云 WAF。
相关阅读:
- 《fail2ban 防暴力破解实战配置》
- 《网站常见漏洞与基础防护》
- 《网站打开慢的排查流程》
- 《Nginx 反向代理与多站点配置》
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]# ^."(Baiduspider|Googlebot|bingbot|Sogou|360Spider)."$防误伤三原则:搜索引擎 UA 加白(影响 SEO 的大事)自己的办公 IP 加白(fail2ban 的 ignoreip)封禁阈值别太狠(404 阈值 20/分钟比较稳,5 太激进)搜索引擎友好性见网站 SEO 基础优化指南。七、被扫描时的日常心态说句实话:被扫是常[...]
2026-10-15 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复