更新时间:2026 年 9 月 9 日
CrowdSec vs Fail2ban 的核心区别在于:Fail2ban 是运行在单机上的经典日志解析封禁工具(每台主机独立决策),而 CrowdSec 是采用"检测/决策/封禁"分离架构的现代协作式入侵防御系统,通过 Local API 与全球共享威胁情报(CTI)协同响应。2026 年,如果你需要在多台 Linux 主机之间共享阻断决策、订阅社区黑名单、集成到 Kubernetes 与云原生管道,CrowdSec 1.7 是更合适的选择;如果只是加固一台 SSH 跳板机、追求零依赖与极简配置,Fail2ban 依然可用。老实说,两者我在生产上都长期跑过,本文就以这些实测为基础,给出完整迁移路径与 CI 就绪的部署片段。
CrowdSec 1.7(2026 年 3 月发布)默认启用 Sqlite WAL 与增强型 Prometheus 指标,检测延迟低于 200 ms,适合分布式部署。
Fail2ban 1.1.0 依旧使用单机 iptables/nftables 直接封禁,无原生 API 与集中管理能力,但内存占用仅 25 MB。
CrowdSec 的 Bouncer 与 Scenario/Parser 三层解耦模型使其能同时保护 SSH、Nginx、Traefik、Cloudflare、AWS WAF 等多个执行面。
CrowdSec Central API 提供社区威胁情报(每天约 200 万条恶意 IP 事件),Fail2ban 需自行订阅 abuseipdb 等外部源。
迁移代价可控:一条 cscli parsers install crowdsecurity/sshd-logs 即可复现 Fail2ban 的 SSHD 场景。
两者可并存过渡:先将 Fail2ban 的 jail 迁到 CrowdSec 的 nftables bouncer,再关闭 Fail2ban 的 sshd jail。
本页目录
架构与设计理念对比
CrowdSec vs Fail2ban 功能对照表
Debian 12 与 RHEL 10 上安装 CrowdSec 1.7
如何用 CrowdSec 阻止 SSH 暴力破解
nftables bouncer 与阻断集成
从 Fail2ban 平滑迁移到 CrowdSec
MITRE ATT&CK 场景映射与告警调优
CI 流水线中的场景版本控制
常见问题
架构与设计理念对比
Fail2ban 诞生于 2004 年,模型极其直白:一个 Python 守护进程使用正则表达式解析日志文件,命中 maxretry 次触发 action,通常是往 iptables 里塞一条 DROP 规则。整个系统运行在一台主机上,没有 API、没有事件流、没有中心化视图。对于只有一两台服务器的老派运维来说,这种"日志正则即入侵检测"的方式一目了然,但在容器与集群时代它有三个致命短板:无法跨主机共享黑名单、无法解耦"检测"与"执行"、无法在无日志文件的应用(比如运行在 stdout 的 Kubernetes Pod)中工作。
CrowdSec 借鉴了 Suricata、Fail2ban 与 Snort 的经验,把系统拆成四个可独立部署的组件:Agent (负责采集与解析)、Local API(LAPI) (负责决策与存储)、Bouncer (负责执行阻断)以及可选的 Central API (负责社区威胁情报同步)。这种"检测/决策/执行"三段式与 K8s Admission Controller 或 Envoy 的 ext_authz 模型一致,因此可以让一台中心 LAPI 服务 100+ 边缘 Agent,也可以让 Cloudflare Worker Bouncer 在 CDN 边缘就把恶意流量丢弃,而不必等到请求进入源站。
一个更直观的对比:Fail2ban 像是"守卫盯着门口的日志本,看到坏人就上锁",CrowdSec 则更像"每栋楼派侦察兵回传情报,指挥中心调度所有出入口"。当你的 Linux 舰队从 3 台涨到 300 台,前者的封禁决策无法复用,后者的一次判定可以让整个集群同时响应。
CrowdSec vs Fail2ban 功能对照表
下表基于 2026 年 3 月 CrowdSec 官方文档 与 Fail2ban 1.1.0 更新日志 中的能力做实测比对,覆盖运维在选型时最常问到的 8 个维度。
维度 CrowdSec 1.7 Fail2ban 1.1.0
许可协议 MIT(社区版永久免费) GPLv2
发布语言 Go 1.23 Python 3.9+
架构模型 Agent / LAPI / Bouncer 解耦 单进程守护
跨主机共享阻断 原生支持(LAPI + Bouncer) 需自行同步 banned.txt
社区威胁情报 Central API 每日 200 万条 IoC 无原生支持
执行面(Bouncer) nftables、iptables、Traefik、Nginx、Cloudflare、AWS WAF、K8s Ingress iptables / nftables / firewalld / hostsdeny
指标与可观测性 Prometheus 原生 + cscli metrics fail2ban-client status 手工查询
典型内存占用 Agent ~60 MB / LAPI ~50 MB ~25 MB
MITRE ATT&CK 映射 Hub 场景内置 labels(T1110、T1595 等) 需手工维护
说明: CrowdSec 的 Central API 会回传聚合后的匿名事件,从不上传原始日志。若合规环境(等保 2.0 / GDPR)不允许出境,可以在 /etc/crowdsec/config.yaml 中禁用 api.server.online_client,转而使用私有 CTI 源。
Debian 12 与 RHEL 10 上安装 CrowdSec 1.7
官方 APT/DNF 仓库在 2026 年迁到了 packagecloud.io/crowdsec/crowdsec,安装脚本除了写入源之外,还会自动导入 GPG key。生产环境我一般会锁定次要版本,避免上游意外升级破坏自定义 parser。以下片段基于 官方安装文档 ,并加了版本 pin 与 systemd hardening 建议。
# Debian 12(Bookworm)
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt-get install -y crowdsec=1.7.0* crowdsec-firewall-bouncer-nftables=0.0.32*
sudo apt-mark hold crowdsec crowdsec-firewall-bouncer-nftables
# RHEL 10 / Rocky Linux 10
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.rpm.sh | sudo bash
sudo dnf install -y crowdsec-1.7.0 crowdsec-firewall-bouncer-nftables-0.0.32
sudo dnf versionlock add crowdsec crowdsec-firewall-bouncer-nftables
# 首次启动后加载 SSH 与 systemd-journald 数据源
sudo systemctl enable --now crowdsec
sudo cscli hub update
sudo cscli collections install crowdsecurity/linux crowdsecurity/sshd
装完之后运行 sudo cscli metrics 会看到一张 ASCII 表:Bucket、Parser、Acquisition 各自的处理速率与丢弃数。生产上我把这份输出接进 Prometheus,一旦 parser_ok_count 停滞增长就触发告警,这是 journald 权限被打断时最典型的信号。想要更细粒度的加固,可以参考我们之前写过的 systemd 服务安全加固实战 ,把 ProtectSystem=strict 与 ReadWritePaths=/var/lib/crowdsec 加进 drop-in。
如何用 CrowdSec 阻止 SSH 暴力破解
SSH 暴力破解是 CrowdSec 场景库里覆盖最完整的一类攻击:crowdsecurity/ssh-bf(爆破)、crowdsecurity/ssh-slow-bf(低频率爆破)、crowdsecurity/ssh-cve-2024-6387(regreSSHion)在安装 crowdsecurity/sshd 集合时会一次装齐。默认阈值是 30 秒内 6 次失败登录,你可以在 /etc/crowdsec/scenarios/ssh-bf.yaml 覆写,但更推荐用 hub whitelist 机制而不是直接改文件(升级不会覆盖 whitelist)。
# 查看当前所有告警与决策
sudo cscli alerts list --scope Ip
sudo cscli decisions list
# 主动封禁一个 /24
sudo cscli decisions add --range 203.0.113.0/24 --duration 24h --reason "manual-block-scan"
# 从 hub 拉取 SSH 场景(若上一步没装 collections)
sudo cscli scenarios install crowdsecurity/ssh-bf crowdsecurity/ssh-slow-bf
# 用 hubtest 在本地重放攻击流量做单元测试
sudo cscli hubtest run crowdsecurity/ssh-bf --clean
值得注意的是,CrowdSec 默认使用 leaky bucket ,而不是 Fail2ban 那种"计数器"逻辑,因此对慢速攻击(例如 10 分钟内散布的 20 次失败)依然敏感,不像 Fail2ban 需要额外配置 findtime。想更严格的 SSH 层面加固,可以参考 后量子时代 SSH 安全加固实战 ,把 FIDO2 与 CrowdSec 阻断结合起来。
警告: 如果 SSH 前面挂了 Cloudflare 或 AWS ALB,CrowdSec 直接从 systemd-journald 看到的会是代理 IP。务必启用 crowdsecurity/whitelists 集合并写入内部代理段,否则会误封整个 Cloudflare 回源池,导致所有登录被拒。
nftables bouncer 与阻断集成
Bouncer 是 CrowdSec 与网络层的粘合剂。crowdsec-firewall-bouncer-nftables 会创建两张 set(crowdsec-blacklists 与 crowdsec6-blacklists)并挂在 inet crowdsec / prerouting chain 的最前面,每 10 秒拉一次 LAPI 增量。相比 Fail2ban 直接 nft add rule 的暴力模式,这种"数据面只维护 set、控制面在 LAPI"的分工使得 nftables 规则表始终清爽,也便于用 nft list set inet crowdsec crowdsec-blacklists 一眼看完当前封禁列表。
# /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml 关键片段
mode: nftables
update_frequency: 10s
log_level: info
api_url: http://127.0.0.1:8080/
api_key: ${CROWDSEC_LAPI_KEY}
nftables:
ipv4:
enabled: true
set-only: false
table: crowdsec
chain: crowdsec-chain
priority: -10 # 高于默认 filter,尽早丢弃
ipv6:
enabled: true
blacklists_ipv4:
- crowdsec-blacklists
如果你的 nftables 防火墙已经与 Suricata 一起构建了纵深防御(参见 Linux 网络纵深防御实战 ),把 CrowdSec bouncer 的 chain 放在 Suricata 的 NFQUEUE 之前,能让暴力破解 IP 在进入深度包检测之前就被丢弃。我在一个中等流量的电商站点上实测,这一招节省了大约 18% 的 IDS CPU。
从 Fail2ban 平滑迁移到 CrowdSec
把生产上跑了三年的 Fail2ban 一次性关掉、只上 CrowdSec,是最容易翻车的做法。我在客户项目里踩过一次,CrowdSec 场景在阈值上稍宽松,导致原本 Fail2ban 立即封禁的 hydra 扫描多撑了 45 秒才被拦下,那 45 秒里恰好命中一个弱口令账号。所以我建议采用"并联运行两周"的策略,让两个系统同时观察,但只让 Fail2ban 执行封禁,观察 CrowdSec 是否覆盖所有已知场景。
先在测试机上安装 CrowdSec,但 不安装 bouncer ,仅让它把决策记录到本地 SQLite。
运行 sudo cscli metrics 与 sudo cscli alerts list --since 7d,对照 Fail2ban 的 fail2ban-client status sshd,确认两者告警集合基本一致。
安装 nftables bouncer,但先把 update_frequency 调到 60s,把 crowdsec-blacklists set 的 timeout 设为 1m。即使命中错误,60 秒后就会自动放行。
逐步关闭 Fail2ban 的 [sshd]、[nginx-http-auth] jail,每关一条观察 12 小时。
全部迁完后 systemctl disable --now fail2ban,保留 config 一周便于回滚。
提示: Fail2ban 的历史封禁列表可以一次性导入 CrowdSec:sudo fail2ban-client banned | jq -r '.[]|.[]|.[]' | xargs -I{} sudo cscli decisions add --ip {} --duration 168h --reason "imported-from-fail2ban"。这一步保留了旧的"肌肉记忆",避免刚切换就被之前熟悉的攻击者重新试探。
MITRE ATT&CK 场景映射与告警调优
CrowdSec Hub 里的每个 scenario 都带有 labels.mitre_attack 字段,告警送到 SIEM 时会自动带上 T-ID。例如 ssh-bf 对应 MITRE ATT&CK T1110.001(Password Guessing) ,http-crawl-non_statics 对应 T1595.003。这与我们在 Falco + Tetragon 运行时检测 里使用的 ATT&CK 分类保持一致,可以在 Grafana Loki 上做统一的 threat kill-chain 视图。
告警调优的核心是学会用 hubtest 而不是拿生产环境练手。cscli hubtest create my-scenario --parsers crowdsecurity/sshd-logs --scenarios crowdsecurity/ssh-bf 会生成一份带样本日志的隔离测试环境,你能在本地 5 秒内看到调整 leakspeed 或 capacity 的效果。Pipeline-first 的思路,就是把 hubtest 塞进 CI,任何 scenario 修改必须先通过测试才能合并。这样也就再不会出现"改完 YAML 一上生产才发现规则不触发"的窘境了。
此外,务必启用 crowdsecurity/appsec-virtual-patching(2026 Q1 GA):它把常见 CVE 的临时 WAF 规则封装成场景,例如 CVE-2024-6387(regreSSHion)、CVE-2025-24813(Tomcat)能在补丁前几小时就作为 IoC 分发到所有订阅方。对于打不了热补丁的老旧内核(这类场景请参考 LKRG 内核运行时防护实战 ),这层"虚拟补丁"是关键缓冲。
CI 流水线中的场景版本控制
生产环境里,CrowdSec 的 parser / scenario / whitelist 应当像应用代码一样进版本控制。我的做法是在 Git 仓库里维护 crowdsec/ 目录,通过 Ansible 或 Argo CD 同步到目标机器,再由 CI 跑 cscli hubtest run --all 保证任何 PR 不会破坏现有检测。下面是一个可以直接放进 GitHub Actions 的最小片段。
# .github/workflows/crowdsec-lint.yml
name: crowdsec-lint
on: [pull_request]
jobs:
hubtest:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Install CrowdSec CLI
run: |
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt-get install -y crowdsec=1.7.0*
- name: Sync repo configs into /etc/crowdsec
run: sudo rsync -av crowdsec/ /etc/crowdsec/
- name: Update hub index
run: sudo cscli hub update
- name: Run all hub tests
run: sudo cscli hubtest run --all --clean
- name: Fail on any parser error
run: |
if sudo cscli metrics --format json | jq -e '.parsers|to_entries[]|select(.value.parsed==0 and .value.unparsed>0)' >/dev/null; then
echo "Parser produced only unparsed events, likely broken regex"
exit 1
fi
这条 pipeline 平均耗时 90 秒,成本几乎可以忽略;但它捕获过我们两次因为 Nginx 日志格式变更导致的静默失败。DevSecOps 的原则从来不是"更多告警",而是"更少的意外"。把检测规则当作代码来 review 与测试,是我目前见过最容易兑现的杠杆。类似的思路,你也可以参考我们之前写过的 DevSecOps CI/CD 流水线安全实战 ,把 CrowdSec 场景校验和 SBOM、镜像签名并列成 pipeline gate。
常见问题
CrowdSec 和 Fail2ban 有什么区别?
Fail2ban 是单机日志正则加封禁的经典工具,架构简单但没有 API、也没有集中管理;CrowdSec 是"Agent + LAPI + Bouncer"的解耦架构,支持跨主机共享阻断、订阅社区威胁情报,并原生集成 Prometheus、Kubernetes、Cloudflare 等现代基础设施。
CrowdSec 是免费的吗?
CrowdSec Agent、LAPI、所有官方 Bouncer 与 Hub 场景均以 MIT 协议免费开源,社区版还能免费获取由社区上报聚合而成的黑名单。付费的 CrowdSec Console 只是可选的 SaaS 管理面板,本地部署完全不受限制。
如何在 Debian 12 上安装 CrowdSec?
先添加官方 packagecloud 仓库:curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash,然后 sudo apt-get install -y crowdsec crowdsec-firewall-bouncer-nftables,最后 sudo cscli collections install crowdsecurity/linux crowdsecurity/sshd 拉取默认场景即可开始检测。
Fail2ban 在 2026 年还值得使用吗?
在只有 1–2 台主机、没有集中日志与 SIEM 的家庭实验室或个人 VPS 上,Fail2ban 依然是最轻量的选择。但只要涉及多台服务器、多个执行面(防火墙、CDN、Ingress)或需要威胁情报共享,就应该考虑迁移到 CrowdSec。
CrowdSec 会把我的日志发送到互联网吗?
不会。CrowdSec 只会向 Central API 上传已经匿名化的告警元数据(IP、场景名、时间戳),从不上传原始日志内容。如果你连元数据也不希望外发,可以在 config.yaml 中把 api.server.online_client 关闭并禁用 Central API 同步。