"Быстрый
<br />
<strong>CrowdSec vs Fail2Ban — кратко:</strong></p>
<ul>
<li>CrowdSec блокирует угрозы <em>до</em> атаки — благодаря коллективному блок-листу из миллиона+ серверов</li>
<li>Fail2Ban реагирует только <em>после</em> того как атака уже началась на твоём сервере</li>
<li>CrowdSec написан на Go — быстрее и экономит ресурсы по сравнению с Python-версией Fail2Ban</li>
<li>Переход с Fail2Ban на CrowdSec занимает 15-20 минут на Ubuntu/Debian</li>
<li>Для homelab и selfhosted — переходи. Для изолированного легаси-сервера без интернета — оставь Fail2Ban</li>
</ul>
<p>
<h2>Диагноз: почему Fail2Ban уже не тот</h2>
<p>CrowdSec вместо Fail2Ban — этот вопрос всё чаще всплывает в чатах и на форумах. Ты поднял сервер, поставил Fail2Ban, настроил jail на SSH — и думаешь, что защищён. По факту нет.</p>
<p>Fail2Ban существует с 2004 года. Двадцать лет. Это не почётный возраст — это диагноз. Инструмент банит IP после того, как атака уже началась на твоей машине. Он не знает, что этот же IP три часа назад положил пять серверов в Германии. Он узнает только когда этот IP придёт к тебе и начнёт стучаться в SSH.</p>
<p>Что получишь из этой статьи:</p>
<ul>
<li>Честное сравнение архитектур — без маркетингового тумана</li>
<li>Пошаговую <a href="https://it-apteka.com/avtomaticheskaja-ustanovka-wordpress-na-vps-za-5-minut-skript-pod-kljuch/" title="Установка WordPress на Ubuntu VPS: bash-скрипт, Nginx, SSL и WP-CLI за 10 минут" target="_blank" rel="noopener" data-wpil-monitor-id="2813">установку CrowdSec на Ubuntu</a> 22.04/24.04</li>
<li><a href="https://it-apteka.com/bezopasnost-mikrotik-chr-bazovaja-nastrojka-ssh-logov-i-zashhity-ot-brutforsa/" title="Безопасность MikroTik CHR: базовая настройка SSH, логов и защиты от брутфорса" target="_blank" rel="noopener" data-wpil-monitor-id="2811">Настройку для SSH</a>, Nginx и Docker/Traefik</li>
<li><a href="https://it-apteka.com/troubleshooting-setevyh-problem-15-komand-dlja-diagnostiki-v-windows-i-linux/" title="Troubleshooting сетевых проблем: 15 команд для диагностики в Windows и Linux" target="_blank" rel="noopener" data-wpil-monitor-id="2817">Troubleshooting самых частых проблем</a></li>
<li>Понимание когда <em>не</em> стоит переходить</li>
</ul>
<p>Времени займёт: 20 минут на чтение, 15 минут на установку.</p>
<h2>Как устроен Fail2Ban — и где он ломается</h2>
<p>Fail2Ban читает лог-файлы по regex-паттернам. Нашёл N неудачных попыток за M секунд — добавил IP в iptables. Всё. Изолированная реактивная модель. Каждый сервер — остров.</p>
<p>Бан на сервере A никак не защищает сервер B. Атака с распределённой ботнет-<a class="wpil_keyword_link" href="https://it-apteka.com/category/networks/" target="_blank" rel="noopener" title="Сети" data-wpil-keyword-link="linked" data-wpil-monitor-id="2824">сети</a>, где каждый IP делает ровно 4 попытки вместо твоих 5 в настройках — прозрачна для Fail2Ban. Он просто не видит паттерн.</p>
<table>
<thead>
<tr>
<th>Проблема Fail2Ban</th>
<th>Что происходит в реальности</th>
</tr>
</thead>
<tbody>
<tr>
<td>Реактивная модель</td>
<td>Бан только после атаки на твой сервер</td>
</tr>
<tr>
<td>Изолированный сервер</td>
<td>Нет обмена информацией между серверами</td>
</tr>
<tr>
<td>Только regex по логам</td>
<td>Не видит L7-паттерны, распределённые атаки</td>
</tr>
<tr>
<td>Python runtime</td>
<td>Медленнее при высокой нагрузке на логи</td>
</tr>
<tr>
<td>Один уровень блокировки</td>
<td>Только iptables, нет Application-layer бансинга</td>
</tr>
<tr>
<td>Нет IPv6 поддержки из коробки</td>
<td>Требует дополнительной конфигурации</td>
</tr>
</tbody>
</table>
<p>Для простого хоума с SSH и Nginx Fail2Ban работает. Но он работает как охранник, который смотрит в журнал только после того, как драка уже началась.</p>
<h2>Как устроен CrowdSec — архитектура</h2>
<p>CrowdSec запустили в 2020 году. Написан на Go. Концептуально это тот же Fail2Ban, но с одним принципиальным отличием — коллективным интеллектом. Когда твой сервер обнаруживает атакующий IP, он отправляет сигнал в центральную сеть. Все остальные участники получают этот IP в блок-лист ещё до того, как атака доберётся до них.</p>
<p>Архитектура состоит из трёх частей:</p>
<pre class="mermaid">
%%{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
</pre>
<p><strong>Security Engine</strong> — читает логи, парсит через Grok-паттерны, сопоставляет с YAML-сценариями поведения. Это умнее regex Fail2Ban — сценарии описывают паттерн поведения, а не просто строку в логе.</p>
<p><strong>Local API (LAPI)</strong> — центральный узел на твоей машине. Принимает решения о блокировке и раздаёт их боунсерам. Это ключевое архитектурное решение: детектирование и блокировка разделены. Ты можешь заблокировать на уровне файрвола, nginx, Cloudflare или всех трёх одновременно.</p>
<p><strong>Bouncers</strong> — исполнители. Firewall bouncer пишет правила в nftables/iptables. Nginx bouncer возвращает 403. Cloudflare bouncer добавляет IP в WAF. Один детект — блокировка на всех уровнях.</p>
<h2>CrowdSec vs Fail2Ban: таблица сравнения</h2>
<table>
<thead>
<tr>
<th>Параметр</th>
<th>Fail2Ban</th>
<th>CrowdSec</th>
</tr>
</thead>
<tbody>
<tr>
<td>Язык</td>
<td>Python</td>
<td>Go</td>
</tr>
<tr>
<td>Модель защиты</td>
<td>Реактивная</td>
<td>Превентивная + реактивная</td>
</tr>
<tr>
<td>Коллективный блок-лист</td>
<td>Нет</td>
<td>Да, 1M+ IP в реальном времени</td>
</tr>
<tr>
<td>IPv6</td>
<td>Ограниченно</td>
<td>Полная поддержка</td>
</tr>
<tr>
<td>Детектирование</td>
<td>Regex по логам</td>
<td>Поведенческие сценарии + regex</td>
</tr>
<tr>
<td>Уровни блокировки</td>
<td>iptables</td>
<td>Firewall, nginx, Cloudflare, Traefik</td>
</tr>
<tr>
<td>Потребление CPU</td>
<td>Низкое (idle)</td>
<td>Низкое (Go binary)</td>
</tr>
<tr>
<td>Потребление RAM</td>
<td>~30-50 MB</td>
<td>~50-80 MB</td>
</tr>
<tr>
<td>Сложность настройки</td>
<td>Средняя</td>
<td>Средняя (сложнее первый раз)</td>
</tr>
<tr>
<td>Dashboard</td>
<td>Нет</td>
<td>app.crowdsec.net (опционально)</td>
</tr>
<tr>
<td>Передача данных</td>
<td>Нет</td>
<td>Только IP + timestamp + тип атаки</td>
</tr>
<tr>
<td><a class="wpil_keyword_link" href="https://it-apteka.com/tag/docker/" target="_blank" rel="noopener" title="Docker" data-wpil-keyword-link="linked" data-wpil-monitor-id="2822">Docker</a> поддержка</td>
<td>Проблемная</td>
<td>Нативная</td>
</tr>
<tr>
<td>Год запуска</td>
<td>2004</td>
<td>2020</td>
</tr>
</tbody>
</table>
<p>По памяти CrowdSec чуть тяжелее — это плата за Go runtime и буферизацию данных LAPI. На VPS с 1 GB RAM это не критично. На Raspberry Pi Zero с 512 MB — уже считай.</p>
<h2>Что CrowdSec отправляет в интернет</h2>
"Важно:
<br />
Сырые логи с твоего сервера никуда не уходят. CrowdSec отправляет только: IP-адрес атакующего, временную метку и название сценария (тип атаки). Никакого содержимого запросов, никаких URL, никаких данных пользователей. Если нужна полностью изолированная установка — отключи шаринг через cscli console disable share-signals.<br />
<h2>Системные требования</h2>
<table>
<thead>
<tr>
<th>Параметр</th>
<th>Минимум</th>
<th>Рекомендуется</th>
</tr>
</thead>
<tbody>
<tr>
<td>ОС</td>
<td><a href="https://it-apteka.com/nastrojka-staticheskogo-ip-v-ubuntu-22-04-24-04-i-debian-12-13-nov/" title="Настройка статического IP в Ubuntu 22.04-24.04 и Debian 12-13: Новый мир Netplan" target="_blank" rel="noopener" data-wpil-monitor-id="2814">Ubuntu 20.04 / Debian</a> 11</td>
<td>Ubuntu 22.04 / 24.04, <a class="wpil_keyword_link" href="https://it-apteka.com/tag/debian/" target="_blank" rel="noopener" title="Debian" data-wpil-keyword-link="linked" data-wpil-monitor-id="2825">Debian</a> 12</td>
</tr>
<tr>
<td>CPU</td>
<td>1 vCPU</td>
<td>2 vCPU</td>
</tr>
<tr>
<td>RAM</td>
<td>512 MB</td>
<td>1 GB+</td>
</tr>
<tr>
<td>Диск</td>
<td>500 MB</td>
<td>1 GB (под логи и базу)</td>
</tr>
<tr>
<td>CrowdSec версия</td>
<td>1.6+</td>
<td>1.6.8+ (актуальная на май 2025)</td>
</tr>
<tr>
<td>Файрвол backend</td>
<td>iptables</td>
<td>nftables (Ubuntu 22.04+)</td>
</tr>
</tbody>
</table>
<p>На момент публикации актуальна версия CrowdSec 1.6.x. Перед установкой проверь свежие релизы на <a href="https://github.com/crowdsecurity/crowdsec/releases" rel="nofollow" target="_blank">github.com/crowdsecurity/crowdsec/releases</a>.</p>
<h2>Установка CrowdSec на Ubuntu/Debian</h2>
<h3>Шаг 1. Добавь репозиторий и установи Security Engine</h3>
<p>Официальный установщик добавляет репозиторий и устанавливает всё необходимое одной командой.</p>
<pre><code class="language-bash">
curl -s https://install.crowdsec.net | sudo sh
sudo apt update
sudo apt install -y crowdsec
</code></pre>
<p>После установки Security Engine запустится автоматически. Проверь статус:</p>
<pre><code class="language-bash">
sudo systemctl status crowdsec
</code></pre>
<p>Должно быть <code>active (running)</code>. Если нет — смотри журнал:</p>
<pre><code class="language-bash">
sudo journalctl -u crowdsec -e --no-pager
</code></pre>
<h3>Шаг 2. Установи Firewall Bouncer</h3>
<p>На Ubuntu 22.04 и новее используй nftables — это дефолтный backend. На более старых системах — iptables.</p>
"Ubuntu
<br />
Используй nftables-баунсер. Не запускай оба файрвол-бэкенда одновременно — будут конфликты правил.<br />
<pre><code class="language-bash">
# 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
</code></pre>
<p>Включи автозапуск и запусти:</p>
<pre><code class="language-bash">
sudo systemctl enable crowdsec-firewall-bouncer
sudo systemctl start crowdsec-firewall-bouncer
</code></pre>
<p>Проверь, что баунсер зарегистрировался в LAPI:</p>
<pre><code class="language-bash">
sudo cscli bouncers list
</code></pre>
<p>Должна быть строка с именем баунсера и статусом <code>valid</code>.</p>
<h3>Шаг 3. Установи коллекции</h3>
<p>Коллекции — это наборы парсеров и сценариев для конкретных сервисов. Устанавливай только то, что реально работает на <a href="https://it-apteka.com/kakoj-vpn-server-ustanovit-na-ubuntu-dlja-nativnogo-podkljuchenija/" title="Настройка IKEv2 VPN сервера на Ubuntu 24.04: StrongSwan без лишних клиентов" target="_blank" rel="noopener" data-wpil-monitor-id="2815">сервере — лишний</a> шум в логах не нужен.</p>
<pre><code class="language-bash">
# Базовая защита 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
</code></pre>
<h3>Шаг 4. Настрой источники логов</h3>
<p>CrowdSec читает логи из файла конфигурации <code>acquis.yaml</code>. По умолчанию он уже настроен на стандартные пути — но проверь.</p>
<pre><code class="language-bash">
cat /etc/crowdsec/acquis.yaml
</code></pre>
<p>Стандартный вид для сервера с SSH и Nginx:</p>
<pre><code class="language-text">
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
</code></pre>
<p>Если Nginx логи в нестандартном месте — добавь нужный путь и перезагрузи:</p>
<pre><code class="language-bash">
sudo systemctl reload crowdsec
</code></pre>
<h3>Шаг 5. Проверь что всё читается</h3>
<pre><code class="language-bash">
sudo cscli metrics
</code></pre>
<p>В секции <strong>Acquisition Metrics</strong> должны быть строки с твоими лог-файлами и счётчиком прочитанных строк. Если счётчик ноль — лог-файл не читается. Проверь путь и права.</p>
<h2>Таблица портов</h2>
<table>
<thead>
<tr>
<th>Порт</th>
<th>Протокол</th>
<th>Назначение</th>
<th>Снаружи?</th>
</tr>
</thead>
<tbody>
<tr>
<td>8080</td>
<td>TCP</td>
<td>Local API (LAPI) — для баунсеров</td>
<td>Нет (только localhost)</td>
</tr>
<tr>
<td>6060</td>
<td>TCP</td>
<td>Prometheus метрики (опционально)</td>
<td>Нет</td>
</tr>
</tbody>
</table>
<p>LAPI слушает только на localhost по умолчанию. Наружу его открывать не нужно, если не строишь мультисерверную установку.</p>
<h2>Настройка CrowdSec для Nginx</h2>
<p>Firewall bouncer блокирует на уровне L3/L4 — то есть TCP-соединение дропается ещё до того, как Nginx его увидит. Это хорошо для производительности. Nginx bouncer работает на уровне L7 — может отдать 403 или CAPTCHA вместо дропа. Для большинства случаев хватает firewall bouncer.</p>
<p>Если нужна CAPTCHA и HTTP 403 вместо тихого дропа — ставь Nginx bouncer отдельно:</p>
<pre><code class="language-bash">
sudo apt install -y crowdsec-nginx-bouncer
</code></pre>
<p>После <a href="https://it-apteka.com/mikrotik-nginx-proxy-manager-ustanovka-container-ssl-i-reverse-proxy-shpargalka/" title="MikroTik Nginx Proxy Manager: установка container, SSL и reverse proxy — шпаргалка" target="_blank" rel="noopener" data-wpil-monitor-id="2816">установки в конфиге Nginx</a> появится include для проверки решений CrowdSec. Перезапусти Nginx:</p>
<pre><code class="language-bash">
sudo nginx -t && sudo systemctl reload nginx
</code></pre>
<h2>CrowdSec в Docker Compose</h2>
<p>Вот тут Fail2Ban реально страдает. В Docker он вынужден читать логи через bind-mount хостовых путей или через <a href="https://it-apteka.com/1243-2/" title="Сервер активации Windows (KMS) в Docker: варианты развёртывания и интеграция с Active Directory" target="_blank" rel="noopener" data-wpil-monitor-id="2812">Docker socket — оба варианта</a> неудобны. CrowdSec в Docker работает нативно.</p>
<p>Базовый docker-compose.yml для связки CrowdSec + Traefik:</p>
<pre><code class="language-text">
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
</code></pre>
<p>После запуска — создай API ключ для Traefik плагина:</p>
<pre><code class="language-bash">
docker exec crowdsec cscli bouncers add traefik-bouncer
</code></pre>
<p>Скопируй ключ — он показывается только один раз. Добавь его в конфиг Traefik плагина.</p>
<h3>Настройка acquis.yaml для Docker</h3>
<p>Если CrowdSec запущен в контейнере и нужно читать логи Traefik:</p>
<pre><code class="language-text">
filenames:
- /var/log/traefik/access.log
labels:
type: traefik
---
source: docker
container_name:
- traefik
labels:
type: traefik
</code></pre>
<h2>Проверка работы</h2>
<p>Посмотри активные блокировки:</p>
<pre><code class="language-bash">
sudo cscli decisions list
</code></pre>
<p>Посмотри алерты — что сработало и когда:</p>
<pre><code class="language-bash">
sudo cscli alerts list
</code></pre>
<p>Проверь метрики — сколько строк логов обработано, сколько сценариев сработало:</p>
<pre><code class="language-bash">
sudo cscli metrics
</code></pre>
<p>Проверь что nftables содержит цепочку CrowdSec:</p>
<pre><code class="language-bash">
sudo nft list ruleset | grep -i crowdsec
</code></pre>
<p>Если цепочка есть — баунсер работает и правила применяются.</p>
<p>Протестируй ручной бан (и разбан) — убедись что система реагирует:</p>
<pre><code class="language-bash">
# Забанить 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
</code></pre>
<h2>Troubleshooting</h2>
<h3>Ошибка: баунсер не подключается к LAPI</h3>
"Симптом"
<br />
В cscli bouncers list статус bouncer показывает invalid или запись отсутствует. В логах баунсера — connection refused к 127.0.0.1:8080.<br />
<p>Проверь что LAPI запущен:</p>
<pre><code class="language-bash">
sudo systemctl status crowdsec
sudo ss -tlnp | grep 8080
</code></pre>
<p>Переустанови баунсер — он автоматически регистрируется в LAPI при установке:</p>
<pre><code class="language-bash">
sudo apt reinstall -y crowdsec-firewall-bouncer-nftables
sudo systemctl restart crowdsec-firewall-bouncer
sudo cscli bouncers list
</code></pre>
<h3>Ошибка: нет блокировок хотя алерты есть</h3>
"Симптом"
<br />
cscli alerts list показывает алерты, но cscli decisions list пустой. Атаки не блокируются.<br />
<p>Проверь статус файрвол-баунсера и наличие цепочки в nftables:</p>
<pre><code class="language-bash">
systemctl is-active crowdsec-firewall-bouncer
sudo nft list ruleset | grep -i crowdsec -n
</code></pre>
<p>Если файрвол-баунсер не активен — запусти:</p>
<pre><code class="language-bash">
sudo systemctl start crowdsec-firewall-bouncer
sudo systemctl enable crowdsec-firewall-bouncer
</code></pre>
<h3>Конфликт с UFW</h3>
"Важно"
<br />
Если UFW активен и ты ставишь nftables-баунсер — могут быть конфликты правил. Выбери одно: либо UFW управляет файрволом, либо CrowdSec nftables bouncer напрямую. Смешивать не рекомендуется.<br />
<p>Самый простой вариант — оставь UFW для базовых правил (открыть порты 22, 80, 443), а CrowdSec пусть добавляет свои правила блокировки поверх. На практике они не конфликтуют в большинстве случаев, но если видишь странное поведение — проверь:</p>
<pre><code class="language-bash">
sudo ufw status verbose
sudo nft list ruleset
</code></pre>
<h3>Ошибка: метрики не обновляются, логи не читаются</h3>
<pre><code class="language-bash">
# Проверь права на лог-файлы
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
</code></pre>
<h3>Ложные баны — заблокировал нужный IP</h3>
<p>Добавь IP в вайтлист:</p>
<pre><code class="language-bash">
# Разбанить немедленно
sudo cscli decisions delete --ip 203.0.113.10
# Добавить в постоянный вайтлист
echo "203.0.113.10" | sudo tee -a /etc/crowdsec/parsers/s02-enrich/mywhitelist.yaml
</code></pre>
<p>Правильный формат файла вайтлиста:</p>
<pre><code class="language-text">
name: my/whitelist
description: "My trusted IPs"
whitelist:
reason: "trusted IPs"
ip:
- "203.0.113.10"
- "192.168.1.0/24"
</code></pre>
<pre><code class="language-bash">
sudo systemctl reload crowdsec
</code></pre>
<h3>CrowdSec в Docker не видит логи хоста</h3>
<p>Убедись что в docker-compose.yml примонтирован /var/log хоста:</p>
<pre><code class="language-text">
volumes:
- /var/log:/var/log:ro
</code></pre>
<p>Без этого маппинга контейнер видит только свои логи. Это не баг — это Docker.</p>
<h2>Альтернативы</h2>
<p>Если CrowdSec кажется сложным — вот что ещё есть:</p>
<table>
<thead>
<tr>
<th>Инструмент</th>
<th>Плюс</th>
<th>Минус</th>
<th>Для кого</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fail2Ban</td>
<td>Проверен временем, прост</td>
<td>Реактивный, медленнее</td>
<td>Простые серверы без интернета</td>
</tr>
<tr>
<td>CrowdSec</td>
<td>Коллективный интеллект, Go, модульность</td>
<td>Сложнее первая настройка</td>
<td>Всё что смотрит в интернет</td>
</tr>
<tr>
<td>SSHGuard</td>
<td>Легковесный, только SSH</td>
<td>Только SSH, нет коллектива</td>
<td>Embedded, минимальные ресурсы</td>
</tr>
<tr>
<td>Endlessh</td>
<td>Тратит время ботов (honeypot)</td>
<td>Не блокирует, только замедляет</td>
<td>Дополнение к основной защите</td>
</tr>
</tbody>
</table>
<p>Оба инструмента можно запустить одновременно — они не конфликтуют. Некоторые так и делают на период миграции. Смешно звучит — защищать сервер двумя охранниками. Но при переходе это разумно: CrowdSec ещё учится читать твои логи, а Fail2Ban стоит как страховка.</p>
<h2>Профилактика и мониторинг</h2>
<h3>Автообновление коллекций</h3>
<p>Сценарии CrowdSec обновляются — добавляют новые паттерны атак. Настрой cron для обновления:</p>
<pre><code class="language-bash">
sudo crontab -e
</code></pre>
<pre><code class="language-text">
# Обновление коллекций CrowdSec каждый день в 3:00
0 3 * * * cscli hub update && cscli hub upgrade
</code></pre>
<h3>Мониторинг решений</h3>
<pre><code class="language-bash">
# Сколько IP сейчас заблокировано
sudo cscli decisions list | wc -l
# Топ сценариев которые срабатывают
sudo cscli alerts list --limit 50 | grep "scenario" | sort | uniq -c | sort -rn
</code></pre>
<h3>Резервное копирование конфигурации</h3>
<p>Что бэкапить:</p>
<ul>
<li><code>/etc/crowdsec/</code> — вся конфигурация: acquis.yaml, profiles.yaml, вайтлисты</li>
<li><code>/var/lib/crowdsec/data/</code> — база данных решений (SQLite)</li>
</ul>
<pre><code class="language-bash">
# Бэкап конфига
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
</code></pre>
<h3>Как обновить CrowdSec безопасно</h3>
<pre><code class="language-bash">
# Проверить текущую версию
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
</code></pre>
<p>Откат: если что-то сломалось — apt поддерживает откат к предыдущей версии через <code>apt install crowdsec=1.x.x</code>. Но на практике обновления CrowdSec проходят без проблем — команда держит совместимость конфигов.</p>
<h3>Подключение к консоли</h3>
<p>Опционально — веб-интерфейс на app.crowdsec.net. Показывает карту атак, историю алертов и решений. Бесплатно для одного сервера.</p>
<pre><code class="language-bash">
sudo cscli console enroll ТВОЙ_ENROLLMENT_KEY
sudo systemctl reload crowdsec
</code></pre>
<p>Ключ берёшь после регистрации на <a href="https://app.crowdsec.net" rel="nofollow" target="_blank">app.crowdsec.net</a>.</p>
<h2>FAQ</h2>
<h3>Стоит ли переходить с Fail2Ban на CrowdSec?</h3>
<p>Для серверов, которые смотрят в интернет — да. Коллективный блок-лист один этого стоит: твой сервер начинает блокировать IP которые уже атаковали тысячи других серверов, ещё до того как они добрались до тебя. Если сервер изолирован или это legacy-машина которую трогать страшно — оставь Fail2Ban, он работает.</p>
<h3>Как проверить что CrowdSec работает правильно?</h3>
<p>Три команды: <code>sudo cscli decisions list</code> покажет активные баны, <code>sudo cscli alerts list</code> — что сработало, <code>sudo cscli metrics</code> — сколько строк логов обработано. Если в метриках ненулевые счётчики по твоим лог-файлам — система читает и анализирует. Если decisions list не пуст через день-два работы — баны идут.</p>
<h3>CrowdSec или Fail2Ban — что лучше для homelab?</h3>
<p>CrowdSec. Причина простая: homelab обычно смотрит наружу через <a href="https://it-apteka.com/nginx_proxy_manager/" title="Nginx Proxy Manager: настройка reverse proxy для Proxmox, Nextcloud, Vaultwarden и ещё семи сервисов" target="_blank" rel="noopener" data-wpil-monitor-id="2810">reverse proxy — Nginx</a>, Traefik, NPM. Именно здесь CrowdSec даёт максимум: сценарии для HTTP-атак, SQLi, сканеров, плюс коллективный блок-лист. Fail2Ban для этого нужно собирать руками из regex и jail-конфигов. Первый раз настроить CrowdSec сложнее, но потом он требует меньше внимания.</p>
<h3>Чем CrowdSec отличается от Fail2Ban по принципу работы?</h3>
<p>Fail2Ban: читает лог — видит N неудачных попыток — добавляет правило в iptables. Всё локально, всё реактивно. CrowdSec: читает лог — сопоставляет поведение со сценарием — пишет решение в LAPI — баунсер применяет блокировку. Параллельно получает из облака блок-лист IP от всех участников сети. Ключевое отличие — превентивная <a class="wpil_keyword_link" href="https://it-apteka.com/category/security/" target="_blank" rel="noopener" title="Безопасность" data-wpil-keyword-link="linked" data-wpil-monitor-id="2823">защита</a> через коллективный интеллект и разделение детектирования и блокировки.</p>
<h3>Что делать если CrowdSec заблокировал мой IP?</h3>
<p>Если есть доступ к серверу (через другой IP или VPN): <code>sudo cscli decisions delete --ip ТВОй_IP</code>. Затем добавь свой IP или подсеть в вайтлист чтобы не повторялось. Если заблокировал себя и нет доступа — только через консоль хостера или KVM.</p>
<h3>Fail2Ban устарел в 2025 году?</h3>
<p>Устарел по архитектуре — реактивная изолированная модель не соответствует современным угрозам. Но работает стабильно и его никто не трогал с 2004 года в хорошем смысле: конфиги не ломаются, поведение предсказуемо. Для простых серверов — нормальный выбор. Для всего нового — CrowdSec.</p>
<h2>Прогноз</h2>
<p>Ты поставил CrowdSec, настроил firewall bouncer, подключил коллекции для SSH и Nginx. Теперь твой сервер не ждёт когда его начнут ломать — он уже знает большую часть атакующих IP из коллективной базы. Это принципиальная разница.</p>
<p>Fail2Ban никуда не исчезнет — старый конь борозды не портит. Но для нового стека, Docker, Traefik и всего что смотрит в интернет — CrowdSec правильный выбор. Один раз разобрался с архитектурой LAPI и баунсеров, и дальше всё работает само.</p>
"Если
<br />
Пиши в комментарии — разберёмся. Укажи ОС, версию CrowdSec и что выводит sudo cscli bouncers list и sudo systemctl status crowdsec.<br />
Быстрый ответ
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.