Fail2ban čte logy, počítá shody s regulárním výrazem a přidá pravidlo firewallu, když čítač dosáhne stropu. Celý užitek je v nastavení — po instalaci je aktivní jediný jail, a to pro SSH.

Kam patří nastavení

Souboru /etc/fail2ban/jail.conf se nedotýkejte — přepíše se při aktualizaci balíčku. Vlastní hodnoty patří do /etc/fail2ban/jail.local, který musí obsahovat jen to, co měníte.

[DEFAULT]
bantime  = 24h
findtime = 1h
maxretry = 5
ignoreip = 127.0.0.1/8 203.0.113.25

ignoreip je řádek, který se píše jako první. Bez něj dříve nebo později zablokujete vlastní adresu a pak se dovnitř dostanete jen přes konzoli v panelu hostingu.

K bantime

Výchozí hodnota deseti minut je prakticky zbytečná: automatický hádač hesel se vrátí a pokračuje. Jeden den je rozumné minimum. Ještě lepší je postupné navyšování:

bantime.increment = true
bantime.factor    = 2
bantime.maxtime   = 30d

Ten, kdo se vrací, pak dostává stále delší blokace, zatímco jediné neúspěšné přihlášení skutečného uživatele není trestáno tvrdě.

Jaily, které stojí za zapnutí

sshd už běží. Pokud jste přihlašování heslem zcela vypnuli, jail moc užitku nepřinese, ale ani neuškodí.

Autentizace webového serveru. Pokud je něco chráněno heslem přes server:

[nginx-http-auth]
enabled = true

[apache-auth]
enabled = true

Přihlašovací formulář vaší aplikace. Hotový filtr zde neexistuje — přihlašovací formulář webu zapisuje do vlastního logu aplikace ve vlastním formátu. Filtr napíšete sami do /etc/fail2ban/filter.d/ a právě tento jail přináší nejvíc, protože právě tam se hesla hádají.

Postfix a Dovecot, pokud server obsluhuje poštu. Poštovní porty jsou vystaveny hádání přinejmenším stejně jako SSH.

recidive — jail, který čte vlastní log Fail2banu a uděluje dlouhé blokace adresám, jež už byly zablokovány několikrát:

[recidive]
enabled  = true
bantime  = 4w
findtime = 1d
maxretry = 3

Ověřte, že to skutečně funguje

sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Poslední příkaz je nejdůležitější a používá se příliš zřídka. Ukáže, kolika řádkům v logu filtr skutečně odpovídá. Nula shod znamená, že jail běží, ale nic nedělá — buď je špatná cesta k logu, nebo nesedí formát.

Je to zároveň nejčastější důvod, proč Fail2ban vypadá funkčně, ale nikoho neblokuje: na Debianu 12 a Ubuntu 24.04 už /var/log/auth.log standardně neexistuje. Řešením je buď nainstalovat rsyslog, nebo nasměrovat jail na žurnál:

[sshd]
backend = systemd

Odblokování sebe sama

sudo fail2ban-client set sshd unbanip 203.0.113.25
sudo fail2ban-client unban --all

Tohle je dobré vědět předem, ne ve chvíli, kdy stojíte venku.

Co Fail2ban neumí

Pracuje s frekvencí z jedné a téže adresy. Distribuovaný útok — tisíc adres po jednom pokusu — projde přímo, protože žádný čítač nedosáhne stropu. Je to principiální omezení, ne chyba v nastavení.

Nezastaví ani zranitelnost v aplikaci. Požadavek, který zneužije díru v rozšíření, uspěje napoprvé a nezanechá po sobě žádné neúspěšné přihlášení. Fail2ban odstraňuje šum na pozadí; nenahrazuje včasné aktualizace.

Praktická hodnota se ukazuje v číslech v čase: kolik adres je zablokováno teď, který jail se spouští nejčastěji, zda se počet náhle nezměnil. Jail, který přestal na cokoli reagovat, je známkou toho, že se log přesunul — a to si člověk všimne, jen když se dívá. Jak to vypadá na jedné stránce, ukazuje ukázka níže.