Přejít na obsah
Aktuální kupón:sleva 10 %Uplatnit v objednávce

Fail2ban: automatické blokování útoků na SSH

Fail2ban hlídá neúspěšná přihlášení a útočníky automaticky blokuje. Instalace na Ubuntu 24.04 a Debian 13, jail.local vysvětlený řádek po řádku, recidive, odblokování IP a řešení chyb.

  • pokročilý
  • ~20 min
  • Aktualizováno 1. 10. 2026

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:

ČástCo děláPříklad pro SSH
FiltrPozná 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.

  1. Aktualizujte seznam balíčků a nainstalujte fail2ban:

    bash
    apt update
    apt install fail2ban
    • fail2ban – samotný program. Jako závislost se nainstaluje i python3-systemd, díky kterému umí číst systémový journal.
  2. Ověřte, že je k dispozici nástroj nft, přes který fail2ban blokuje:

    bash
    command -v nft || apt install nftables
    • command -v nft – vypíše cestu k programu nft, pokud existuje.
    • || – další příkaz se spustí jen tehdy, když předchozí selhal, tedy když nft chybí.
    • apt install nftables – nainstaluje nástroj. Samotná instalace nezapíná žádná pravidla ani nemění UFW.
  3. Zkontrolujte, že služba běží:

    bash
    systemctl status fail2ban

    Hledejte řá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/fail2ban/jail.d/defaults-debian.conf. 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#

  1. Vytvořte soubor:

    bash
    nano /etc/fail2ban/jail.local
  2. Vložte do něj:

    /etc/fail2ban/jail.localini
    [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 = 5
  3. Ulož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á hodnotaKdy změnit
ignoreipAdresy a rozsahy, které fail2ban nikdy nezablokuje. Odděluje se mezerou. 127.0.0.1/8 ::1 je samotná VPS.127.0.0.1/8 ::1Př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ý.
bantimeJak dlouho zůstane adresa zablokovaná. Jednotky: m minuty, h hodiny, d dny, w týdny. Výchozí je 10m.1hKratší (30m), pokud se často překlepnete a nemáte konzoli po ruce.
findtimeČasové okno, ve kterém se chyby sčítají.10mDelší (1h) proti pomalým útokům, které zkoušejí heslo jednou za pár minut.
maxretryKolik 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ů.53 pro SSH s vypnutým heslem (legitimní uživatel s klíčem chyby nedělá).
bantime.incrementPři každém dalším zablokování stejné adresy se doba prodlouží. Fail2ban si pamatuje historii v databázi.truefalse, pokud chcete vždy stejnou dobu.
bantime.factorNásobitel růstu. S hodnotou 1 roste doba 1, 2, 4, 8… × bantime.1Vyšší (2) pro rychlejší růst.
bantime.maxtimeStrop, přes který doba zablokování neporoste.1wDelší (4w) pro velmi vytrvalé útočníky.
enabledZapne jail. Jaily jsou ve výchozím stavu vypnuté.truefalse dočasně jail vypne.
portKteré porty se adrese zablokují. ssh znamená port 22.sshMáte-li SSH na jiném portu, napište ho číslem, například 2222 (viz níže).
backendOdkud číst záznamy. systemd = systémový journal, auto = soubor z logpath.systemd pro sshd, auto pro recidiveNikdy, pokud nevíte proč. Debian 13 nemá soubor /var/log/auth.log, SSH proto musí číst journal.
logpathSoubor se záznamy (jen pro backend = auto)./var/log/fail2ban.logNemění se.
banactionJak blokovat. %(banaction_allports)s = zablokovat všechny porty, ne jen SSH.%(banaction_allports)sNemě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:

bash
nano /etc/fail2ban/fail2ban.local
/etc/fail2ban/fail2ban.localini
[Definition]
dbpurgeage = 8d
NastaveníCo děláDoporučená hodnotaKdy změnit
dbpurgeagePo jaké době se staré záznamy o zablokování mažou z databáze /var/lib/fail2ban/fail2ban.sqlite3. Výchozí je 1d.8dVždy o něco delší než nejdelší bantime a bantime.maxtime.

Spuštění a kontrola#

  1. Zkontrolujte konfiguraci:

    bash
    fail2ban-client -t
    • -t – test konfigurace. Při úspěchu vypíše OK: configuration test is successful. Při chybě uvede soubor a problém.
  2. Restartujte fail2ban, aby načetl nové nastavení:

    bash
    systemctl restart fail2ban
  3. Vypište zapnuté jaily:

    bash
    fail2ban-client status
    Výstuptext
    Status
    |- Number of jail:	2
    `- Jail list:	recidive, sshd
  4. Zobrazte stav jailu sshd:

    bash
    fail2ban-client status sshd
    Vý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
ŘádekVýznam
Currently failedKolik adres má teď v okně findtime aspoň jednu chybu, ale ještě není zablokovaných.
Total failedPočet zachycených chyb od startu fail2banu.
Journal matchesKteré záznamy journalu jail čte. Na Ubuntu se může lišit (sshd.service), na funkci to nemá vliv.
Currently bannedKolik adres je teď zablokovaných.
Total bannedKolik zablokování proběhlo od startu.
Banned IP listSeznam 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říkazCo dělá
fail2ban-client set sshd unbanip 198.51.100.25Odblokuje adresu v jailu sshd.
fail2ban-client unban 198.51.100.25Odblokuje adresu ve všech jailech (včetně recidive) a smaže ji z databáze.
fail2ban-client unban --allOdblokuje všechny adresy ve všech jailech. Útočníci se při dalších pokusech zablokují znovu.
fail2ban-client banned 198.51.100.25Vypíš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 refused nebo Connection 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]:

/etc/fail2ban/jail.localini
[sshd]
enabled = true
port = 2222
backend = systemd
  • port = 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:

/etc/fail2ban/jail.localini
[nginx-http-auth]
enabled = true
backend = auto

[nginx-botsearch]
enabled = true
backend = auto
JailCo hlídá
nginx-http-authŠpatná hesla u stránek chráněných heslem (HTTP Basic Auth).
nginx-botsearchRoboty, 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:

bash
nft list table inet f2b-table
  • nft 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í#

  1. Zkuste ručně zablokovat testovací adresu:

    bash
    fail2ban-client set sshd banip 198.51.100.25
  2. Ověřte, že je ve firewallu: nft list table inet f2b-table musí adresu 198.51.100.25 obsahovat.

  3. Odblokujte ji: fail2ban-client set sshd unbanip 198.51.100.25.

  4. Za hodinu až dvě zkontrolujte fail2ban-client status sshd. Na veřejné VPS bývá Total failed a Total banned brzy 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.log hledejte chyby u akce (například nft: not found). Pak nainstalujte balíček nftables.
  • Zkontrolujte, že port v jailu odpovídá skutečnému portu SSH.

Kde hledat podrobnosti#

bash
tail -n 50 /var/log/fail2ban.log
journalctl -u fail2ban -n 50
  • tail -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 do jail.conf.
  • SSH čte journal (backend = systemd), recidive čte soubor (backend = auto).
  • Odblokování: fail2ban-client set sshd unbanip <IP> nebo fail2ban-client unban <IP>, když se odříznete, použijte konzoli.
  • Po přesunu SSH upravte port v jailu sshd.

Hledání v návodech