Skip to content

Fail2ban a CrowdSec

Martin Skalicky edited this page Aug 4, 2026 · 1 revision

Fail2ban a CrowdSec

Nástroje, které čtou logy a blokují adresy, ze kterých chodí opakované neúspěšné pokusy.

Nejsou náhradou za zabezpečení serveru — když máš vypnutá hesla u SSH, brute force ti nevadí a fail2ban ti jen uklidí log. Hodnotu mají hlavně u služeb, kde přihlašování vypnout nemůžeš.

Fail2ban

Klasika. Sleduje logy, hledá vzory a při překročení počtu pokusů přidá pravidlo do firewallu.

Instalace a základ

apt install fail2ban

Nikdy needituj jail.conf, přepíše se při aktualizaci. Vytvoř /etc/fail2ban/jail.local:

[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
backend  = systemd
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.10.0.0/24

banaction = nftables-multiport

[sshd]
enabled = true

[nginx-http-auth]
enabled  = true
logpath  = /var/log/nginx/error.log

[nginx-limit-req]
enabled  = true
logpath  = /var/log/nginx/error.log

ignoreip s vlastními sítěmi je první věc, kterou nastav. Jinak se dřív nebo později zablokuješ sám.

systemctl restart fail2ban
fail2ban-client status
fail2ban-client status sshd

Odblokování

fail2ban-client set sshd unbanip 1.2.3.4
fail2ban-client unban --all

Postupné prodlužování

[DEFAULT]
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 5w

Opakovaný útočník dostává postupně delší tresty. Užitečné proti botnetům, které se vracejí.

Vlastní filtr

Pro aplikaci, kterou fail2ban nezná. Najdi si v logu, jak vypadá neúspěšné přihlášení, a napiš /etc/fail2ban/filter.d/mojeapp.conf:

[Definition]
failregex = ^.*Failed login attempt from <HOST>.*$
ignoreregex =
[mojeapp]
enabled  = true
port     = http,https
filter   = mojeapp
logpath  = /var/log/mojeapp/access.log
maxretry = 3

Otestuj regulární výraz proti skutečnému logu, než to nasadíš:

fail2ban-regex /var/log/mojeapp/access.log /etc/fail2ban/filter.d/mojeapp.conf

Past: za reverse proxy blokuješ sám sebe

Tohle je nejdůležitější odstavec na stránce.

Když aplikace běží za reverse proxy, vidí v logu adresu proxy, ne útočníka. Fail2ban tedy zablokuje 127.0.0.1 nebo adresu proxy — a tím odřízne úplně všechny návštěvníky.

Řešení má dva kroky.

1. Proxy musí posílat skutečnou IP. Hlavička X-Forwarded-For, viz nginx nebo Caddy.

2. Aplikace ji musí zapisovat do logu. V nginxu:

log_format proxy '$http_x_forwarded_for - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent';
access_log /var/log/nginx/access.log proxy;

Když je před tebou ještě Cloudflare, potřebuješ navíc set_real_ip_from s jejich rozsahy — viz nginx.

Ověř si po nasazení, že v logu vidíš skutečné adresy návštěvníků, ne pořád tu samou.

Docker

Fail2ban běžící na hostiteli zapisuje pravidla do INPUT, ale provoz do kontejnerů jde přes FORWARD. Blokace tedy nemusí zabrat.

Řešení je nastavit banaction, která zapisuje do DOCKER-USER:

[DEFAULT]
banaction = iptables-allports
chain = DOCKER-USER

Souvislosti v Docker a firewall.

CrowdSec

Modernější alternativa. Rozdíl je v tom, že sdílí informace mezi instalacemi — když někoho zablokuje deset tisíc serverů, dozvíš se to dřív, než k tobě dorazí.

curl -s https://install.crowdsec.net | sh
apt install crowdsec
apt install crowdsec-firewall-bouncer-nftables
cscli metrics
cscli decisions list
cscli collections list
cscli collections install crowdsecurity/nginx

Architektura je oddělená: detektor čte logy a rozhoduje, bouncer blokuje. Bouncerů je víc druhů — firewallový, plugin do nginxu, plugin do Cloudflare.

Fail2ban nebo CrowdSec

Fail2ban je jednodušší, běží všude, nepotřebuje připojení ven, konfigurace je textová a předvídatelná. Pro jeden server je to pořád rozumná volba.

CrowdSec dává předběžnou ochranu díky sdílené databázi, lépe se škáluje a má hezčí přehledy. Cenou je složitější architektura a to, že posílá signály ven.

Pro homelab s pár službami bych zůstal u fail2ban. Když provozuješ něco veřejného a hlučného, CrowdSec dává větší smysl.

Nepouštěj oba naráz — budou si lézt do zelí ve firewallu.

Realistické očekávání

Tyhle nástroje řeší hlučnost, ne cílený útok. Botnet s deseti tisíci adresami je fail2ban neschopný zastavit, protože každá adresa zkusí jednou.

Skutečná obrana je jinde: klíče místo hesel, aktualizace, autentizace před službami a nevystavovat ven nic, co tam nemusí být.

Clone this wiki locally