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 robi | Przykład dla SSH |
|---|---|---|
| Filtr | Rozpoznaje 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.
Zaktualizuj listę pakietów i zainstaluj fail2ban:
bash apt update apt install fail2banfail2ban– sam program. Jako zależność instaluje się teżpython3-systemd, który pozwala mu czytać dziennik systemowy.
Sprawdź, czy dostępne jest narzędzie
nft, którego fail2ban używa do blokowania:bash command -v nft || apt install nftablescommand -v nft– wypisuje ścieżkę do programunft, jeśli istnieje.||– następne polecenie uruchamia się tylko wtedy, gdy poprzednie się nie powiodło, czyli gdy brakujenft.apt install nftables– instaluje narzędzie. Instalacja nie włącza żadnych reguł ani nie zmienia UFW.
Sprawdź, czy usługa działa:
bash systemctl status fail2banSzukaj 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/. 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#
Utwórz plik:
bash nano /etc/fail2ban/jail.localWpisz do niego:
/etc/ fail2ban/ inijail.local [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 = 5Zapisz (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].
| Ustawienie | Co robi | Zalecana wartość | Kiedy zmieniać |
|---|---|---|---|
ignoreip | Adresy i zakresy, których fail2ban nigdy nie blokuje. Oddzielone spacjami. 127.0.0.1/8 ::1 to sam VPS. | 127.0.0.1/8 ::1 | Dodaj 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. |
bantime | Jak długo adres pozostaje zablokowany. Jednostki: m minuty, h godziny, d dni, w tygodnie. Domyślnie 10m. | 1h | Krócej (30m), jeśli często się mylisz i nie masz pod ręką konsoli. |
findtime | Okno czasowe, w którym liczone są nieudane próby. | 10m | Dłużej (1h) przeciw powolnym atakom próbującym hasła raz na kilka minut. |
maxretry | Ile 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. | 5 | 3 dla SSH z wyłączonymi hasłami (legalny użytkownik z kluczem nie robi błędów). |
bantime.increment | Każda kolejna blokada tego samego adresu trwa dłużej. Fail2ban trzyma historię w bazie danych. | true | false, jeśli zawsze chcesz tego samego czasu. |
bantime.factor | Mnożnik wzrostu. Przy wartości 1 czas rośnie 1, 2, 4, 8… × bantime. | 1 | Wyżej (2) dla szybszego wzrostu. |
bantime.maxtime | Granica, powyżej której czas blokady już nie rośnie. | 1w | Dłużej (4w) dla bardzo wytrwałych atakujących. |
enabled | Włącza jail. Jaile są domyślnie wyłączone. | true | false tymczasowo wyłącza jail. |
port | Które porty są blokowane dla adresu. ssh oznacza port 22. | ssh | Jeśli SSH działa na innym porcie, wpisz go jako liczbę, na przykład 2222 (zobacz niżej). |
backend | Skąd czytać zapisy. systemd = dziennik systemowy, auto = plik z logpath. | systemd dla sshd, auto dla recidive | Nigdy, chyba że wiesz dlaczego. Debian 13 nie ma pliku /var/log/auth.log, więc SSH musi czytać dziennik. |
logpath | Plik z zapisami (tylko dla backend = auto). | /var/log/fail2ban.log | Nie zmienia się. |
banaction | Jak blokować. %(banaction_allports)s = blokuj wszystkie porty, nie tylko SSH. | %(banaction_allports)s | Nie 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:
nano /etc/fail2ban/fail2ban.local[Definition]
dbpurgeage = 8d| Ustawienie | Co robi | Zalecana wartość | Kiedy zmieniać |
|---|---|---|---|
dbpurgeage | Po jakim czasie stare zapisy blokad są usuwane z bazy /var/. Domyślnie 1d. | 8d | Zawsze nieco dłużej niż najdłuższy bantime i bantime.maxtime. |
Uruchomienie i kontrola#
Sprawdź konfigurację:
bash fail2ban-client -t-t– test konfiguracji. Przy powodzeniu wypisujeOK: configuration test is successful. Przy błędzie podaje plik i problem.
Zrestartuj fail2ban, aby wczytał nowe ustawienia:
bash systemctl restart fail2banWypisz aktywne jaile:
bash fail2ban-client statusWyniktext Status |- Number of jail: 2 `- Jail list: recidive, sshdPokaż status jaila
sshd:bash fail2ban-client status sshdWyniktext 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
| Linia | Znaczenie |
|---|---|
Currently failed | Ile adresów ma obecnie co najmniej jedną nieudaną próbę w oknie findtime, ale nie jest jeszcze zablokowanych. |
Total failed | Liczba nieudanych prób przechwyconych od startu fail2ban. |
Journal matches | Które zapisy dziennika czyta jail. Na Ubuntu może się różnić (sshd.service); nie wpływa to na działanie. |
Currently banned | Ile adresów jest zablokowanych w tej chwili. |
Total banned | Ile blokad nastąpiło od startu. |
Banned IP list | Lista 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ń:
| Polecenie | Co robi |
|---|---|
fail2ban-client set sshd unbanip 198.51.100.25 | Odblokowuje adres w jailu sshd. |
fail2ban-client unban 198.51.100.25 | Odblokowuje adres we wszystkich jailach (łącznie z recidive) i usuwa go z bazy. |
fail2ban-client unban --all | Odblokowuje wszystkie adresy we wszystkich jailach. Atakujący zostaną zablokowani ponownie przy kolejnych próbach. |
fail2ban-client banned 198.51.100.25 | Pokazuje, 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 refusedlubConnection 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:
[sshd]
enabled = true
port = 2222
backend = systemdport = 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:
[nginx-http-auth]
enabled = true
backend = auto
[nginx-botsearch]
enabled = true
backend = auto| Jail | Co obserwuje |
|---|---|
nginx-http-auth | Złe hasła na stronach chronionych hasłem (HTTP Basic Auth). |
nginx-botsearch | Boty 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:
nft list table inet f2b-tablenft 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#
Spróbuj ręcznie zablokować testowy adres:
bash fail2ban-client set sshd banip 198.51.100.25Sprawdź, czy jest w firewallu:
nft list table inet f2b-tablemusi zawierać adres198.51.100.25.Odblokuj go:
fail2ban-client set sshd unbanip 198.51.100.25.Po godzinie lub dwóch sprawdź
fail2ban-client status sshd. Na publicznym VPSTotal failediTotal bannedzwykle 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ładnft: not found). Zainstaluj wtedy pakietnftables. - Sprawdź, czy
portw jailu zgadza się z rzeczywistym portem SSH.
Gdzie szukać szczegółów#
tail -n 50 /var/log/fail2ban.log
journalctl -u fail2ban -n 50tail -n 50 /var/log/fail2ban.log– ostatnie 50 linii logu fail2ban (blokadyBan, odblokowaniaUnban, 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 dojail.conf. - SSH czyta dziennik (
backend = systemd),recidiveczyta plik (backend = auto). - Odblokowanie:
fail2ban-client set sshd unbanip <IP>lubfail2ban-client unban <IP>; jeśli się odetniesz, użyj konsoli. - Po przeniesieniu SSH zaktualizuj
portw jailusshd.