Pe scurt: Fail2ban e un framework de tip Intrusion Prevention System (IPS) care citește fișierele de log (sau journalctl) în căutarea unor tipare malițioase — cum ar fi zece eșecuri de autentificare SSH de la același IP în două minute. Când o adresă depășește un prag configurabil, Fail2ban aplică automat o regulă de firewall care o blochează pentru o perioadă de timp.
Arhitectura se bazează pe trei componente:
- Filtre (filters) — expresii regex care analizează logurile pentru a detecta evenimente (ex:
Failed password for invalid user).
- Închisori (jails) — leagă un filtru de un serviciu, un fișier de log și o acțiune. Fiecare jail are propriii parametri
bantime, findtime și maxretry.
- Acțiuni (actions) — scripturi care execută blocarea, de obicei prin adăugarea unei reguli în
iptables, nftables, firewalld sau ipset.
Fail2ban vs. alte mecanisme de protecție
Un lucru important (și pe care îl repet ori de câte ori am ocazia): Fail2ban nu înlocuiește un firewall și nu oferă autentificare puternică. E un instrument reactiv — intră în acțiune după ce atacatorul a început deja să lovească serverul. Pentru o strategie defensivă serioasă, combinați-l cu:
- Autentificare SSH bazată pe chei (și dezactivați complet parolele).
- Un firewall de perimetru (nftables, firewalld, cloud security groups).
- 2FA pentru conturile critice.
- Un bastion host pentru accesul administrativ.
- Un sistem HIDS precum Wazuh sau OSSEC.
Instalarea Fail2ban pe Linux
Debian și Ubuntu
sudo apt update
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
RHEL, AlmaLinux, Rocky Linux
Pe distribuțiile bazate pe RHEL, Fail2ban vine din repository-ul EPEL (nu e în repo-urile de bază, ceea ce confundă mulți începători):
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalld
sudo systemctl enable --now fail2ban
Arch Linux
sudo pacman -S fail2ban
sudo systemctl enable --now fail2ban
Verificarea instalării
fail2ban-client --version
sudo fail2ban-client status
Dacă serviciul rulează corect, o să vedeți lista jail-urilor active (inițial doar sshd pe Debian/Ubuntu).
Structura fișierelor de configurare
Fail2ban separă strict configurația implicită (livrată de pachet) de configurația locală (pe care o faceți dvs.). Regula de aur, scrisă cu litere de-o șchioapă: nu modificați niciodată fișierele .conf. O să fie suprascrise la următoarea actualizare de pachet și o să vă pierdeți toate setările.
/etc/fail2ban/
├── fail2ban.conf # Configurarea daemonului - NU modificați
├── fail2ban.local # Suprascrieri pentru fail2ban.conf (creați-l)
├── jail.conf # Jail-uri implicite - NU modificați
├── jail.local # Jail-uri personalizate (creați-l)
├── jail.d/ # Drop-ins pentru jail-uri
├── filter.d/ # Definiții filtre (regex)
└── action.d/ # Definiții acțiuni de ban
Păstrați jail.conf ca referință, dar configurați totul în jail.local:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.bak
sudo nano /etc/fail2ban/jail.local
Configurarea secțiunii [DEFAULT]
Secțiunea [DEFAULT] definește parametrii globali, moșteniți de toate jail-urile. Iată o configurație pe care o folosesc în producție și care funcționează bine în 2026:
[DEFAULT]
# IP-uri niciodată blocate (managementul dvs., LAN-ul, monitoring)
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 192.168.0.0/16 203.0.113.25
# Politica de ban
bantime = 1h
findtime = 15m
maxretry = 5
# Ban progresiv pentru atacatorii persistenți
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 1w
bantime.rndtime = 10m
# Sursa logurilor: jurnalul systemd pe distribuțiile moderne
backend = systemd
# Acțiunea implicită: ban + email cu whois și extras din log
destemail = [email protected]
sender = [email protected]
mta = sendmail
action = %(action_mwl)s
# Integrare firewall - alegeți una singură
banaction = nftables-multiport
banaction_allports = nftables-allports
# Protocol implicit
protocol = tcp
chain = INPUT
Ce înseamnă, pe scurt, fiecare parametru
bantime — durata inițială a blocării (poate fi exprimată ca 1h, 30m, 1d).
findtime — fereastra de timp în care se numără încercările eșuate.
maxretry — numărul de eșecuri permise înainte de ban.
bantime.increment = true — activează creșterea exponențială a bantime la fiecare recidivă.
bantime.factor = 2 — fiecare nou ban e dublu față de cel anterior (1h → 2h → 4h → 8h...).
bantime.maxtime = 1w — plafon maxim pentru un ban individual.
ignoreip — IP-urile de încredere, care nu vor fi niciodată blocate.
Avertisment critic (învățat din propria piele, apropo): adăugați întotdeauna IP-ul dvs. administrativ în ignoreip înainte de a reporni Fail2ban. Altfel, riscați să vă blocați pe dvs. din propriul server — și dacă n-aveți acces out-of-band, urmează o noapte foarte, foarte lungă.
Securizarea serviciului SSH cu jail-ul [sshd]
SSH e, fără discuție, cel mai atacat serviciu pe serverele Linux. Iată o configurație agresivă, dar stabilă:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
backend = %(sshd_backend)s
# Praguri agresive
maxretry = 3
findtime = 10m
bantime = 1h
# Ban incremental specific pentru acest jail
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 4w
# Mode: normal | ddos | aggressive | extra
# aggressive capturează mai multe tipare: scanări, chei invalide, user-uri invalide
mode = aggressive
Pe Debian/Ubuntu, %(sshd_log)s se rezolvă la /var/log/auth.log, iar pe RHEL la /var/log/secure. Dacă folosiți backend = systemd, Fail2ban citește direct din jurnalul journalctl — și sincer, pe distribuțiile moderne asta e calea mai fiabilă.
Modurile jail-ului sshd
- normal — detectează doar eșecurile clasice de autentificare.
- ddos — detectează conexiuni excesiv de rapide fără autentificare.
- aggressive — combină normal + ddos + detectarea utilizatorilor invalizi și a cheilor respinse.
- extra — include euristici suplimentare pentru tipare exotice.
Pentru majoritatea serverelor publice, recomandarea mea e mode = aggressive. Face exact ce trebuie fără să dea prea multe false pozitive.
Jail-ul [sshd-ddos] — protecție împotriva conexiunilor de mare viteză
Atacurile moderne combină brute force cu încercări masive de conexiune care țin portul SSH ocupat. Jail-ul sshd-ddos detectează exact aceste tipare:
[sshd-ddos]
enabled = true
port = ssh
filter = sshd-ddos
logpath = %(sshd_log)s
maxretry = 10
findtime = 30s
bantime = 2h
Observați valorile extreme: 10 conexiuni în 30 de secunde declanșează ban-ul. Pragul e suficient pentru a opri scanerele automate, dar nu o să afecteze conexiunile legitime.
Jail-ul [recidive] — pedepsește recidiviștii
Acum ajungem la partea mea preferată. Jail-ul recidive e a doua linie de apărare (și, sincer, prea puțină lume îl activează): monitorizează propriul jurnal Fail2ban și blochează pe termen lung IP-urile care au fost deja banate de mai multe ori.
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
action = %(action_mwl)s
banaction = %(banaction_allports)s
# Dacă un IP este banat de 5 ori în 24 de ore -> ban de 4 săptămâni pe toate porturile
maxretry = 5
findtime = 1d
bantime = 4w
Spre deosebire de jail-urile obișnuite (care blochează doar un port), banaction_allports blochează toate porturile pentru IP-ul respectiv. E o măsură agresivă, dar pentru atacatorii persistenți e perfect justificată.
Integrarea cu nftables
Dacă ați trecut deja la nftables (și ar cam trebui — iptables e, tehnic, deja deprecated), configurați Fail2ban să emită reguli nftables nativ:
# În /etc/fail2ban/jail.local, sub [DEFAULT]:
banaction = nftables-multiport
banaction_allports = nftables-allports
chain = input
table = filter
Înainte ca Fail2ban să poată scrie reguli, trebuie să existe structura de bază. Creați-o manual:
sudo nft add table inet filter
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy accept; }'
sudo systemctl restart fail2ban
Verificați că regulile Fail2ban apar cum trebuie:
sudo nft list ruleset | grep -A3 f2b
Proteguirea altor servicii
Nginx — autentificare HTTP
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
findtime = 10m
bantime = 2h
Nginx — scanări malware și URL-uri sensibile
[nginx-badbots]
enabled = true
filter = nginx-badbots
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
[nginx-noscript]
enabled = true
filter = nginx-noscript
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 6
Postfix — SMTP brute force
[postfix-sasl]
enabled = true
filter = postfix-sasl
port = smtp,submission,smtps
logpath = /var/log/mail.log
maxretry = 3
bantime = 1h
WordPress — autentificare wp-login
Dacă rulați WordPress, trebuie să vă faceți propriul filtru. Creați /etc/fail2ban/filter.d/wordpress.conf:
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
^<HOST> .* "POST /xmlrpc.php
ignoreregex =
Apoi adăugați jail-ul în jail.local:
[wordpress]
enabled = true
filter = wordpress
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 5m
bantime = 1h
Comenzi esențiale fail2ban-client
Utilitarul fail2ban-client e interfața principală pentru administrarea Fail2ban în timp real. Astea sunt comenzile pe care le folosesc săptămânal:
# Starea generală
sudo fail2ban-client status
# Starea unui jail specific
sudo fail2ban-client status sshd
# Lista IP-urilor banate
sudo fail2ban-client banned
# Deblochează un IP
sudo fail2ban-client set sshd unbanip 198.51.100.42
# Blochează manual un IP
sudo fail2ban-client set sshd banip 198.51.100.99
# Reîncarcă configurația fără restart
sudo fail2ban-client reload
# Testează un filtru împotriva unui fișier log
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
# Afișează configurația efectivă a unui jail
sudo fail2ban-client get sshd bantime
sudo fail2ban-client get sshd findtime
sudo fail2ban-client get sshd maxretry
Monitorizare și alerte
Jurnalul Fail2ban
sudo tail -f /var/log/fail2ban.log | grep -E "Ban|Unban|Found"
Evenimentele-cheie de urmărit:
Found — filtrul a detectat un eșec.
Ban — un IP a fost blocat.
Unban — blocarea a expirat.
Restore Ban — restabilirea unui ban existent la restart.
Rotația logurilor
Configurați logrotate pentru a păstra logurile Fail2ban cel puțin 3-6 luni (pentru conformitate și investigații forensice, dacă vreodată ajungeți să aveți nevoie):
# /etc/logrotate.d/fail2ban
/var/log/fail2ban.log {
weekly
rotate 26
compress
delaycompress
missingok
notifempty
postrotate
/usr/bin/fail2ban-client flushlogs 1>/dev/null
endscript
}
Integrare cu Prometheus
Pentru medii moderne, fail2ban-prometheus-exporter expune metrici pe portul 9191:
wget https://github.com/hctrdev/fail2ban-prometheus-exporter/releases/latest/download/fail2ban-prometheus-exporter-linux-amd64
sudo install -m 755 fail2ban-prometheus-exporter-linux-amd64 /usr/local/bin/fail2ban-exporter
sudo fail2ban-exporter --socket=/var/run/fail2ban/fail2ban.sock --address=:9191
Apoi creați un dashboard Grafana pentru a vizualiza numărul de ban-uri pe jail, top IP-uri atacatoare și tendințe temporale. Nu e doar cool — vă ajută să detectați rapid când un atac devine anormal.
Evitarea auto-blocării
Una dintre cele mai comune (și jenante) probleme cu Fail2ban e auto-blocarea: administratorul se blochează singur după ce greșește parola de câteva ori. Iată cum o evitați:
- Adăugați întotdeauna IP-ul dvs. static în
ignoreip.
- Testați modificările pe o sesiune SSH separată, lăsând cea principală deschisă.
- Păstrați acces out-of-band: consolă serial, KVM, IPMI sau VNC de la furnizorul cloud.
- Folosiți
tmux sau screen ca să nu pierdeți sesiunea la deconectări scurte.
- Înainte de a activa jail-ul
recidive, verificați de două ori (sau de trei) lista ignoreip.
Dacă totuși vă blocați — pentru că se întâmplă —, deblocați-vă prin consola out-of-band cu:
sudo fail2ban-client unban --all
sudo fail2ban-client set sshd unbanip IP_ADRESA_DVS
Reglarea fină — recomandări bazate pe profilul serverului
| Tipul de server |
maxretry |
findtime |
bantime inițial |
Recidive |
| VPS personal | 5 | 15m | 1h | Opțional |
| Server de producție | 3 | 10m | 1h | Obligatoriu |
| Bastion host | 2 | 10m | 4h | Obligatoriu, 4 săpt. |
| Aplicație publică | 5 | 5m | 30m | Obligatoriu |
Checklist de verificare finală
- ✔
jail.local creat — jail.conf nemodificat.
- ✔
ignoreip conține IP-urile administrative.
- ✔ Jail
sshd activ în mod aggressive.
- ✔ Jail
recidive activ cu banaction_allports.
- ✔
bantime.increment = true în [DEFAULT].
- ✔ Integrare
nftables sau firewalld validată.
- ✔
logrotate configurat pentru fail2ban.log.
- ✔ Acces out-of-band testat înainte de reload.
- ✔
fail2ban-client status sshd arată jail-ul activ.
Întrebări frecvente (FAQ)
Care e diferența dintre Fail2ban și un firewall?
Un firewall blochează trafic pe baza unor reguli statice (IP-uri, porturi, protocoale). Fail2ban e reactiv: citește logurile aplicațiilor pentru a detecta atacuri și folosește firewall-ul (iptables/nftables/firewalld) pentru a aplica blocări dinamice. Cele două se completează — firewall-ul oferă perimetrul, Fail2ban oferă răspunsul la atacurile care trec de el.
Cât de mult trebuie să setez bantime?
Începeți cu 1 oră și activați bantime.increment = true. Astfel, atacatorii persistenți primesc banuri din ce în ce mai lungi (1h → 2h → 4h → 8h...), în timp ce un utilizator legitim care a greșit parola o să aștepte doar o oră. Pentru bastion hosts, puteți începe direct cu 4 ore.
Fail2ban funcționează cu SSH pe port non-standard?
Da. Dacă ați mutat SSH pe alt port (ex: 2222), setați port = 2222 în jail-ul [sshd]. Filtrul nu depinde de port, ci de conținutul logurilor SSHD. Totuși, schimbarea portului doar ascunde serviciul — nu e o măsură de securitate în sine; continuați să folosiți Fail2ban și chei SSH.
De ce Fail2ban nu blochează atacurile din cloud sau IP-uri rotative?
Atacatorii moderni folosesc rețele proxy rezidențiale și fleet-uri cloud cu mii de IP-uri. Fail2ban blochează câte un IP pe rând, deci nu poate opri complet un atac distribuit. Pentru protecție suplimentară, combinați Fail2ban cu: liste de blocare bazate pe ASN, geo-blocarea prin nftables, autentificare 2FA și un WAF sau CDN cu protecție anti-bot.
Cum testez că Fail2ban chiar funcționează?
De pe un alt IP (nu cel din ignoreip!), încercați să vă autentificați cu parole greșite de mai multe ori decât maxretry. Apoi verificați sudo fail2ban-client status sshd — ar trebui să vedeți IP-ul vostru în lista de banned. Alternativ, folosiți fail2ban-regex pentru a valida filtrul împotriva unui log existent, fără a bloca nimic real.
Concluzie
Fail2ban rămâne, în 2026, unul dintre cele mai accesibile și eficiente instrumente de prevenire a atacurilor brute force pe Linux. Configurat corect — cu jail.local, bantime incremental, jail-ul recidive și integrare nftables — poate reduce cu peste 85% zgomotul de atacuri automate pe serverele dvs.
Dar (și e un dar important): Fail2ban e o singură piesă dintr-o strategie defensivă stratificată. Pentru protecție reală, combinați-l cu chei SSH, 2FA, un HIDS precum Wazuh și o politică serioasă de update-uri. Numai așa o să aveți o apărare care să reziste amenințărilor moderne — și să vă permită să dormiți liniștit.