CrowdSec вместо Fail2Ban: стоит ли переходить и как это сделать

CrowdSec вместо Fail2Ban: стоит ли переходить
Быстрый ответ
CrowdSec vs Fail2Ban — кратко:
  • CrowdSec блокирует угрозы до атаки — благодаря коллективному блок-листу из миллиона+ серверов
  • Fail2Ban реагирует только после того как атака уже началась на твоём сервере
  • CrowdSec написан на Go — быстрее и экономит ресурсы по сравнению с Python-версией Fail2Ban
  • Переход с Fail2Ban на CrowdSec занимает 15-20 минут на Ubuntu/Debian
  • Для homelab и selfhosted — переходи. Для изолированного легаси-сервера без интернета — оставь Fail2Ban

Диагноз: почему Fail2Ban уже не тот

CrowdSec вместо Fail2Ban — этот вопрос всё чаще всплывает в чатах и на форумах. Ты поднял сервер, поставил Fail2Ban, настроил jail на SSH — и думаешь, что защищён. По факту нет.

Fail2Ban существует с 2004 года. Двадцать лет. Это не почётный возраст — это диагноз. Инструмент банит IP после того, как атака уже началась на твоей машине. Он не знает, что этот же IP три часа назад положил пять серверов в Германии. Он узнает только когда этот IP придёт к тебе и начнёт стучаться в SSH.

Что получишь из этой статьи:

Времени займёт: 20 минут на чтение, 15 минут на установку.

Как устроен Fail2Ban — и где он ломается

Fail2Ban читает лог-файлы по regex-паттернам. Нашёл N неудачных попыток за M секунд — добавил IP в iptables. Всё. Изолированная реактивная модель. Каждый сервер — остров.

Бан на сервере A никак не защищает сервер B. Атака с распределённой ботнет-сети, где каждый IP делает ровно 4 попытки вместо твоих 5 в настройках — прозрачна для Fail2Ban. Он просто не видит паттерн.

Проблема Fail2Ban Что происходит в реальности
Реактивная модель Бан только после атаки на твой сервер
Изолированный сервер Нет обмена информацией между серверами
Только regex по логам Не видит L7-паттерны, распределённые атаки
Python runtime Медленнее при высокой нагрузке на логи
Один уровень блокировки Только iptables, нет Application-layer бансинга
Нет IPv6 поддержки из коробки Требует дополнительной конфигурации

Для простого хоума с SSH и Nginx Fail2Ban работает. Но он работает как охранник, который смотрит в журнал только после того, как драка уже началась.

Как устроен CrowdSec — архитектура

CrowdSec запустили в 2020 году. Написан на Go. Концептуально это тот же Fail2Ban, но с одним принципиальным отличием — коллективным интеллектом. Когда твой сервер обнаруживает атакующий IP, он отправляет сигнал в центральную сеть. Все остальные участники получают этот IP в блок-лист ещё до того, как атака доберётся до них.

Архитектура состоит из трёх частей:

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
    A["Лог-файлы - SSH, Nginx, Auth"] --> B["Security Engine - парсер + сценарии"]
    B --> C["Local API - LAPI"]
    C --> D["Firewall Bouncer - nftables/iptables"]
    C --> E["Nginx Bouncer - HTTP 403/CAPTCHA"]
    C --> F["Cloudflare Bouncer - WAF"]
    C --> G["Central API - CrowdSec Cloud"]
    G --> H["Community Blocklist - 1M+ IP"]
    H --> C
    style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style B fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style C fill:#f8fafc,stroke:#94a3b8,stroke-width:2px,color:#1e293b
    style D fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style F fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style G fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
    style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d

Security Engine — читает логи, парсит через Grok-паттерны, сопоставляет с YAML-сценариями поведения. Это умнее regex Fail2Ban — сценарии описывают паттерн поведения, а не просто строку в логе.

Local API (LAPI) — центральный узел на твоей машине. Принимает решения о блокировке и раздаёт их боунсерам. Это ключевое архитектурное решение: детектирование и блокировка разделены. Ты можешь заблокировать на уровне файрвола, nginx, Cloudflare или всех трёх одновременно.

Bouncers — исполнители. Firewall bouncer пишет правила в nftables/iptables. Nginx bouncer возвращает 403. Cloudflare bouncer добавляет IP в WAF. Один детект — блокировка на всех уровнях.

CrowdSec vs Fail2Ban: таблица сравнения

Параметр Fail2Ban CrowdSec
Язык Python Go
Модель защиты Реактивная Превентивная + реактивная
Коллективный блок-лист Нет Да, 1M+ IP в реальном времени
IPv6 Ограниченно Полная поддержка
Детектирование Regex по логам Поведенческие сценарии + regex
Уровни блокировки iptables Firewall, nginx, Cloudflare, Traefik
Потребление CPU Низкое (idle) Низкое (Go binary)
Потребление RAM ~30-50 MB ~50-80 MB
Сложность настройки Средняя Средняя (сложнее первый раз)
Dashboard Нет app.crowdsec.net (опционально)
Передача данных Нет Только IP + timestamp + тип атаки
Docker поддержка Проблемная Нативная
Год запуска 2004 2020

По памяти CrowdSec чуть тяжелее — это плата за Go runtime и буферизацию данных LAPI. На VPS с 1 GB RAM это не критично. На Raspberry Pi Zero с 512 MB — уже считай.

Что CrowdSec отправляет в интернет

Важно: приватность
Сырые логи с твоего сервера никуда не уходят. CrowdSec отправляет только: IP-адрес атакующего, временную метку и название сценария (тип атаки). Никакого содержимого запросов, никаких URL, никаких данных пользователей. Если нужна полностью изолированная установка — отключи шаринг через cscli console disable share-signals.

Системные требования

Параметр Минимум Рекомендуется
ОС Ubuntu 20.04 / Debian 11 Ubuntu 22.04 / 24.04, Debian 12
CPU 1 vCPU 2 vCPU
RAM 512 MB 1 GB+
Диск 500 MB 1 GB (под логи и базу)
CrowdSec версия 1.6+ 1.6.8+ (актуальная на май 2025)
Файрвол backend iptables nftables (Ubuntu 22.04+)

На момент публикации актуальна версия CrowdSec 1.6.x. Перед установкой проверь свежие релизы на github.com/crowdsecurity/crowdsec/releases.

Установка CrowdSec на Ubuntu/Debian

Шаг 1. Добавь репозиторий и установи Security Engine

Официальный установщик добавляет репозиторий и устанавливает всё необходимое одной командой.


curl -s https://install.crowdsec.net | sudo sh
sudo apt update
sudo apt install -y crowdsec

После установки Security Engine запустится автоматически. Проверь статус:


sudo systemctl status crowdsec

Должно быть active (running). Если нет — смотри журнал:


sudo journalctl -u crowdsec -e --no-pager

Шаг 2. Установи Firewall Bouncer

На Ubuntu 22.04 и новее используй nftables — это дефолтный backend. На более старых системах — iptables.

Ubuntu 22.04+ и Debian 12+
Используй nftables-баунсер. Не запускай оба файрвол-бэкенда одновременно — будут конфликты правил.

# Ubuntu 22.04 / 24.04 / Debian 12 - nftables
sudo apt install -y crowdsec-firewall-bouncer-nftables

# Ubuntu 20.04 / Debian 11 - iptables
# sudo apt install -y crowdsec-firewall-bouncer-iptables

Включи автозапуск и запусти:


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

Проверь, что баунсер зарегистрировался в LAPI:


sudo cscli bouncers list

Должна быть строка с именем баунсера и статусом valid.

Шаг 3. Установи коллекции

Коллекции — это наборы парсеров и сценариев для конкретных сервисов. Устанавливай только то, что реально работает на сервере — лишний шум в логах не нужен.


# Базовая защита Linux и SSH - ставь всегда
sudo cscli collections install crowdsecurity/linux
sudo cscli collections install crowdsecurity/sshd

# Если есть Nginx
sudo cscli collections install crowdsecurity/nginx

# Если есть Apache
# sudo cscli collections install crowdsecurity/apache2

# Вайтлист - защита от ложных банов
sudo cscli parsers install crowdsecurity/whitelists

# Применить изменения
sudo systemctl reload crowdsec

Шаг 4. Настрой источники логов

CrowdSec читает логи из файла конфигурации acquis.yaml. По умолчанию он уже настроен на стандартные пути — но проверь.


cat /etc/crowdsec/acquis.yaml

Стандартный вид для сервера с SSH и Nginx:


filenames:
  - /var/log/auth.log
  - /var/log/syslog
labels:
  type: syslog
---
filenames:
  - /var/log/nginx/access.log
  - /var/log/nginx/error.log
labels:
  type: nginx

Если Nginx логи в нестандартном месте — добавь нужный путь и перезагрузи:


sudo systemctl reload crowdsec

Шаг 5. Проверь что всё читается


sudo cscli metrics

В секции Acquisition Metrics должны быть строки с твоими лог-файлами и счётчиком прочитанных строк. Если счётчик ноль — лог-файл не читается. Проверь путь и права.

Таблица портов

Порт Протокол Назначение Снаружи?
8080 TCP Local API (LAPI) — для баунсеров Нет (только localhost)
6060 TCP Prometheus метрики (опционально) Нет

LAPI слушает только на localhost по умолчанию. Наружу его открывать не нужно, если не строишь мультисерверную установку.

Настройка CrowdSec для Nginx

Firewall bouncer блокирует на уровне L3/L4 — то есть TCP-соединение дропается ещё до того, как Nginx его увидит. Это хорошо для производительности. Nginx bouncer работает на уровне L7 — может отдать 403 или CAPTCHA вместо дропа. Для большинства случаев хватает firewall bouncer.

Если нужна CAPTCHA и HTTP 403 вместо тихого дропа — ставь Nginx bouncer отдельно:


sudo apt install -y crowdsec-nginx-bouncer

После установки в конфиге Nginx появится include для проверки решений CrowdSec. Перезапусти Nginx:


sudo nginx -t && sudo systemctl reload nginx

CrowdSec в Docker Compose

Вот тут Fail2Ban реально страдает. В Docker он вынужден читать логи через bind-mount хостовых путей или через Docker socket — оба варианта неудобны. CrowdSec в Docker работает нативно.

Базовый docker-compose.yml для связки CrowdSec + Traefik:


version: "3.8"

services:
  crowdsec:
    image: crowdsecurity/crowdsec:latest
    container_name: crowdsec
    environment:
      - GID=1000
      - COLLECTIONS=crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/linux
    volumes:
      - ./crowdsec/config:/etc/crowdsec
      - ./crowdsec/data:/var/lib/crowdsec/data
      - /var/log:/var/log:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - proxy
    restart: unless-stopped

  traefik:
    image: traefik:v3.0
    container_name: traefik
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik/config:/etc/traefik
      - ./traefik/certs:/certs
    networks:
      - proxy
    restart: unless-stopped
    depends_on:
      - crowdsec

networks:
  proxy:
    external: true

После запуска — создай API ключ для Traefik плагина:


docker exec crowdsec cscli bouncers add traefik-bouncer

Скопируй ключ — он показывается только один раз. Добавь его в конфиг Traefik плагина.

Настройка acquis.yaml для Docker

Если CrowdSec запущен в контейнере и нужно читать логи Traefik:


filenames:
  - /var/log/traefik/access.log
labels:
  type: traefik
---
source: docker
container_name:
  - traefik
labels:
  type: traefik

Проверка работы

Посмотри активные блокировки:


sudo cscli decisions list

Посмотри алерты — что сработало и когда:


sudo cscli alerts list

Проверь метрики — сколько строк логов обработано, сколько сценариев сработало:


sudo cscli metrics

Проверь что nftables содержит цепочку CrowdSec:


sudo nft list ruleset | grep -i crowdsec

Если цепочка есть — баунсер работает и правила применяются.

Протестируй ручной бан (и разбан) — убедись что система реагирует:


# Забанить IP вручную
sudo cscli decisions add --ip 1.2.3.4 --duration 1h --reason "test"

# Проверить
sudo cscli decisions list

# Разбанить
sudo cscli decisions delete --ip 1.2.3.4

Troubleshooting

Ошибка: баунсер не подключается к LAPI

Симптом
В cscli bouncers list статус bouncer показывает invalid или запись отсутствует. В логах баунсера — connection refused к 127.0.0.1:8080.

Проверь что LAPI запущен:


sudo systemctl status crowdsec
sudo ss -tlnp | grep 8080

Переустанови баунсер — он автоматически регистрируется в LAPI при установке:


sudo apt reinstall -y crowdsec-firewall-bouncer-nftables
sudo systemctl restart crowdsec-firewall-bouncer
sudo cscli bouncers list

Ошибка: нет блокировок хотя алерты есть

Симптом
cscli alerts list показывает алерты, но cscli decisions list пустой. Атаки не блокируются.

Проверь статус файрвол-баунсера и наличие цепочки в nftables:


systemctl is-active crowdsec-firewall-bouncer
sudo nft list ruleset | grep -i crowdsec -n

Если файрвол-баунсер не активен — запусти:


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

Конфликт с UFW

Важно
Если UFW активен и ты ставишь nftables-баунсер — могут быть конфликты правил. Выбери одно: либо UFW управляет файрволом, либо CrowdSec nftables bouncer напрямую. Смешивать не рекомендуется.

Самый простой вариант — оставь UFW для базовых правил (открыть порты 22, 80, 443), а CrowdSec пусть добавляет свои правила блокировки поверх. На практике они не конфликтуют в большинстве случаев, но если видишь странное поведение — проверь:


sudo ufw status verbose
sudo nft list ruleset

Ошибка: метрики не обновляются, логи не читаются


# Проверь права на лог-файлы
ls -la /var/log/nginx/
ls -la /var/log/auth.log

# CrowdSec должен читать их
sudo -u crowdsec cat /var/log/nginx/access.log | head -5

# Если нет прав - добавь пользователя в группу
sudo usermod -aG adm crowdsec
sudo systemctl restart crowdsec

Ложные баны — заблокировал нужный IP

Добавь IP в вайтлист:


# Разбанить немедленно
sudo cscli decisions delete --ip 203.0.113.10

# Добавить в постоянный вайтлист
echo "203.0.113.10" | sudo tee -a /etc/crowdsec/parsers/s02-enrich/mywhitelist.yaml

Правильный формат файла вайтлиста:


name: my/whitelist
description: "My trusted IPs"
whitelist:
  reason: "trusted IPs"
  ip:
    - "203.0.113.10"
    - "192.168.1.0/24"

sudo systemctl reload crowdsec

CrowdSec в Docker не видит логи хоста

Убедись что в docker-compose.yml примонтирован /var/log хоста:


volumes:
  - /var/log:/var/log:ro

Без этого маппинга контейнер видит только свои логи. Это не баг — это Docker.

Альтернативы

Если CrowdSec кажется сложным — вот что ещё есть:

Инструмент Плюс Минус Для кого
Fail2Ban Проверен временем, прост Реактивный, медленнее Простые серверы без интернета
CrowdSec Коллективный интеллект, Go, модульность Сложнее первая настройка Всё что смотрит в интернет
SSHGuard Легковесный, только SSH Только SSH, нет коллектива Embedded, минимальные ресурсы
Endlessh Тратит время ботов (honeypot) Не блокирует, только замедляет Дополнение к основной защите

Оба инструмента можно запустить одновременно — они не конфликтуют. Некоторые так и делают на период миграции. Смешно звучит — защищать сервер двумя охранниками. Но при переходе это разумно: CrowdSec ещё учится читать твои логи, а Fail2Ban стоит как страховка.

Профилактика и мониторинг

Автообновление коллекций

Сценарии CrowdSec обновляются — добавляют новые паттерны атак. Настрой cron для обновления:


sudo crontab -e

# Обновление коллекций CrowdSec каждый день в 3:00
0 3 * * * cscli hub update && cscli hub upgrade

Мониторинг решений


# Сколько IP сейчас заблокировано
sudo cscli decisions list | wc -l

# Топ сценариев которые срабатывают
sudo cscli alerts list --limit 50 | grep "scenario" | sort | uniq -c | sort -rn

Резервное копирование конфигурации

Что бэкапить:

  • /etc/crowdsec/ — вся конфигурация: acquis.yaml, profiles.yaml, вайтлисты
  • /var/lib/crowdsec/data/ — база данных решений (SQLite)

# Бэкап конфига
sudo tar -czf crowdsec-config-$(date +%Y%m%d).tar.gz /etc/crowdsec/

# Проверить бэкап
tar -tzf crowdsec-config-$(date +%Y%m%d).tar.gz | head -20

Как обновить CrowdSec безопасно


# Проверить текущую версию
cscli version

# Обновить через apt
sudo apt update
sudo apt install --only-upgrade crowdsec crowdsec-firewall-bouncer-nftables

# Проверить после обновления
sudo systemctl status crowdsec
sudo cscli bouncers list
sudo cscli decisions list

Откат: если что-то сломалось — apt поддерживает откат к предыдущей версии через apt install crowdsec=1.x.x. Но на практике обновления CrowdSec проходят без проблем — команда держит совместимость конфигов.

Подключение к консоли

Опционально — веб-интерфейс на app.crowdsec.net. Показывает карту атак, историю алертов и решений. Бесплатно для одного сервера.


sudo cscli console enroll ТВОЙ_ENROLLMENT_KEY
sudo systemctl reload crowdsec

Ключ берёшь после регистрации на app.crowdsec.net.

FAQ

Стоит ли переходить с Fail2Ban на CrowdSec?

Для серверов, которые смотрят в интернет — да. Коллективный блок-лист один этого стоит: твой сервер начинает блокировать IP которые уже атаковали тысячи других серверов, ещё до того как они добрались до тебя. Если сервер изолирован или это legacy-машина которую трогать страшно — оставь Fail2Ban, он работает.

Как проверить что CrowdSec работает правильно?

Три команды: sudo cscli decisions list покажет активные баны, sudo cscli alerts list — что сработало, sudo cscli metrics — сколько строк логов обработано. Если в метриках ненулевые счётчики по твоим лог-файлам — система читает и анализирует. Если decisions list не пуст через день-два работы — баны идут.

CrowdSec или Fail2Ban — что лучше для homelab?

CrowdSec. Причина простая: homelab обычно смотрит наружу через reverse proxy — Nginx, Traefik, NPM. Именно здесь CrowdSec даёт максимум: сценарии для HTTP-атак, SQLi, сканеров, плюс коллективный блок-лист. Fail2Ban для этого нужно собирать руками из regex и jail-конфигов. Первый раз настроить CrowdSec сложнее, но потом он требует меньше внимания.

Чем CrowdSec отличается от Fail2Ban по принципу работы?

Fail2Ban: читает лог — видит N неудачных попыток — добавляет правило в iptables. Всё локально, всё реактивно. CrowdSec: читает лог — сопоставляет поведение со сценарием — пишет решение в LAPI — баунсер применяет блокировку. Параллельно получает из облака блок-лист IP от всех участников сети. Ключевое отличие — превентивная защита через коллективный интеллект и разделение детектирования и блокировки.

Что делать если CrowdSec заблокировал мой IP?

Если есть доступ к серверу (через другой IP или VPN): sudo cscli decisions delete --ip ТВОй_IP. Затем добавь свой IP или подсеть в вайтлист чтобы не повторялось. Если заблокировал себя и нет доступа — только через консоль хостера или KVM.

Fail2Ban устарел в 2025 году?

Устарел по архитектуре — реактивная изолированная модель не соответствует современным угрозам. Но работает стабильно и его никто не трогал с 2004 года в хорошем смысле: конфиги не ломаются, поведение предсказуемо. Для простых серверов — нормальный выбор. Для всего нового — CrowdSec.

Прогноз

Ты поставил CrowdSec, настроил firewall bouncer, подключил коллекции для SSH и Nginx. Теперь твой сервер не ждёт когда его начнут ломать — он уже знает большую часть атакующих IP из коллективной базы. Это принципиальная разница.

Fail2Ban никуда не исчезнет — старый конь борозды не портит. Но для нового стека, Docker, Traefik и всего что смотрит в интернет — CrowdSec правильный выбор. Один раз разобрался с архитектурой LAPI и баунсеров, и дальше всё работает само.

Если не заработало
Пиши в комментарии — разберёмся. Укажи ОС, версию CrowdSec и что выводит sudo cscli bouncers list и sudo systemctl status crowdsec.
Андрей Анатольевич
Author: Андрей Анатольевич

Руководитель ИТ / Кризис-менеджер 25 лет в IT: от инженера в МегаФоне до руководителя отдела. Знаю, как выглядит бардак: нестабильные сети, устаревшая инфраструктура, конфликты в команде, раздутые сроки. Помогаю бизнесу выходить из кризиса: навожу порядок в легаси, стабилизирую то, что разваливается, выстраиваю прогнозируемые процессы. Не раз возвращал к жизни ИТ-структуры — знаю цену хаосу. 📍 Ищу проект для полной реорганизации / стабилизации. 📬 Telegram: @over_dude ✉️ mail@it-apteka.com

Оставайтесь на связи

Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.

Подписаться на IT-Аптеку →

Мы ВКонтакте

IT-Аптека — советы, новости и помощь рядом.

Вступить в группу ВКонтакте →
Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх