fail2ban konfigūravimas SSH: apsauga nuo brute force 2026

Paleiskite serveryje viena komanda (pirmiausia patikrinkite skripto turinį žemiau):

curl -sSL https://cp.lv/scripts/nastrojka-fail2ban.sh | sudo bash

…arba su wget:

wget -qO- https://cp.lv/scripts/nastrojka-fail2ban.sh | sudo bash

Skripto turinys nastrojka-fail2ban.sh:

#!/usr/bin/env bash
# Install fail2ban and set up the SSH jail (Ubuntu/Debian)
set -euo pipefail

# 1. Install
sudo apt update && sudo apt install -y fail2ban

# 2. Local configuration (quoted 'EOF' writes the sections verbatim)
sudo tee /etc/fail2ban/jail.local > /dev/null << 'EOF'
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1
bantime.increment = true
bantime.factor    = 2
bantime.maxtime   = 1w

[sshd]
enabled  = true
port     = ssh
backend  = systemd
maxretry = 4
bantime  = 2h
EOF

# 3. Apply and verify
sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd
echo "Done: fail2ban now protects SSH from brute force."

fail2ban apsaugo serverį nuo slaptažodžių perrinkimo: jis skaito žurnalus, randa pasikartojančius nesėkmingus prisijungimus ir blokuoja IP per ugniasienę. Konfigūravimas susiveda į paketo įdiegimą ir failo jail.local sukūrimą su įjungtu SSH jail. Žemiau — veikianti konfigūracija.

Kaip tai veikia

fail2ban stebi žurnalų failus (pavyzdžiui, SSH prisijungimo bandymus), lygina eilutes su filtrais (regex) ir, viršijus nesėkmių ribą, prideda taisyklę į iptables arba nftables, užblokuodamas pažeidėją nustatytam laikui.

1 žingsnis. Diegimas

apt update
apt install -y fail2ban
systemctl enable --now fail2ban

CentOS ir AlmaLinux sistemose: dnf install -y fail2ban.

2 žingsnis. Vietinė konfigūracija

Niekada neredaguokite jail.conf tiesiogiai — jis perrašomas atnaujinimų metu. Atverkite /etc/fail2ban/jail.local redaktoriuje (sudo nano /etc/fail2ban/jail.local) ir įrašykite turinį:

[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled  = true
port     = ssh
maxretry = 4
bantime  = 2h

Arba sukurkite failą iš karto viena komanda — nukopijuokite ir įklijuokite į konsolę (kabutės 'EOF' įrašo sekcijas pažodžiui):

sudo tee /etc/fail2ban/jail.local > /dev/null << 'EOF'
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled  = true
port     = ssh
maxretry = 4
bantime  = 2h
EOF

Parametrų paaiškinimas:

  • maxretry — kiek nesėkmių iki blokavimo;
  • findtime — laiko langas, per kurį skaičiuojamos nesėkmės;
  • bantime — kiek laiko galioja blokavimas (-1 — visam laikui);
  • ignoreip — baltasis sąrašas (įrašykite savo namų IP, kad neužblokuotumėte savęs).

Jei SSH veikia nestandartiniame prievade, nurodykite jo numerį vietoj ssh:

[sshd]
enabled = true
port    = 2222

3 žingsnis. Pritaikymas

systemctl restart fail2ban
fail2ban-client status

Išvestyje matysite aktyvių jail sąrašą. SSH informacija:

fail2ban-client status sshd

Čia matyti rastų bandymų skaičius ir šiuo metu užblokuoti IP.

Progresyvus blokavimas už pakartotines atakas

Kad atkaklūs pažeidėjai būtų blokuojami vis ilgiau, įjunkite rekursyvų režimą sekcijoje [DEFAULT]:

bantime.increment = true
bantime.factor    = 2
bantime.maxtime   = 1w

Kiekvienas pakartotinis to paties IP blokavimas ilgėja dvigubai, bet ne ilgiau nei savaitę.

Blokavimų valdymas

Atblokuoti konkretų IP:

fail2ban-client set sshd unbanip 203.0.113.10

Užblokuoti rankiniu būdu:

fail2ban-client set sshd banip 203.0.113.10

Peržiūrėti paties fail2ban veikimo žurnalą:

tail -f /var/log/fail2ban.log

Patikra su systemd žurnalais

Šiuolaikiniuose distributyvuose SSH rašo į journald, o ne į /var/log/auth.log. Įsitikinkite, kad backend skaito journald — pridėkite į [sshd]:

backend = systemd

Patikrinkite, ar filtras randa įrašus:

fail2ban-regex "systemd-journal[sshd]" /etc/fail2ban/filter.d/sshd.conf

Jail recidive: blokavimas pakartotiniams pažeidėjams

Atskiras jail recidive stebi patį fail2ban žurnalą ir ilgam užblokuoja IP, kurie pasitaiko vėl ir vėl. Pridėkite į jail.local:

[recidive]
enabled  = true
logpath  = /var/log/fail2ban.log
bantime  = 1w
findtime = 1d
maxretry = 5

Dabar adresas, užblokuotas 5 kartus per parą, blokuojamas savaitei.

Pranešimai el. paštu

fail2ban gali siųsti laišką po kiekvieno blokavimo. Sekcijoje [DEFAULT] nurodykite:

destemail = [email protected]
sender    = [email protected]
action    = %(action_mwl)s

action_mwl siunčia laišką su žurnalais ir pažeidėjo whois duomenimis. Kad laiškai išeitų, serveryje turi būti sukonfigūruotas MTA (pavyzdžiui, postfix).

Žiniatinklio serverio apsauga

Be SSH, fail2ban apsaugo ir nginx. Jail pavyzdys prieš autentifikacijos perrinkimą:

[nginx-http-auth]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/error.log
maxretry = 5

Paruošti filtrai yra kataloge /etc/fail2ban/filter.d/ — jie įjungiami taip pat per jail.local.

Efektyvumo patikra

Kiek iš viso adresų užblokuota per visą laiką:

grep "Ban" /var/log/fail2ban.log | wc -l

Dažniausiai blokuojami IP:

grep "Ban " /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head

Tokia ataskaita aiškiai parodo, kad apsauga tikrai atremia atakas.

Dažni klausimai

Ar neužblokuosiu pats savęs? Įrašykite savo nuolatinį IP į ignoreip. Jei blokavimo išvengti nepavyko, atblokuokite per VPS konsolę (KVM), o ne per SSH.

Ar fail2ban veikia su nftables? Taip, nurodykite banaction = nftables-multiport sekcijoje [DEFAULT], jei serveris naudoja nftables.

Ar galima apsaugoti ne tik SSH? Taip, yra paruošti jail nginx, postfix, dovecot ir kitoms tarnyboms — jie įjungiami taip pat per jail.local.

Kaip patikrinti, ar jail tikrai veikia? Peržiūrėkite fail2ban-client status sshd ir /var/log/fail2ban.log — ten matyti rasti ir užblokuoti adresai.

Kiek resursų sunaudoja? Minimaliai — tai lengvas Python demonas, skaitantis žurnalus. Pastebimos apkrovos VPS nesukuria.


fail2ban — bazinė bet kurio serverio apsauga. Projektams, kuriuose saugumas kritiškai svarbus, rinkitės VPS saugumui ir VPN arba VPS nuomą. Konfigūravimą patikėkite Serverių administravimui.

Olga Naumova