Przejdź do treści
Aktualny kupon:10% zniżkiUżyj w zamówieniu

Fail2ban: automatyczne blokowanie ataków na SSH

Fail2ban obserwuje nieudane logowania i automatycznie blokuje atakujących. Instalacja na Ubuntu 24.04 i Debianie 13, jail.local linia po linii, recidive, odblokowanie IP i naprawa błędów.

  • zaawansowany
  • ~20 min
  • Zaktualizowano 9.10.2026

Fail2ban obserwuje zapisy logowań i tymczasowo blokuje w firewallu adres IP, który raz za razem wpisuje złe hasło. Zainstalujesz go, ustawisz rozsądne reguły łącznie z surowszą karą dla powracających atakujących i nauczysz się odblokować adres, jeśli przytrafi się to Tobie.

Czego potrzebujesz

  • VPS w StormHost z Ubuntu 24.04 lub Debianem 13
  • Połączenie SSH jako root (poradnik)
  • Otwarta konsola w przeglądarce na wypadek zablokowania samego siebie
  • Około 20 minut

Co robi fail2ban#

Fail2ban pracuje z jailami. Każdy jail obserwuje jedną usługę i ma trzy części:

CzęśćCo robiPrzykład dla SSH
FiltrRozpoznaje w zapisach nieudaną próbę i wyciąga z niej adres IP.Linie Failed password for root from 198.51.100.25.
Źródło logu (backend)Skąd czyta zapisy: z dziennika systemowego lub z pliku.Dziennik usługi SSH.
Akcja (banaction)Co robi z adresem, który przekroczy limit.Dodaje go do zablokowanych adresów w firewallu (nftables).

Gdy adres zrobi maxretry nieudanych prób w ciągu findtime, fail2ban blokuje go na bantime. Po upływie czasu odblokowuje go sam.

Fail2ban nie zastępuje klucza SSH

Fail2ban spowalnia atakujących i utrzymuje czyste logi, ale nie chroni w pełni przed zgadnięciem słabego hasła. Najlepsze połączenie to klucz SSH z wyłączonymi hasłami plus fail2ban.

Instalacja#

Dotyczy zarówno Ubuntu 24.04, jak i Debiana 13.

  1. Zaktualizuj listę pakietów i zainstaluj fail2ban:

    bash
    apt update
    apt install fail2ban
    • fail2ban – sam program. Jako zależność instaluje się też python3-systemd, który pozwala mu czytać dziennik systemowy.
  2. Sprawdź, czy dostępne jest narzędzie nft, którego fail2ban używa do blokowania:

    bash
    command -v nft || apt install nftables
    • command -v nft – wypisuje ścieżkę do programu nft, jeśli istnieje.
    • || – następne polecenie uruchamia się tylko wtedy, gdy poprzednie się nie powiodło, czyli gdy brakuje nft.
    • apt install nftables – instaluje narzędzie. Instalacja nie włącza żadnych reguł ani nie zmienia UFW.
  3. Sprawdź, czy usługa działa:

    bash
    systemctl status fail2ban

    Szukaj linii Active: active (running). Wyjście zamknij klawiszem q.

Zaraz po instalacji fail2ban chroni już SSH z domyślnymi ustawieniami dystrybucji: jail sshd jest włączony, czyta zapisy z dziennika systemowego i blokuje przez nftables. Domyślna blokada trwa jednak tylko 10 minut, więc dostosuj ustawienia.

Dlaczego jail.local, a nie jail.conf#

Ustawienia domyślne są w /etc/fail2ban/jail.conf i w /etc/fail2ban/jail.d/defaults-debian.conf. Tych plików nie edytuj; aktualizacja pakietu mogłaby je nadpisać. Własne ustawienia trafiają do /etc/fail2ban/jail.local. Fail2ban czyta pliki w kolejności jail.conf › jail.d/*.conf › jail.local › jail.d/*.local, a późniejsza wartość zawsze nadpisuje wcześniejszą.

Konfiguracja linia po linii#

  1. Utwórz plik:

    bash
    nano /etc/fail2ban/jail.local
  2. Wpisz do niego:

    /etc/fail2ban/jail.localini
    [DEFAULT]
    # Adresy, które nigdy nie są blokowane (oddzielone spacjami)
    ignoreip = 127.0.0.1/8 ::1
    # Długość pierwszej blokady
    bantime = 1h
    # Okno, w którym liczone są nieudane próby
    findtime = 10m
    # Liczba nieudanych prób wywołująca blokadę
    maxretry = 5
    # Powracających blokuj na dłużej
    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. Zapisz (Ctrl+O, Enter) i zamknij edytor (Ctrl+X).

Sekcje w nawiasach kwadratowych: [DEFAULT] dotyczy wszystkich jaili; [sshd] i [recidive] dotyczą tylko danego jaila i mają pierwszeństwo przed [DEFAULT].

UstawienieCo robiZalecana wartośćKiedy zmieniać
ignoreipAdresy i zakresy, których fail2ban nigdy nie blokuje. Oddzielone spacjami. 127.0.0.1/8 ::1 to sam VPS.127.0.0.1/8 ::1Dodaj swój adres IP tylko jeśli jest statyczny (biuro, własny serwer). Nie dodawaj dynamicznego adresu łącza domowego; po jakimś czasie może dostać go ktoś inny.
bantimeJak długo adres pozostaje zablokowany. Jednostki: m minuty, h godziny, d dni, w tygodnie. Domyślnie 10m.1hKrócej (30m), jeśli często się mylisz i nie masz pod ręką konsoli.
findtimeOkno czasowe, w którym liczone są nieudane próby.10mDłużej (1h) przeciw powolnym atakom próbującym hasła raz na kilka minut.
maxretryIle nieudanych prób w ciągu findtime prowadzi do blokady. Przy 3 możesz zablokować się literówką; przy 10 atakujący dostaje więcej prób.53 dla SSH z wyłączonymi hasłami (legalny użytkownik z kluczem nie robi błędów).
bantime.incrementKażda kolejna blokada tego samego adresu trwa dłużej. Fail2ban trzyma historię w bazie danych.truefalse, jeśli zawsze chcesz tego samego czasu.
bantime.factorMnożnik wzrostu. Przy wartości 1 czas rośnie 1, 2, 4, 8… × bantime.1Wyżej (2) dla szybszego wzrostu.
bantime.maxtimeGranica, powyżej której czas blokady już nie rośnie.1wDłużej (4w) dla bardzo wytrwałych atakujących.
enabledWłącza jail. Jaile są domyślnie wyłączone.truefalse tymczasowo wyłącza jail.
portKtóre porty są blokowane dla adresu. ssh oznacza port 22.sshJeśli SSH działa na innym porcie, wpisz go jako liczbę, na przykład 2222 (zobacz niżej).
backendSkąd czytać zapisy. systemd = dziennik systemowy, auto = plik z logpath.systemd dla sshd, auto dla recidiveNigdy, chyba że wiesz dlaczego. Debian 13 nie ma pliku /var/log/auth.log, więc SSH musi czytać dziennik.
logpathPlik z zapisami (tylko dla backend = auto)./var/log/fail2ban.logNie zmienia się.
banactionJak blokować. %(banaction_allports)s = blokuj wszystkie porty, nie tylko SSH.%(banaction_allports)sNie zmienia się.

Recidive: surowsza kara dla powracających#

Jail recidive czyta własne zapisy fail2ban (/var/log/fail2ban.log). Gdy ten sam adres dostanie co najmniej maxretry (5) blokad w dowolnym jailu w ciągu findtime (1 dzień), recidive blokuje go na bantime (1 tydzień) i na wszystkich portach. Atakujący, który wciąż wraca, traci w ten sposób dostęp do VPS całkowicie.

Dlatego recidive czyta plik (backend = auto), a nie dziennik: fail2ban zapisuje swoje zapisy do pliku /var/log/fail2ban.log, nie do dziennika.

Aby fail2ban pamiętał historię blokad wystarczająco długo (dla bantime.increment i dla przywracania tygodniowych blokad po restarcie), wydłuż czas jej przechowywania w bazie:

bash
nano /etc/fail2ban/fail2ban.local
/etc/fail2ban/fail2ban.localini
[Definition]
dbpurgeage = 8d
UstawienieCo robiZalecana wartośćKiedy zmieniać
dbpurgeagePo jakim czasie stare zapisy blokad są usuwane z bazy /var/lib/fail2ban/fail2ban.sqlite3. Domyślnie 1d.8dZawsze nieco dłużej niż najdłuższy bantime i bantime.maxtime.

Uruchomienie i kontrola#

  1. Sprawdź konfigurację:

    bash
    fail2ban-client -t
    • -t – test konfiguracji. Przy powodzeniu wypisuje OK: configuration test is successful. Przy błędzie podaje plik i problem.
  2. Zrestartuj fail2ban, aby wczytał nowe ustawienia:

    bash
    systemctl restart fail2ban
  3. Wypisz aktywne jaile:

    bash
    fail2ban-client status
    Wyniktext
    Status
    |- Number of jail:	2
    `- Jail list:	recidive, sshd
  4. Pokaż status jaila sshd:

    bash
    fail2ban-client status sshd
    Wyniktext
    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
LiniaZnaczenie
Currently failedIle adresów ma obecnie co najmniej jedną nieudaną próbę w oknie findtime, ale nie jest jeszcze zablokowanych.
Total failedLiczba nieudanych prób przechwyconych od startu fail2ban.
Journal matchesKtóre zapisy dziennika czyta jail. Na Ubuntu może się różnić (sshd.service); nie wpływa to na działanie.
Currently bannedIle adresów jest zablokowanych w tej chwili.
Total bannedIle blokad nastąpiło od startu.
Banned IP listLista obecnie zablokowanych adresów.

Odblokowanie adresu IP#

Jeśli zablokowano Ciebie, zaloguj się przez konsolę w przeglądarce (albo z innej sieci, na przykład przez dane mobilne) i użyj jednego z tych poleceń:

PolecenieCo robi
fail2ban-client set sshd unbanip 198.51.100.25Odblokowuje adres w jailu sshd.
fail2ban-client unban 198.51.100.25Odblokowuje adres we wszystkich jailach (łącznie z recidive) i usuwa go z bazy.
fail2ban-client unban --allOdblokowuje wszystkie adresy we wszystkich jailach. Atakujący zostaną zablokowani ponownie przy kolejnych próbach.
fail2ban-client banned 198.51.100.25Pokazuje, w których jailach adres jest zablokowany.

Zamień 198.51.100.25 na swój publiczny adres IP. Jeśli go nie znasz, znajdź go w Banned IP list po czasie (zapisy blokad: grep "Ban " /var/log/fail2ban.log | tail) albo otwórz na komputerze, z którego się łączysz, dowolną stronę typu „jaki jest mój adres IP”.

Swój adres znajdziesz też, gdy jesteś zalogowany przez SSH: echo $SSH_CLIENT wypisuje jako pierwszą wartość adres, z którego się łączysz.

Jak poznać, że zablokowano Ciebie#

  • SSH nagle zgłasza Connection refused lub Connection timed out, choć przed chwilą działało.
  • Z innej sieci (dane mobilne) łączysz się bez problemu.
  • Jeśli zablokował Cię recidive, nie działają dla Ciebie także inne usługi na VPS (strona, serwer gier), podczas gdy u innych działają.
  • W konsoli widzisz swój adres w wyjściu fail2ban-client status sshd.

Strefa klienta a zmiany hasła

Zakładki Pliki i Baza danych logują się do VPS przez SSH hasłem. Gdy zmienisz hasło root, a zakładki kilka razy spróbują zalogować się starym, fail2ban może zablokować także adres, z którego łączy się strefa klienta. Dlatego zaraz po zmianie hasła wpisz nowe w Pliki › Zmień dane logowania. Jeśli zakładka już nie działa, uruchom fail2ban-client unban --all i wpisz dane logowania ponownie.

SSH na innym porcie#

Jeśli przeniesiono SSH (na przykład na 2222), zaktualizuj linię w sekcji [sshd] w jail.local:

/etc/fail2ban/jail.localini
[sshd]
enabled = true
port = 2222
backend = systemd
  • port = 2222 – fail2ban blokuje atakującemu ten port. Przy złym porcie blokada nie miałaby efektu. Więcej portów oddziel przecinkiem: port = 22,2222.

Potem uruchom fail2ban-client -t i systemctl restart fail2ban.

Więcej jaili: Nginx#

Jeśli na VPS działa strona WWW z Nginx, możesz obserwować także ją. Dodaj do jail.local:

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

[nginx-botsearch]
enabled = true
backend = auto
JailCo obserwuje
nginx-http-authZłe hasła na stronach chronionych hasłem (HTTP Basic Auth).
nginx-botsearchBoty szukające znanych podatnych adresów (/wp-login.php, /phpmyadmin i podobnych).
  • backend = auto – Nginx pisze do pliku /var/log/nginx/error.log, nie do dziennika. Bez tej linii na Ubuntu jail czytałby dziennik i niczego by nie znalazł.

Fail2ban a firewall#

Fail2ban blokuje przez nftables we własnej tabeli f2b-table. Działa więc obok UFW i firewalla w strefie klienta i żadnego z nich nie nadpisuje. Zablokowane adresy zobaczysz przez:

bash
nft list table inet f2b-table
  • nft list table inet f2b-table – wypisuje tabelę fail2ban łącznie ze zbiorami (addr-set-sshd …) z zablokowanymi adresami.

Jeśli chcesz widzieć zablokowane adresy bezpośrednio w ufw status, ustaw linię banaction = ufw w [DEFAULT] (UFW musi być włączony). Potem ustaw banaction = ufw także dla jaila recidive. Domyślny nftables jest jednak szybszy i go zalecamy.

Fail2ban chroni tylko to, co działa wewnątrz VPS. Nie steruje firewallem w strefie klienta.

Weryfikacja#

  1. Spróbuj ręcznie zablokować testowy adres:

    bash
    fail2ban-client set sshd banip 198.51.100.25
  2. Sprawdź, czy jest w firewallu: nft list table inet f2b-table musi zawierać adres 198.51.100.25.

  3. Odblokuj go: fail2ban-client set sshd unbanip 198.51.100.25.

  4. Po godzinie lub dwóch sprawdź fail2ban-client status sshd. Na publicznym VPS Total failed i Total banned zwykle szybko są niezerowe.

Rozwiązywanie problemów#

fail2ban-client -t zgłasza błąd#

Wyjście podaje plik i sekcję. Najczęściej to literówka w nazwie ustawienia, brak = albo wartość bez jednostki. Popraw plik i uruchom test ponownie.

Have not found any log file for sshd jail#

Jail sshd próbuje czytać plik /var/log/auth.log, który na Debianie 13 nie istnieje. Sekcja [sshd] musi zawierać backend = systemd.

No module named 'asynchat' (Ubuntu 24.04)#

Pierwotna wersja fail2ban w Ubuntu 24.04 nie działała z Pythonem 3.12. Poprawka jest w aktualizacjach dystrybucji: uruchom apt update && apt full-upgrade, a potem systemctl restart fail2ban.

Fail2ban zgłasza adresy jako zablokowane, ale atakujący dalej próbuje haseł#

  • Poszukaj błędów akcji w /var/log/fail2ban.log (na przykład nft: not found). Zainstaluj wtedy pakiet nftables.
  • Sprawdź, czy port w jailu zgadza się z rzeczywistym portem SSH.

Gdzie szukać szczegółów#

bash
tail -n 50 /var/log/fail2ban.log
journalctl -u fail2ban -n 50
  • tail -n 50 /var/log/fail2ban.log – ostatnie 50 linii logu fail2ban (blokady Ban, odblokowania Unban, błędy).
  • journalctl -u fail2ban -n 50 – ostatnie 50 wpisów usługi; przydatne, gdy fail2ban w ogóle nie startuje.

Podsumowanie

  • Fail2ban blokuje adresy IP po wielokrotnych nieudanych logowaniach; zainstaluj go przez apt install fail2ban.
  • Własne ustawienia trafiają do /etc/fail2ban/jail.local, nigdy do jail.conf.
  • SSH czyta dziennik (backend = systemd), recidive czyta plik (backend = auto).
  • Odblokowanie: fail2ban-client set sshd unbanip <IP> lub fail2ban-client unban <IP>; jeśli się odetniesz, użyj konsoli.
  • Po przeniesieniu SSH zaktualizuj port w jailu sshd.

Wyszukiwanie w poradnikach