- 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.
Что получишь из этой статьи:
- Честное сравнение архитектур — без маркетингового тумана
- Пошаговую установку CrowdSec на Ubuntu 22.04/24.04
- Настройку для SSH, Nginx и Docker/Traefik
- Troubleshooting самых частых проблем
- Понимание когда не стоит переходить
Времени займёт: 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 в блок-лист ещё до того, как атака доберётся до них.
Архитектура состоит из трёх частей:
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 отправляет в интернет
Системные требования
| Параметр | Минимум | Рекомендуется |
|---|---|---|
| ОС | 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 / 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
Проверь что 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
Ошибка: нет блокировок хотя алерты есть
Проверь статус файрвол-баунсера и наличие цепочки в 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 для базовых правил (открыть порты 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 и баунсеров, и дальше всё работает само.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →


