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攻击场景,而且运维成本很低,适合个人站长和中小企业服务器使用。
