Prejsť na obsah
Aktuálny kupón:zľava 10 %Uplatniť v objednávke

Fail2ban: automatické blokovanie útokov na SSH

Fail2ban stráži neúspešné prihlásenia a útočníkov automaticky blokuje. Inštalácia na Ubuntu 24.04 a Debian 13, jail.local vysvetlený riadok po riadku, recidive, odblokovanie IP a riešenie chýb.

  • pokročilý
  • ~20 min
  • Aktualizované 9. 10. 2026

Fail2ban sleduje záznamy o prihlasovaní a IP adresu, ktorá opakovane zadá nesprávne heslo, na čas zablokuje vo firewalle. Nainštalujete ho, nastavíte rozumné pravidlá vrátane prísnejšieho trestu pre opakovaných útočníkov a naučíte sa odblokovať adresu, keby to postihlo vás.

Čo budete potrebovať

  • VPS u StormHostu s Ubuntu 24.04 alebo Debianom 13
  • Pripojenie cez SSH ako root (návod)
  • Otvorenú konzolu v prehliadači pre prípad, že zablokujete sami seba
  • Približne 20 minút

Čo fail2ban robí#

Fail2ban pracuje s takzvanými jailmi (doslova „väzeniami“). Každý jail stráži jednu službu a má tri časti:

ČasťČo robíPríklad pre SSH
FilterRozpozná v záznamoch neúspešný pokus a vytiahne z neho IP adresu.Riadky Failed password for root from 198.51.100.25.
Zdroj záznamov (backend)Odkiaľ záznamy číta: zo systémového journalu, alebo zo súboru.Journal služby SSH.
Akcia (banaction)Čo urobí s adresou, ktorá prekročí limit.Pridá ju do zakázaných adries vo firewalle (nftables).

Keď adresa počas findtime urobí maxretry chýb, fail2ban ju na bantime zablokuje. Po uplynutí času ju sám odblokuje.

Fail2ban nenahrádza SSH kľúč

Fail2ban útočníkov spomalí a vyčistí logy, ale proti uhádnutiu slabého hesla úplne nechráni. Najlepšia kombinácia je SSH kľúč s vypnutým heslom a fail2ban k tomu.

Inštalácia#

Platí pre Ubuntu 24.04 aj Debian 13.

  1. Aktualizujte zoznam balíkov a nainštalujte fail2ban:

    bash
    apt update
    apt install fail2ban
    • fail2ban – samotný program. Ako závislosť sa nainštaluje aj python3-systemd, vďaka ktorému dokáže čítať systémový journal.
  2. Overte, že je k dispozícii nástroj nft, cez ktorý fail2ban blokuje:

    bash
    command -v nft || apt install nftables
    • command -v nft – vypíše cestu k programu nft, ak existuje.
    • || – ďalší príkaz sa spustí iba vtedy, keď predchádzajúci zlyhal, teda keď nft chýba.
    • apt install nftables – nainštaluje nástroj. Samotná inštalácia nezapína žiadne pravidlá ani nemení UFW.
  3. Skontrolujte, že služba beží:

    bash
    systemctl status fail2ban

    Hľadajte riadok Active: active (running). Výpis ukončíte klávesom q.

Po inštalácii už fail2ban chráni SSH s predvoleným nastavením distribúcie: jail sshd je zapnutý, záznamy číta zo systémového journalu a blokuje cez nftables. Predvolený trest je však iba 10 minút, preto si nastavenie upravte.

Prečo jail.local, a nie jail.conf#

Predvolené nastavenie je v /etc/fail2ban/jail.conf a v /etc/fail2ban/jail.d/defaults-debian.conf. Tieto súbory neupravujte, aktualizácia balíka by ich mohla prepísať. Vlastné nastavenie patrí do /etc/fail2ban/jail.local. Fail2ban číta súbory v poradí jail.conf › jail.d/*.conf › jail.local › jail.d/*.local a neskoršia hodnota vždy prepíše skoršiu.

Konfigurácia riadok po riadku#

  1. Vytvorte súbor:

    bash
    nano /etc/fail2ban/jail.local
  2. Vložte doň:

    /etc/fail2ban/jail.localini
    [DEFAULT]
    # Adresy, ktore sa nikdy nezablokuju (oddelene medzerou)
    ignoreip = 127.0.0.1/8 ::1
    # Dlzka prveho zablokovania
    bantime = 1h
    # Okno, v ktorom sa pocitaju neuspesne pokusy
    findtime = 10m
    # Pocet neuspesnych pokusov, po ktorom pride zablokovanie
    maxretry = 5
    # Opakovanym utocnikom predlzovat zablokovanie
    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 zatvorte editor (Ctrl+X).

Sekcie v hranatých zátvorkách: [DEFAULT] platí pre všetky jaily, [sshd] a [recidive] iba pre daný jail a majú prednosť pred [DEFAULT].

NastavenieČo robíOdporúčaná hodnotaKedy zmeniť
ignoreipAdresy a rozsahy, ktoré fail2ban nikdy nezablokuje. Oddeľuje sa medzerou. 127.0.0.1/8 ::1 je samotný VPS.127.0.0.1/8 ::1Pridajte svoju IP adresu, iba ak je pevná (kancelária, vlastný server). Dynamickú adresu domáceho pripojenia nepridávajte, časom ju môže dostať niekto iný.
bantimeAko dlho zostane adresa zablokovaná. Jednotky: m minúty, h hodiny, d dni, w týždne. Predvolené je 10m.1hKratší (30m), ak sa často pomýlite a nemáte konzolu poruke.
findtimeČasové okno, v ktorom sa chyby sčítajú.10mDlhší (1h) proti pomalým útokom, ktoré skúšajú heslo raz za pár minút.
maxretryKoľko chýb v rámci findtime vedie k zablokovaniu. Pri 3 sa môžete zablokovať sami preklepom, pri 10 má útočník viac pokusov.53 pre SSH s vypnutým heslom (legitímny používateľ s kľúčom chyby nerobí).
bantime.incrementPri každom ďalšom zablokovaní rovnakej adresy sa čas predĺži. Fail2ban si pamätá históriu v databáze.truefalse, ak chcete vždy rovnaký čas.
bantime.factorNásobiteľ rastu. S hodnotou 1 rastie čas 1, 2, 4, 8… × bantime.1Vyšší (2) pre rýchlejší rast.
bantime.maxtimeStrop, cez ktorý čas zablokovania neporastie.1wDlhší (4w) pre veľmi vytrvalých útočníkov.
enabledZapne jail. Jaily sú v predvolenom stave vypnuté.truefalse dočasne jail vypne.
portKtoré porty sa adrese zablokujú. ssh znamená port 22.sshAk máte SSH na inom porte, napíšte ho číslom, napríklad 2222 (pozri nižšie).
backendOdkiaľ čítať záznamy. systemd = systémový journal, auto = súbor z logpath.systemd pre sshd, auto pre recidiveNikdy, ak neviete prečo. Debian 13 nemá súbor /var/log/auth.log, SSH preto musí čítať journal.
logpathSúbor so záznamami (iba pre backend = auto)./var/log/fail2ban.logNemení sa.
banactionAko blokovať. %(banaction_allports)s = zablokovať všetky porty, nie iba SSH.%(banaction_allports)sNemení sa.

Recidive: prísnejší trest pre opakovaných útočníkov#

Jail recidive číta záznamy samotného fail2banu (/var/log/fail2ban.log). Keď rovnaká adresa dostane počas findtime (1 deň) aspoň maxretry (5) zablokovaní v akomkoľvek jaile, recidive ju zablokuje na bantime (1 týždeň) a na všetkých portoch. Útočník, ktorý sa vracia, tak príde o prístup k VPS úplne.

Preto recidive číta súbor (backend = auto) a nie journal: fail2ban zapisuje svoje záznamy do súboru /var/log/fail2ban.log, nie do journalu.

Aby si fail2ban pamätal históriu zablokovaní dosť dlho (pre bantime.increment aj pre obnovenie týždenných blokácií po reštarte), predĺžte čas uchovania v databáze:

bash
nano /etc/fail2ban/fail2ban.local
/etc/fail2ban/fail2ban.localini
[Definition]
dbpurgeage = 8d
NastavenieČo robíOdporúčaná hodnotaKedy zmeniť
dbpurgeagePo akom čase sa staré záznamy o zablokovaní mažú z databázy /var/lib/fail2ban/fail2ban.sqlite3. Predvolené je 1d.8dVždy o niečo dlhší než najdlhší bantime a bantime.maxtime.

Spustenie a kontrola#

  1. Skontrolujte konfiguráciu:

    bash
    fail2ban-client -t
    • -t – test konfigurácie. Pri úspechu vypíše OK: configuration test is successful. Pri chybe uvedie súbor a problém.
  2. Reštartujte fail2ban, aby načítal nové nastavenie:

    bash
    systemctl restart fail2ban
  3. Vypíš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
RiadokVýznam
Currently failedKoľko adries má teraz v okne findtime aspoň jednu chybu, ale ešte nie je zablokovaných.
Total failedPočet zachytených chýb od štartu fail2banu.
Journal matchesKtoré záznamy journalu jail číta. Na Ubuntu sa môže líšiť (sshd.service), na funkciu to nemá vplyv.
Currently bannedKoľko adries je teraz zablokovaných.
Total bannedKoľko zablokovaní prebehlo od štartu.
Banned IP listZoznam práve zablokovaných adries.

Odblokovanie IP adresy#

Ak ste zablokovali sami seba, prihláste sa cez konzolu v prehliadači (alebo z inej siete, napríklad cez mobilné dáta) a použite jeden z príkazov:

PríkazČo robí
fail2ban-client set sshd unbanip 198.51.100.25Odblokuje adresu v jaile sshd.
fail2ban-client unban 198.51.100.25Odblokuje adresu vo všetkých jailoch (vrátane recidive) a zmaže ju z databázy.
fail2ban-client unban --allOdblokuje všetky adresy vo všetkých jailoch. Útočníci sa pri ďalších pokusoch zablokujú znova.
fail2ban-client banned 198.51.100.25Vypíše, v ktorých jailoch je adresa zablokovaná.

Za 198.51.100.25 dosaďte svoju verejnú IP adresu. Ak ju nepoznáte, nájdete ju v zozname Banned IP list podľa času (záznamy o zablokovaní: grep "Ban " /var/log/fail2ban.log | tail), alebo ju vypíše ľubovoľná stránka „aká je moja IP adresa“ otvorená z počítača, z ktorého sa pripájate.

Svoju adresu zistíte aj vo chvíli, keď ste cez SSH prihlásení: echo $SSH_CLIENT vypíše ako prvý údaj adresu, z ktorej sa pripájate.

Ako spoznať, že ste zablokovaný vy#

  • SSH zrazu hlási Connection refused alebo Connection timed out, hoci ešte pred chvíľou fungovalo.
  • Z inej siete (mobilné dáta) sa pripojíte bez problémov.
  • Ak vás zablokoval recidive, nefungujú vám ani ostatné služby na VPS (web, herný server), ostatným ľuďom áno.
  • V konzole vidíte svoju adresu vo výpise fail2ban-client status sshd.

Zákaznícky účet a zmena hesla

Záložky Súbory a Databázy sa k VPS prihlasujú cez SSH heslom. Keď zmeníte root heslo a záložky sa niekoľkokrát pokúsia prihlásiť starým, fail2ban môže zablokovať aj adresu, z ktorej sa zákaznícky účet pripája. Po zmene hesla preto hneď zadajte nové v Súbory › Zmeniť prihlasovacie údaje. Ak už záložka nefunguje, spustite fail2ban-client unban --all a údaje zadajte znova.

SSH na inom porte#

Ak ste SSH presunuli (napríklad na 2222), upravte v jail.local riadok v sekcii [sshd]:

/etc/fail2ban/jail.localini
[sshd]
enabled = true
port = 2222
backend = systemd
  • port = 2222 – fail2ban zablokuje útočníkovi tento port. Pri nesprávnom porte by zablokovanie nemalo žiadny účinok. Pre viac portov ich oddeľte čiarkou: port = 22,2222.

Potom spustite fail2ban-client -t a systemctl restart fail2ban.

Ďalšie jaily: Nginx#

Ak na VPS prevádzkujete web s Nginx, môžete strážiť aj ten. Pridajte do jail.local:

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

[nginx-botsearch]
enabled = true
backend = auto
JailČo stráži
nginx-http-authNesprávne heslá pri stránkach chránených heslom (HTTP Basic Auth).
nginx-botsearchRoboty, ktoré hľadajú známe zraniteľné adresy (/wp-login.php, /phpmyadmin a pod.).
  • backend = auto – Nginx zapisuje do súboru /var/log/nginx/error.log, nie do journalu. Bez tohto riadka by jail na Ubuntu čítal journal a nič by nenašiel.

Fail2ban a firewall#

Fail2ban blokuje cez nftables vo vlastnej tabuľke f2b-table. Funguje preto vedľa UFW aj s firewallom v zákazníckom účte a nič z toho neprepisuje. Zablokované adresy uvidíte príkazom:

bash
nft list table inet f2b-table
  • nft list table inet f2b-table – vypíše tabuľku fail2banu vrátane množín (addr-set-sshd …) so zablokovanými adresami.

Ak chcete mať zablokované adresy vidieť priamo v ufw status, nastavte v [DEFAULT] riadok banaction = ufw (UFW musí byť zapnutý). Pre jail recidive potom nastavte banaction = ufw tiež. Predvolené nftables je však rýchlejšie a odporúčame ho.

Fail2ban chráni iba to, čo beží vo VPS. Firewall v zákazníckom účte fail2ban neovláda.

Overenie#

  1. Skúste ručne zablokovať testovaciu adresu:

    bash
    fail2ban-client set sshd banip 198.51.100.25
  2. Overte, že je vo firewalle: nft list table inet f2b-table musí adresu 198.51.100.25 obsahovať.

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

  4. O hodinu až dve skontrolujte fail2ban-client status sshd. Na verejnom VPS býva Total failed a Total banned čoskoro nenulové.

Keď niečo nefunguje#

fail2ban-client -t hlási chybu#

Výpis uvádza súbor a sekciu. Najčastejšie ide o preklep v názve nastavenia, chýbajúce = alebo hodnotu bez jednotky. Opravte súbor a test zopakujte.

Have not found any log file for sshd jail#

Jail sshd sa snaží čítať súbor /var/log/auth.log, ktorý na Debiane 13 neexistuje. V sekcii [sshd] musí byť backend = systemd.

No module named 'asynchat' (Ubuntu 24.04)#

Pôvodná verzia fail2banu v Ubuntu 24.04 nefungovala s Pythonom 3.12. Oprava je v aktualizáciách distribúcie: spustite apt update && apt full-upgrade a potom systemctl restart fail2ban.

Fail2ban adresy hlási ako zablokované, ale útočník ďalej skúša heslá#

  • V /var/log/fail2ban.log hľadajte chyby pri akcii (napríklad nft: not found). Potom nainštalujte balík nftables.
  • Skontrolujte, že port v jaile zodpovedá skutočnému portu SSH.

Kde hľadať podrobnosti#

bash
tail -n 50 /var/log/fail2ban.log
journalctl -u fail2ban -n 50
  • tail -n 50 /var/log/fail2ban.log – posledných 50 riadkov logu fail2banu (zablokovanie Ban, odblokovanie Unban, chyby).
  • journalctl -u fail2ban -n 50 – posledných 50 záznamov služby, hodí sa, keď fail2ban vôbec nenaštartuje.

Zhrnutie

  • Fail2ban blokuje IP adresy po opakovaných chybných prihláseniach; nainštalujete ho príkazom apt install fail2ban.
  • Vlastné nastavenie patrí do /etc/fail2ban/jail.local, nikdy do jail.conf.
  • SSH číta journal (backend = systemd), recidive číta súbor (backend = auto).
  • Odblokovanie: fail2ban-client set sshd unbanip <IP> alebo fail2ban-client unban <IP>, keď sa odrežete, použite konzolu.
  • Po presune SSH upravte port v jaile sshd.

Hľadanie v návodoch