Fail2ban sleduje záznamy o přihlašování a IP adresu, která opakovaně zadá špatné heslo, na čas zablokuje ve firewallu. Nainstalujete ho, nastavíte rozumná pravidla včetně přísnějšího trestu pro opakované útočníky a naučíte se odblokovat adresu, kdyby to potkalo vás.
Co budete potřebovat
- VPS u StormHostu s Ubuntu 24.04 nebo Debianem 13
- Připojení přes SSH jako root (návod)
- Otevřená konzole v prohlížeči pro případ, že zablokujete sami sebe
- Asi 20 minut
Co fail2ban dělá#
Fail2ban pracuje s takzvanými jaily (doslova „vězeními“). Každý jail hlídá jednu službu a má tři části:
| Část | Co dělá | Příklad pro SSH |
|---|---|---|
| Filtr | Pozná v záznamech neúspěšný pokus a vytáhne z něj IP adresu. | Řádky Failed password for root from 198.51.100.25. |
| Zdroj záznamů (backend) | Odkud záznamy čte: ze systémového journalu, nebo ze souboru. | Journal služby SSH. |
| Akce (banaction) | Co udělá s adresou, která překročí limit. | Přidá ji do zakázaných adres ve firewallu (nftables). |
Když adresa během findtime udělá maxretry chyb, fail2ban ji na bantime zablokuje. Po uplynutí doby ji sám odblokuje.
Fail2ban nenahrazuje SSH klíč
Fail2ban útočníky zpomalí a vyčistí logy, ale proti uhodnutí slabého hesla úplně nechrání. Nejlepší kombinace je SSH klíč s vypnutým heslem a fail2ban k tomu.
Instalace#
Platí pro Ubuntu 24.04 i Debian 13.
Aktualizujte seznam balíčků a nainstalujte fail2ban:
bash apt update apt install fail2banfail2ban– samotný program. Jako závislost se nainstaluje ipython3-systemd, díky kterému umí číst systémový journal.
Ověřte, že je k dispozici nástroj
nft, přes který fail2ban blokuje:bash command -v nft || apt install nftablescommand -v nft– vypíše cestu k programunft, pokud existuje.||– další příkaz se spustí jen tehdy, když předchozí selhal, tedy kdyžnftchybí.apt install nftables– nainstaluje nástroj. Samotná instalace nezapíná žádná pravidla ani nemění UFW.
Zkontrolujte, že služba běží:
bash systemctl status fail2banHledejte řádek
Active: active (running). Výpis ukončíte klávesou q.
Po instalaci už fail2ban chrání SSH s výchozím nastavením distribuce: jail sshd je zapnutý, záznamy čte ze systémového journalu a blokuje přes nftables. Výchozí trest je ale jen 10 minut, proto si nastavení upravte.
Proč jail.local, a ne jail.conf#
Výchozí nastavení je v /etc/fail2ban/jail.conf a v /etc/. Tyto soubory neupravujte, aktualizace balíčku by je mohla přepsat. Vlastní nastavení patří do /etc/fail2ban/jail.local. Fail2ban čte soubory v pořadí jail.conf › jail.d/*.conf › jail.local › jail.d/*.local a pozdější hodnota vždy přepíše dřívější.
Konfigurace řádek po řádku#
Vytvořte soubor:
bash nano /etc/fail2ban/jail.localVložte do něj:
/etc/ fail2ban/ inijail.local [DEFAULT] # Adresy, ktere se nikdy nezablokuji (oddelene mezerou) ignoreip = 127.0.0.1/8 ::1 # Delka prvniho zablokovani bantime = 1h # Okno, ve kterem se pocitaji neuspesne pokusy findtime = 10m # Pocet neuspesnych pokusu, po kterem prijde zablokovani maxretry = 5 # Opakovanym utocnikum prodluzovat zablokovani bantime.increment = true bantime.factor = 1 bantime.maxtime = 1w [sshd] enabled = true port = ssh backend = systemd [recidive] enabled = true backend = auto logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = 1w findtime = 1d maxretry = 5Uložte (Ctrl+O, Enter) a zavřete editor (Ctrl+X).
Sekce v hranatých závorkách: [DEFAULT] platí pro všechny jaily, [sshd] a [recidive] jen pro daný jail a mají přednost před [DEFAULT].
| Nastavení | Co dělá | Doporučená hodnota | Kdy změnit |
|---|---|---|---|
ignoreip | Adresy a rozsahy, které fail2ban nikdy nezablokuje. Odděluje se mezerou. 127.0.0.1/8 ::1 je samotná VPS. | 127.0.0.1/8 ::1 | Přidejte svou IP adresu, jen pokud je pevná (kancelář, vlastní server). Dynamickou adresu domácího připojení nepřidávejte, za čas ji může dostat někdo jiný. |
bantime | Jak dlouho zůstane adresa zablokovaná. Jednotky: m minuty, h hodiny, d dny, w týdny. Výchozí je 10m. | 1h | Kratší (30m), pokud se často překlepnete a nemáte konzoli po ruce. |
findtime | Časové okno, ve kterém se chyby sčítají. | 10m | Delší (1h) proti pomalým útokům, které zkoušejí heslo jednou za pár minut. |
maxretry | Kolik chyb v rámci findtime vede k zablokování. Při 3 se můžete zablokovat sami překlepem, při 10 má útočník víc pokusů. | 5 | 3 pro SSH s vypnutým heslem (legitimní uživatel s klíčem chyby nedělá). |
bantime.increment | Při každém dalším zablokování stejné adresy se doba prodlouží. Fail2ban si pamatuje historii v databázi. | true | false, pokud chcete vždy stejnou dobu. |
bantime.factor | Násobitel růstu. S hodnotou 1 roste doba 1, 2, 4, 8… × bantime. | 1 | Vyšší (2) pro rychlejší růst. |
bantime.maxtime | Strop, přes který doba zablokování neporoste. | 1w | Delší (4w) pro velmi vytrvalé útočníky. |
enabled | Zapne jail. Jaily jsou ve výchozím stavu vypnuté. | true | false dočasně jail vypne. |
port | Které porty se adrese zablokují. ssh znamená port 22. | ssh | Máte-li SSH na jiném portu, napište ho číslem, například 2222 (viz níže). |
backend | Odkud číst záznamy. systemd = systémový journal, auto = soubor z logpath. | systemd pro sshd, auto pro recidive | Nikdy, pokud nevíte proč. Debian 13 nemá soubor /var/log/auth.log, SSH proto musí číst journal. |
logpath | Soubor se záznamy (jen pro backend = auto). | /var/log/fail2ban.log | Nemění se. |
banaction | Jak blokovat. %(banaction_allports)s = zablokovat všechny porty, ne jen SSH. | %(banaction_allports)s | Nemění se. |
Recidive: přísnější trest pro opakované útočníky#
Jail recidive čte záznamy samotného fail2banu (/var/log/fail2ban.log). Když stejná adresa dostane během findtime (1 den) aspoň maxretry (5) zablokování v jakémkoli jailu, recidive ji zablokuje na bantime (1 týden) a na všech portech. Útočník, který se vrací, tak přijde o přístup k VPS úplně.
Proto recidive čte soubor (backend = auto) a ne journal: fail2ban zapisuje své záznamy do souboru /var/log/fail2ban.log, ne do journalu.
Aby si fail2ban pamatoval historii zablokování dost dlouho (pro bantime.increment i pro obnovení týdenních blokací po restartu), prodlužte dobu uchování v databázi:
nano /etc/fail2ban/fail2ban.local[Definition]
dbpurgeage = 8d| Nastavení | Co dělá | Doporučená hodnota | Kdy změnit |
|---|---|---|---|
dbpurgeage | Po jaké době se staré záznamy o zablokování mažou z databáze /var/. Výchozí je 1d. | 8d | Vždy o něco delší než nejdelší bantime a bantime.maxtime. |
Spuštění a kontrola#
Zkontrolujte konfiguraci:
bash fail2ban-client -t-t– test konfigurace. Při úspěchu vypíšeOK: configuration test is successful. Při chybě uvede soubor a problém.
Restartujte fail2ban, aby načetl nové nastavení:
bash systemctl restart fail2banVypište zapnuté jaily:
bash fail2ban-client statusVýstuptext Status |- Number of jail: 2 `- Jail list: recidive, sshdZobrazte stav jailu
sshd:bash fail2ban-client status sshdVýstuptext Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 57 | `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd `- Actions |- Currently banned: 3 |- Total banned: 12 `- Banned IP list: 198.51.100.25 198.51.100.40 198.51.100.77
| Řádek | Význam |
|---|---|
Currently failed | Kolik adres má teď v okně findtime aspoň jednu chybu, ale ještě není zablokovaných. |
Total failed | Počet zachycených chyb od startu fail2banu. |
Journal matches | Které záznamy journalu jail čte. Na Ubuntu se může lišit (sshd.service), na funkci to nemá vliv. |
Currently banned | Kolik adres je teď zablokovaných. |
Total banned | Kolik zablokování proběhlo od startu. |
Banned IP list | Seznam právě zablokovaných adres. |
Odblokování IP adresy#
Pokud jste zablokovali sami sebe, přihlaste se přes konzoli v prohlížeči (nebo z jiné sítě, například přes mobilní data) a použijte jeden z příkazů:
| Příkaz | Co dělá |
|---|---|
fail2ban-client set sshd unbanip 198.51.100.25 | Odblokuje adresu v jailu sshd. |
fail2ban-client unban 198.51.100.25 | Odblokuje adresu ve všech jailech (včetně recidive) a smaže ji z databáze. |
fail2ban-client unban --all | Odblokuje všechny adresy ve všech jailech. Útočníci se při dalších pokusech zablokují znovu. |
fail2ban-client banned 198.51.100.25 | Vypíše, ve kterých jailech je adresa zablokovaná. |
Za 198.51.100.25 dosaďte svou veřejnou IP adresu. Pokud ji neznáte, najdete ji v seznamu Banned IP list podle času (záznamy o zablokování: grep "Ban " /var/log/fail2ban.log | tail), nebo ji vypíše libovolná stránka „jaká je moje IP adresa“ otevřená z počítače, ze kterého se připojujete.
Svou adresu zjistíte také ve chvíli, kdy jste přes SSH přihlášení: echo $SSH_CLIENT vypíše jako první údaj adresu, ze které se připojujete.
Jak poznat, že jste zablokovaný vy#
- SSH najednou hlásí
Connection refusedneboConnection timed out, přestože ještě před chvílí fungovalo. - Z jiné sítě (mobilní data) se připojíte bez problému.
- Pokud vás zablokoval
recidive, nefungují vám ani ostatní služby na VPS (web, herní server), ostatním lidem ano. - V konzoli vidíte svou adresu ve výpisu
fail2ban-client status sshd.
Zákaznická zóna a změna hesla
Záložky Soubory a Databáze se k VPS přihlašují přes SSH heslem. Když změníte root heslo a záložky se několikrát pokusí přihlásit se starým, fail2ban může zablokovat i adresu, ze které se zákaznická zóna připojuje. Po změně hesla proto hned zadejte nové v Soubory › Změnit přihlašovací údaje. Pokud už záložka nefunguje, spusťte fail2ban-client unban --all a údaje zadejte znovu.
SSH na jiném portu#
Pokud jste SSH přesunuli (například na 2222), upravte v jail.local řádek v sekci [sshd]:
[sshd]
enabled = true
port = 2222
backend = systemdport = 2222– fail2ban zablokuje útočníkovi tento port. Při nesprávném portu by zablokování nemělo žádný účinek. Pro více portů je oddělte čárkou:port = 22,2222.
Pak spusťte fail2ban-client -t a systemctl restart fail2ban.
Další jaily: Nginx#
Pokud na VPS provozujete web s Nginx, můžete hlídat i ten. Přidejte do jail.local:
[nginx-http-auth]
enabled = true
backend = auto
[nginx-botsearch]
enabled = true
backend = auto| Jail | Co hlídá |
|---|---|
nginx-http-auth | Špatná hesla u stránek chráněných heslem (HTTP Basic Auth). |
nginx-botsearch | Roboty, kteří hledají známé zranitelné adresy (/wp-login.php, /phpmyadmin apod.). |
backend = auto– Nginx zapisuje do souboru/var/log/nginx/error.log, ne do journalu. Bez tohoto řádku by jail na Ubuntu četl journal a nic by nenašel.
Fail2ban a firewall#
Fail2ban blokuje přes nftables ve vlastní tabulce f2b-table. Funguje proto vedle UFW i s firewallem v zákaznické zóně a nic z toho nepřepisuje. Zablokované adresy uvidíte příkazem:
nft list table inet f2b-tablenft list table inet f2b-table– vypíše tabulku fail2banu včetně množin (addr-set-sshd…) se zablokovanými adresami.
Pokud chcete mít zablokované adresy vidět přímo v ufw status, nastavte v [DEFAULT] řádek banaction = ufw (UFW musí být zapnutý). Pro jail recidive pak nastavte banaction = ufw také. Výchozí nftables je ale rychlejší a doporučujeme ho.
Fail2ban chrání jen to, co běží ve VPS. Firewall v zákaznické zóně fail2ban neovládá.
Ověření#
Zkuste ručně zablokovat testovací adresu:
bash fail2ban-client set sshd banip 198.51.100.25Ověřte, že je ve firewallu:
nft list table inet f2b-tablemusí adresu198.51.100.25obsahovat.Odblokujte ji:
fail2ban-client set sshd unbanip 198.51.100.25.Za hodinu až dvě zkontrolujte
fail2ban-client status sshd. Na veřejné VPS býváTotal failedaTotal bannedbrzy nenulové.
Když něco nefunguje#
fail2ban-client -t hlásí chybu#
Výpis uvádí soubor a sekci. Nejčastěji jde o překlep v názvu nastavení, chybějící = nebo hodnotu bez jednotky. Opravte soubor a test zopakujte.
Have not found any log file for sshd jail#
Jail sshd se snaží číst soubor /var/log/auth.log, který na Debianu 13 neexistuje. V sekci [sshd] musí být backend = systemd.
No module named 'asynchat' (Ubuntu 24.04)#
Původní verze fail2banu v Ubuntu 24.04 nefungovala s Pythonem 3.12. Oprava je v aktualizacích distribuce: spusťte apt update && apt full-upgrade a pak systemctl restart fail2ban.
Fail2ban adresy hlásí jako zablokované, ale útočník dál zkouší hesla#
- V
/var/log/fail2ban.loghledejte chyby u akce (napříkladnft: not found). Pak nainstalujte balíčeknftables. - Zkontrolujte, že
portv jailu odpovídá skutečnému portu SSH.
Kde hledat podrobnosti#
tail -n 50 /var/log/fail2ban.log
journalctl -u fail2ban -n 50tail -n 50 /var/log/fail2ban.log– posledních 50 řádků logu fail2banu (zablokováníBan, odblokováníUnban, chyby).journalctl -u fail2ban -n 50– posledních 50 záznamů služby, hodí se, když fail2ban vůbec nenastartuje.
Shrnutí
- Fail2ban blokuje IP adresy po opakovaných chybných přihlášeních; nainstalujete ho příkazem
apt install fail2ban. - Vlastní nastavení patří do
/etc/fail2ban/jail.local, nikdy dojail.conf. - SSH čte journal (
backend = systemd),recidivečte soubor (backend = auto). - Odblokování:
fail2ban-client set sshd unbanip <IP>nebofail2ban-client unban <IP>, když se odříznete, použijte konzoli. - Po přesunu SSH upravte
portv jailusshd.