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:10m10MB 内存存状态,约能记录 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  = 3600

5)云平台层面

  • 开启云厂商提供的 DDoS/CC 防护(很多有免费基础版)
  • 在安全组里临时封禁 IP 段
  • 必要时临时升级带宽和配置(扛过去再降回来)

三、长期防御方案

方案一:CDN(最推荐)

把网站接入 CDN 后:

用户 → CDN 节点 → 源站

好处:

  1. 隐藏源站 IP,攻击者直接打不到你的服务器
  2. CDN 节点分散流量,自带抗攻击能力
  3. 大多数 CDN 提供 CC 防护(频率限制、JS 挑战、验证码)
  4. 静态资源由 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开源,需自己维护规则
NaxsiNginx 模块,轻量

云 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 数量
  • 数据库连接数

七、攻击后的复盘

攻击结束后要做的事:

  1. 分析日志:攻击来自哪些 IP、打了哪些接口、什么时间
  2. 找薄弱点:哪个接口被打垮了?为什么?(通常是没缓存、查询慢)
  3. 优化瓶颈:给被打的接口加缓存、加索引、做静态化
  4. 补防护:加限流规则、上 CDN、配 WAF
  5. 写预案:下次被打时按什么步骤处理,提前写好脚本

把预案脚本化——被攻击时人容易慌,提前准备好"一键限流""一键封 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 反向代理与多站点配置》
延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:PHP-FPM 安装与性能调优:让 PHP 站点快起来还省内存
  2. 下一篇:静态网站部署与 CDN 加速:博客、文档站、官网的最佳方案
发表评论 2

取消回复