在网站维护过程中,不止一次地遭遇过CC攻击的困扰。这种看似普通请求却能让服务器窒息的攻击方式,往往在你最忙的时候不期而至。今天,我想分享一些实战经验,帮助各位站长构建有效的CC攻击防御体系。

CC攻击的真面目

CC攻击(Challenge Collapsar)本质上是一种应用层DDoS攻击。与传统DDoS不同,CC攻击不依靠海量流量冲击网络带宽,而是模拟正常用户行为,发送大量看似合法的HTTP/HTTPS请求,专门针对网站应用层资源进行消耗。

一次典型的CC攻击可能是这样的:攻击者控制数千台肉鸡,每台每秒向你的网站登录页面发送几个请求,这些请求会触发数据库查询、缓存读取等一系列资源消耗操作,最终导致服务器CPU飙升、内存耗尽、数据库连接池被占满。

多层次防御策略

1. 前端防御层

部署专业CDN服务

市面上主流CDN提供商如Cloudflare、Akamai、阿里云CDN等都提供了不错的CC防护能力:

  • Cloudflare的"I'm Under Attack"模式会对每个访客进行JavaScript挑战
  • 阿里云CDN的频率控制功能可以限制单IP访问频次
  • 腾讯云CDN的自定义CC防护规则支持多维度防护策略

使用开源CDN防护工具

对于预算有限的站长,可以考虑一些开源CDN解决方案:

  • Nginx Plus 提供高级流量管理功能
  • OpenResty 结合Lua脚本可以实现复杂的防护逻辑
  • Traefik 内置的中间件支持IP过滤和速率限制

2. 服务器层防御

配置Web服务器限流

Nginx配置示例:

# 创建共享内存区域用于存储IP访问状态
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;

server {
    # 限制单IP并发连接数
    limit_conn conn_limit_per_ip 15;
    
    # 限制请求频率,允许短时突发
    limit_req zone=req_limit_per_ip burst=20 nodelay;
    
    # 当触发限制时返回自定义错误页
    limit_req_status 429;
    limit_conn_status 429;
    
    # 其他配置...
}

Apache配置示例:

<IfModule mod_evasive20.c>
    DOSHashTableSize 3097
    DOSPageCount 5
    DOSSiteCount 50
    DOSPageInterval 1
    DOSSiteInterval 1
    DOSBlockingPeriod 60
</IfModule>

部署开源WAF防护

ModSecurity 是一款功能强大的开源WAF,可以与Apache、Nginx等Web服务器集成:

# 安装ModSecurity for Nginx
apt-get install libmodsecurity3 libmodsecurity-dev

# 下载并配置OWASP核心规则集
git clone https://github.com/coreruleset/coreruleset.git
cp coreruleset/crs-setup.conf.example /etc/nginx/modsecurity/crs-setup.conf
cp -r coreruleset/rules/ /etc/nginx/modsecurity/

ModSecurity配置示例:

# 启用CC攻击防护规则
SecRule IP:REQUEST_RATE "@gt 100" \
    "id:1000,phase:1,deny,status:429,msg:'Potential CC attack identified'"

另一款备受好评的开源WAF是NAXSI,专为Nginx设计,性能优异:

# NAXSI配置示例
location / {
    naxsi_extensive_log;
    naxsi_flag_enable;
    include /etc/nginx/naxsi_core.rules;
}

动态IP封禁工具

Fail2ban 是一个非常实用的安全工具,可以监控日志文件并根据预设规则自动封禁可疑IP:

# /etc/fail2ban/filter.d/nginx-cc.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*" 429
ignoreregex =
# /etc/fail2ban/jail.local
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 60
bantime = 7200

Crowdsec 是一款新兴的开源安全工具,类似于分布式的Fail2ban,能够共享威胁情报:

# 安装CrowdSec
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt-get install crowdsec

# 安装Nginx插件
sudo apt install crowdsec-nginx-bouncer

# 配置Nginx集成
sudo cscli bouncers add nginx-bouncer

3. 应用层防御

验证码与人机识别

在关键操作前添加验证码挑战是防御CC攻击的有效手段。除了常见的Google reCAPTCHA外,还可以考虑一些开源替代品:

自定义JavaScript

我在实战中发现,通过前端JavaScript执行一些计算任务,可以有效验证客户端是否为真实浏览器:

// 简单的JavaScript挑战示例
function generateToken() {
    const timestamp = Date.now();
    const randomStr = Math.random().toString(36).substring(2, 15);
    const challenge = timestamp + randomStr;
    
    // 执行一些计算密集型操作
    let hash = 0;
    for (let i = 0; i < 10000; i++) {
        hash = ((hash << 5) - hash) + challenge.charCodeAt(i % challenge.length);
        hash |= 0;
    }
    
    return btoa(challenge + ':' + hash);
}

// 页面加载时生成令牌并附加到后续请求
document.addEventListener('DOMContentLoaded', function() {
    const token = generateToken();
    // 存储令牌用于后续请求
    localStorage.setItem('requestToken', token);
});

请求节流与队列

在高流量网站中,我们实施了请求队列系统,效果显著:

<?php
// PHP实现的请求节流与队列
function throttleRequest($ip, $endpoint, $limit = 60, $period = 60) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    
    $key = "throttle:{$endpoint}:{$ip}";
    $queueKey = "queue:{$endpoint}";
    
    // 检查IP是否已被限流
    $current = $redis->incr($key);
    if ($current === 1) {
        $redis->expire($key, $period);
    }
    
    if ($current > $limit) {
        // 超出限制,加入队列或拒绝
        $queuePosition = $redis->rpush($queueKey, $ip);
        $queueLength = $redis->llen($queueKey);
        
        if ($queueLength > 1000) { // 队列长度限制
            header('HTTP/1.1 429 Too Many Requests');
            echo json_encode(['error' => '服务繁忙,请稍后再试', 'retry_after' => 30]);
            exit;
        }
        
        // 返回排队信息
        header('HTTP/1.1 429 Too Many Requests');
        echo json_encode(['error' => '请求频率过高,已加入队列', 'queue_position' => $queuePosition]);
        exit;
    }
    
    // 请求通过,继续处理
    return true;
}
?>

4. 开源防CC工具集成方案

以下几款开源工具在防御CC攻击中表现出色:

1. Lua-Resty-WAF

这是一个基于OpenResty的高性能WAF,专为防御各类Web攻击设计:

http {
    init_by_lua_block {
        -- 加载WAF模块
        local lua_resty_waf = require "resty.waf"
    }
    
    server {
        location / {
            access_by_lua_block {
                local waf = require "resty.waf"
                local instance = waf:new()
                
                -- 配置WAF规则
                instance:set_option("debug", true)
                instance:set_option("mode", "ACTIVE")
                
                -- 启用CC防护
                instance:exec()
            }
        }
    }
}

2. Nginx-Limit-Req-Vhost

这个Nginx模块允许你为不同的虚拟主机设置不同的请求限制策略:

http {
    # 为不同网站定义不同限流策略
    limit_req_zone $binary_remote_addr zone=blog:10m rate=1r/s;
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
    limit_req_zone $binary_remote_addr zone=static:10m rate=100r/s;
    
    server {
        server_name blog.example.com;
        limit_req zone=blog burst=5;
    }
    
    server {
        server_name api.example.com;
        limit_req zone=api burst=20;
    }
}

3. Gatekeeper

Gatekeeper是一个基于DPDK的高性能DDoS防护系统,适合大型网站使用:

# 安装Gatekeeper
git clone https://github.com/AltraMayor/gatekeeper.git
cd gatekeeper
make

# 配置示例
./build/gatekeeper -l 0-3 -n 4 -- \
    --log-level 8 \
    --gk-config config/static-gatekeeper.lua

4. Deflect

Deflect是一套完整的开源DDoS缓解系统,专为保护新闻和人权网站设计:

# 克隆项目
git clone https://github.com/equalitie/deflect.git
cd deflect

# 使用Docker部署
docker-compose up -d

5. 云锁

云锁是领先的主机安全解决方案(cwpp云工作负载保护平台),支持windows/linux服务器跨平台实时、批量、远程安全管理。云锁会7*24小时无间断守护业务系统,持续对企业业务系统进行学习并识别业务的风险点,通过防御模块减少风险面,在检测到未知威胁和业务资产变更时,能自动调整安全策略,帮助用户有效抵御CC攻击、SQL注入、XSS跨站攻击、溢出攻击、暴力破解、提权等黑客攻击,及病毒、木马、后门等恶意代码。发生安全事件后,云锁能自动回溯攻击过程,并形成事件分析报告,为企业提供入侵取证及攻击源分析的能力。进而形成“业务资产管理 - 风险识别 - 安全防御 - 威胁感知 - 攻击事件回溯”的一体化安全防御体系。

直接进入官网下载安装就好。

5. 监控与响应系统

实时流量监控

使用Netdata进行实时系统监控:

# 一键安装Netdata
bash <(curl -Ss https://my-netdata.io/kickstart.sh)

结合PrometheusGrafana构建完整监控系统:

# prometheus.yml配置片段
scrape_configs:
  - job_name: 'nginx'
    static_configs:
      - targets: ['localhost:9113']
    metrics_path: /metrics

日志分析工具

GoAccess是一款实时Web日志分析器,可以帮助发现异常访问模式:

# 实时分析Nginx访问日志
goaccess /var/log/nginx/access.log -c --real-time-html > /var/www/html/report.html

ELK Stack提供更强大的日志分析能力:

# 使用Filebeat收集Nginx日志
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  fields:
    log_type: nginx_access

高级防御策略

1. 基于行为分析的防护

在我管理的一个高流量电商网站中,我们开发了一套基于用户行为分析的防护系统:

# 简化版的行为分析代码
def analyze_user_behavior(session_data):
    # 计算行为指标
    metrics = {
        'pages_per_minute': session_data['page_count'] / (session_data['duration'] / 60),
        'click_depth': session_data['click_depth'],
        'mouse_movement': session_data['has_mouse_movement'],
        'form_interaction': session_data['form_interaction'],
        'time_on_page_variance': np.var(session_data['time_on_pages'])
    }
    
    # 根据经验阈值判断
    if (metrics['pages_per_minute'] > 20 and 
        metrics['click_depth'] < 1.2 and
        not metrics['mouse_movement'] and
        metrics['time_on_page_variance'] < 0.5):
        return 'bot'
    
    return 'human'

2. 蜜罐技术

蜜罐技术是我非常推崇的一种防护手段,在多个项目中都取得了良好效果:

<!-- 蜜罐链接,普通用户看不到但爬虫会访问 -->
<a href="/admin-login" style="position: absolute; left: -9999px; top: -9999px;">管理入口</a>
<input type="hidden" name="honey_field" value="">
# Nginx配置识别蜜罐访问
location /admin-login {
    access_log /var/log/nginx/honeypot.log;
    
    # 执行封禁脚本
    access_by_lua_block {
        local ip = ngx.var.remote_addr
        os.execute("ipset add blacklist " .. ip .. " timeout 86400")
        ngx.log(ngx.WARN, "Honeypot triggered by IP: " .. ip)
    }
    
    return 301 https://www.example.com/;
}

实战案例分享

去年我负责的一个外贸独立站遭遇了持续一周的CC攻击,通过以下措施成功防御:

  1. 首先部署aws cdn作为第一道防线
  2. 服务器层面配置了Nginx限流和启用waf。配置waf规则
  3. 对关键API接口增加了hCaptcha验证
  4. 使用Fail2ban自动封禁异常IP
  5. 实施JavaScript动态令牌验证

攻击高峰期,我们每小时封禁了约2000个恶意IP,但网站始终保持了95%以上的可用性。

结语

防御CC攻击是一场持续的"军备竞赛",攻击者不断改进技术,防御者也需要不断创新。通过构建多层次、自适应的防护体系,结合最新技术和最佳实践,我们可以有效保护网站免受CC攻击的影响。

记住,最好的防护不是单一技术,而是整合多种方法的综合策略。希望本指南能帮助您构建更安全、更可靠的网站防护系统。

"安全不是产品,而是过程。" - Bruce Schneier

标签: none