# Postaviti Fail2ban za web-poslužitelje

> Fail2ban za Nginx i Apache: aktivirajte prikladne jailove, vlastite filtre testirajte s fail2ban-regex, blokirajte ponavljače i izbjegnite zaključavanje samih sebe.

Izvor: https://phpsos.de/hr/blog/fail2ban-fuer-webserver/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** Fail2ban čita zapisničke datoteke i u vatrozidu blokira adrese koje se unutar vremenskog okvira previše ističu. Za Nginx i Apache donosi gotove jailove poput `nginx-botsearch` ili `apache-noscript`; vlastite filtre testirate pomoću `fail2ban-regex`. Postavke pripadaju u `jail.local`, Vaše vlastite adrese u `ignoreip`, a ponavljače hvata `recidive` jail. Protiv pojedinačnih ciljanih napada Fail2ban ne pomaže, protiv masovnih skeniranja pomaže.

## Kad su zapisnici puni skenera

Tko ovih dana pogleda pristupne zapisnike svojih web-poslužitelja, često ih nalazi pune zahtjeva za putove koji uopće ne postoje: stara administratorska sučelja, testne datoteke, poznate slabosti drugih proizvoda. U situaciji poput PHP2Shella dolazi i ciljana potraga za ranjivim poslužiteljima: Cloudflare i Patchstack izvijestili su o pokušajima napada, a Unit 42 izbrojio je više od 22,6 milijuna izloženih, potencijalno ranjivih instanci.

Fail2ban je provjeren alat protiv te mase. Čita zapisničke datoteke, filtrima prepoznaje upadljive unose i adresu pošiljatelja blokira u vatrozidu na određeno vrijeme. To rasterećuje poslužitelj, smanjuje šum u zapisnicima i otežava sustavno isprobavanje iz jednog izvora.

Što Fail2ban ne može, jednako je važno: pojedinačan zahtjev koji iskorištava ranjivost ne sprječava se. Protiv PHP2Shella pomaže samo PHP ažuriranje. Kako teku automatizirani napadi, opisuje članak [Masovna skeniranja nezakrpanog PHP-a](https://phpsos.de/hr/blog/automatisierte-massenscans/).

## Fail2ban za Nginx i Apache: isporučeni jailovi

Jail povezuje filtar sa zapisničkom datotekom i akcijom blokade. Isporučeni `jail.conf` već sadrži jailove za web-poslužitelje. Zadano su isključeni i aktiviraju se pojedinačno.

| Jail | Web-poslužitelj | Prepoznaje |
|---|---|---|
| `nginx-http-auth` | Nginx | neuspjele HTTP Basic prijave |
| `nginx-limit-req` | Nginx | zahtjeve koji premašuju rate limit Nginxa |
| `nginx-botsearch` | Nginx | potragu za tipičnim, nepostojećim putovima |
| `nginx-bad-request` | Nginx | neispravne zahtjeve |
| `apache-auth` | Apache | neuspjele prijave |
| `apache-badbots` | Apache | poznate štetne oznake botova |
| `apache-noscript` | Apache | pozive nepostojećih skripti |
| `apache-overflows` | Apache | preduge zahtjeve |
| `apache-botsearch` | Apache | potragu za tipičnim, nepostojećim putovima |
| `php-url-fopen` | oba | određene obrasce pokušaja uključivanja URL-ova |
| `recidive` | oba | adrese koje je Fail2ban već više puta blokirao |

Zadane vrijednosti isporučene konfiguracije prilično su blage: blokada 10 minuta nakon 5 pogodaka u 10 minuta. Za web-poslužitelje s mnogo prometa skenera isplati se dulja blokada i rastući faktor za ponavljanja.

## Osnovna konfiguracija u jail.local

`jail.conf` sam kaže da se ne smije mijenjati jer ga ažuriranja zamjenjuju. Vlastite vrijednosti pripadaju u `/etc/fail2ban/jail.local`. Sljedeći primjer za Nginx postavlja smislene zadane vrijednosti i aktivira prikladne jailove:

```ini
# /etc/fail2ban/jail.local
[DEFAULT]
# Upisati vlastite fiksne adrese (zamijeniti primjer adrese)
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime  = 1h
findtime = 10m
maxretry = 5
bantime.increment = true

[nginx-http-auth]
enabled = true

[nginx-botsearch]
enabled = true

[recidive]
enabled  = true
bantime  = 1w
findtime = 1d
```

Za Apache umjesto toga aktivirajte primjerice `apache-auth`, `apache-noscript` i `apache-botsearch`. Putove zapisnika Fail2ban donosi po distribuciji; ako se Vaši putovi razlikuju, postavite `logpath` u dotičnom jailu. Ako Vaš sustav zapisnike čita samo preko journala, pomaže `backend = systemd`.

## Vlastiti filtar za masovne zahtjeve za PHP datotekama

Tipičan obrazac u aktualnoj situaciji su mnogi zahtjevi u kratkom vremenu za PHP datotekama koje ne postoje. Vlastiti filtar to prepoznaje po statusnom kodu 404. Opisuje samo ono što stoji u Vašem vlastitom zapisniku:

```ini
# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
```

```ini
# Dopuna u /etc/fail2ban/jail.local
[nginx-php-404]
enabled  = true
port     = http,https
filter   = nginx-php-404
logpath  = /var/log/nginx/access.log
maxretry = 20
findtime = 1m
bantime  = 1h
```

Prije aktivacije filtra provjerite ga na stvarnom zapisniku. Tako vidite koliko redaka pogađa i ima li među njima legitimnih pristupa:

```bash
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-php-404.conf
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status nginx-php-404
# Odblokirati nehotice blokiranu adresu
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25
```

Prag odaberite velikodušno. Crawler koji obrađuje zastarjele poveznice ili usluga nadzora ne smije završiti u blokadi.

## Najčešće zamke

Fail2ban se brzo instalira, ali lako pogrešno primjenjuje. Ove točke provjerite prije produkcijske uporabe:

1. **Zaključavanje samih sebe:** adrese ureda, VPN-a i nadzora pripadaju u `ignoreip` prije nego jailovi postanu aktivni.
2. **Usluge ispred poslužitelja:** iza CDN-a ili load balancera Fail2ban bez prilagodbe vidi samo njihove adrese. Više o tome u vodiču [Zaštititi administratorske prijave od brute forcea](https://phpsos.de/hr/ratgeber/brute-force-login-schutz/).
3. **Rotacija zapisnika:** nakon promjene zapisničke datoteke Fail2ban mora čitati novu datoteku. Nakon prve rotacije provjerite broje li jailovi i dalje pogotke.
4. **Suradnja s vatrozidom:** Fail2ban blokade upisuje u vatrozid. Tko svoj vatrozid održava potpunim ponovnim učitavanjem skupa pravila, može pritom obrisati te unose. Kako sam vatrozid izgraditi, piše u članku [Vatrozid za web-poslužitelje: otvoriti samo nužne portove](https://phpsos.de/hr/blog/firewall-fuer-webserver/).
5. **IPv6:** napadi stižu i putem IPv6. Provjerite pokriva li Vaša akcija blokade oba protokola.

> **Savjet:**
> Redovito analizirajte popise blokada. Ako se blokade nagomilavaju iz određenih mreža ili na određene putove, to je znak ciljane potrage i povod da se pogođena aplikacija pomnije pogleda.

## Zaključak: alat protiv mase, a ne protiv svega

Fail2ban se brzo postavlja i web-poslužiteljima skida dio stalne paljbe. Isporučeni jailovi pokrivaju tipične obrasce, vlastiti filtri mogu se bez opasnosti testirati naredbom `fail2ban-regex` na stvarnim zapisnicima, a `recidive` jail brine da ustrajni izvori dulje ostanu vani.

Ne precjenjujte ga. Fail2ban reagira na ponavljanje, a ne na prvi pogodak, i vidi samo ono što stoji u zapisnicima. Protiv ranjivosti poput PHP2Shella pomaže samo ažuriranje, a protiv distribuiranih napada s mnogo adresa Fail2ban jedva pomaže. Svoju vrijednost razvija kao jedan sloj među više njih: uz vitak vatrozid, ojačanu konfiguraciju web-poslužitelja, dvofaktorsku prijavu i nadzor koji neobičnosti ne samo blokira nego i prijavljuje.

## Kako PHP SOS konkretno pomaže?

- **Analizirati zapisnike:** pregledavamo koji se obrasci pojavljuju u Vašim pristupnim zapisnicima i biramo prikladne jailove.
- **Postaviti i testirati:** postavljamo Fail2ban s vlastitim filtrima, svaki filtar testiramo na stvarnim zapisnicima i Vaše fiksne adrese upisujemo kao iznimku.
- **Uskladiti suradnju:** CDN, load balancer, vatrozid i rotaciju zapisnika usklađujemo tako da blokade pogađaju prave adrese.
- **Promatrati:** u sklopu [sigurnosnog nadzora](https://phpsos.de/hr/leistungen/security-monitoring/) kontinuirano analiziramo blokade i neobičnosti.


## Česta pitanja

**Štiti li Fail2ban od PHP2Shella?**  
Ne. Fail2ban reagira tek nakon što se adresa više puta istakne u zapisnicima. Pojedinačan uspješan napad time se ne sprječava. Fail2ban ipak smanjuje opterećenje od skenera i poskupljuje ponovljene pokušaje iz istog izvora.

**Zašto jail.conf ne bih mijenjao izravno?**  
Datoteka se pri ažuriranju paketa zamjenjuje, a to i sama kaže. Vlastite postavke pripadaju u jail.local ili u datoteke pod jail.d. Tamo ciljano nadjačavaju zadane vrijednosti.

**Što je recidive jail?**  
Jail koji analizira zapisnik samog Fail2bana. Tko se stalno iznova blokira, dobiva znatno dulju blokadu. U isporučenoj konfiguraciji ona iznosi tjedan dana.

**Radi li Fail2ban iza Cloudflarea ili load balancera?**  
Samo uz dodatnu konfiguraciju. Bez nje se u zapisnicima nalazi adresa usluge ispred poslužitelja i blokada bi pogodila sve posjetitelje. Web-poslužitelj tada mora preuzeti stvarnu adresu posjetitelja, a blokade je bolje postavljati kod usluge ispred poslužitelja.

## Izvori

- [Fail2ban: isporučeni jail.conf](https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf)
- [BSI (njemački Savezni ured za informacijsku sigurnost) IT-Grundschutz](https://www.bsi.bund.de/DE/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/IT-Grundschutz/it-grundschutz_node.html)
- [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/)
