CentOS服务器遭遇CC攻击(Challenge Collapsar,即HTTP Flood攻击)时,单靠系统自带的防火墙规则或Nginx限流模块往往不够用,因为攻击者会用大量分散的IP轮流发起请求,单个IP的请求频率并不高,传统限速策略很容易被绕过。最有效的解决方案之一就是部署CrowdSec——一个开源的、基于社区协作的入侵防御系统,它能实时从全球用户共享的IP黑名单中拉取恶意IP,自动封禁CC攻击源,同时还能根据你服务器的日志智能学习攻击特征。下面我会从安装配置、Nginx联动、社区黑名单同步、CC防御策略优化这几个维度,把整套方案讲透。

一、为什么选CrowdSec而不是传统防火墙黑名单

传统做法是手动维护IP黑名单,比如用iptables或firewalld一条条加规则,或者用fail2ban这类工具。问题在于:第一,你只能封你自己发现的IP,面对分布式CC攻击,你根本封不过来;第二,黑名单更新慢,攻击者换一批IP你就得重新抓;第三,误封风险高,没有智能学习机制。CrowdSec的核心优势在于它是一个"群体免疫"系统——全球数万台服务器共享攻击情报,一个地方发现了恶意IP,几分钟内全球节点都能同步封禁。而且它自带行为分析引擎,不只是简单的IP封禁,还能识别异常请求模式。

二、CentOS上安装CrowdSec的完整步骤

首先确保你的CentOS版本是7或8(Stream也行),内核版本3.10以上。执行以下命令添加CrowdSec官方源并安装:

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.rpm.sh | sudo bash
sudo yum install crowdsec crowdsec-firewall-bouncer-iptables -y

安装完成后启动服务并设置开机自启:

sudo systemctl enable crowdsec
sudo systemctl start crowdsec

接下来需要注册一个CrowdSec账号(免费),去crowdsec.net注册后获取API Key,然后执行:

sudo cscli machines add centos-web-server --auto

系统会提示你输入API Key,粘贴进去即可。这一步完成后,你的服务器就正式加入了CrowdSec社区网络,开始接收和上报威胁情报。

三、配置Nginx日志采集让CrowdSec识别CC攻击

CrowdSec需要读取Web服务器日志才能分析攻击行为。默认它支持Nginx、Apache等主流Web服务器。你需要确认Nginx的access log格式是combined或自定义格式,然后告诉CrowdSec去哪里读日志。编辑CrowdSec的采集配置文件:

sudo vi /etc/crowdsec/acquis.yaml

在文件中添加或确认以下内容:

filenames:
  - /var/log/nginx/access.log
labels:
  type: nginx

保存后重启CrowdSec使配置生效:

sudo systemctl restart crowdsec

验证日志是否正常采集:

sudo cscli metrics

如果看到有日志行数在增长,说明采集正常。这时候CrowdSec已经在后台分析你的Nginx访问日志了。

四、安装和配置Bouncer实现自动封禁

Bouncer是CrowdSec的执行组件,负责把CrowdSec的决策(封禁某个IP)真正落实到防火墙上。CentOS上推荐用iptables-bouncer,前面安装命令里已经带了。配置文件在:

sudo vi /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml

确认以下关键配置项:

mode: iptables
update_frequency: 10s
api_url: http://127.0.0.1:8080/
api_key: YOUR_BOUNCER_API_KEY

获取Bouncer的API Key:

sudo cscli bouncers add iptablesBouncer

把生成的Key填入配置文件。然后启动bouncer:

sudo systemctl enable crowdsec-firewall-bouncer
sudo systemctl start crowdsec-firewall-bouncer

这时候,一旦CrowdSec判定某个IP是CC攻击源,bouncer会自动在iptables里加一条DROP规则,整个过程全自动,不需要人工干预。

五、安装CrowdSec社区CC攻击专用规则集

CrowdSec默认带了一些基础规则,但针对CC攻击需要额外安装社区贡献的规则集。执行以下命令查看可用规则:

sudo cscli hub list

你会看到很多规则集,重点安装以下几个:

sudo cscli hub install crowdsecurity/http-cve
sudo cscli hub install crowdsecurity/http-bf
sudo cscli hub install crowdsecurity/http-backdoors-attempts
sudo cscli hub install crowdsecurity/http-bad-user-agent
sudo cscli hub install crowdsecurity/http-crawl-non_statics

这些规则集分别针对:已知漏洞扫描、暴力破解、后门探测、恶意User-Agent、异常爬虫行为。安装完成后,CrowdSec的检测能力会大幅提升。安装完记得更新:

sudo cscli hub update

六、针对CC攻击的专项优化策略

光靠社区黑名单还不够,你还需要在本地做一些针对性配置。首先是Nginx层面的限流,在nginx.conf的http块中添加:

limit_req_zone $binary_remote_addr zone=cc_limit:10m rate=10r/s;

server {
    location / {
        limit_req zone=cc_limit burst=20 nodelay;
        # 其他配置...
    }
}

这表示每个IP每秒最多10个请求,突发允许20个。这个阈值需要根据你的业务调整,如果是API接口可以适当放宽,如果是静态页面可以收得更紧。

其次,在CrowdSec的本地配置中可以设置更激进的封禁策略。编辑:

sudo vi /etc/crowdsec/profiles.yaml

找到或添加针对CC的自定义场景,比如设置连续短时间内同一IP访问超过50次就触发封禁,封禁时长设为4小时或更长。CrowdSec支持自定义scenario,你可以根据自己的日志特征编写更精准的规则。

另外,建议开启CrowdSec的"主动模式"(active mode),让它不只是被动封禁,还能主动向社区上报你发现的攻击IP。这样你的服务器也在为社区做贡献,形成良性循环。在配置中确保:

source_ip: true

七、监控和日常维护要点

部署完成后不是一劳永逸的,你需要定期检查几个关键指标。第一,查看当前封禁的IP数量:

sudo cscli decisions list --type ban

第二,查看CrowdSec是否正常同步社区数据:

sudo cscli hub status

第三,检查bouncer是否正常工作,有没有报错:

sudo journalctl -u crowdsec-firewall-bouncer -f

建议每周执行一次规则集更新,每月检查一次误封情况。如果发现某个正常用户IP被封了,可以手动解封:

sudo cscli decisions delete --ip x.x.x.x

同时把这个IP加入白名单,避免再次误封。

八、实际效果和注意事项

根据社区用户反馈和我自己的测试经验,部署CrowdSec后CC攻击的有效请求量通常能下降70%-90%。但有几点需要注意:第一,CrowdSec不是万能的,对于使用高匿代理或肉鸡网络的高级CC攻击,社区黑名单可能覆盖不全,需要配合Nginx限流和CDN一起用;第二,不要把封禁时长设得太短,CC攻击者往往会反复试探,建议至少4小时起步;第三,如果你的服务器IP本身就是公开的,建议同时在云服务商的安全组层面做一层防护,形成多层防御体系。最后,CrowdSec是开源免费的,社区活跃度很高,规则更新频率基本是每天都有新增,这一点比很多商业WAF产品都要及时。

总结一下,CentOS上用CrowdSec做CC防御的核心逻辑就是:Nginx采集日志→CrowdSec智能分析+社区黑名单协同→Bouncer自动封禁iptables。这套组合拳打下来,基本能应对绝大多数CC攻击场景,而且运维成本很低,适合个人站长和中小企业服务器使用。