
Ten poradnik pokazuje kompletną instalację i konfigurację Fail2Ban dla Nginx, zaprojektowaną tak, aby:
- blokować rzeczywiste skanery i próby exploitów (np. żądania do
/.env,/.git,/phpmyadminitp.), - unikać przypadkowego blokowania administratorów (częsty problem przy banowaniu wyłącznie na podstawie błędów HTTP),
- blokować adresy IP dopiero po powtarzającej się podejrzanej aktywności,
- stosować krótki czas bana (5 minut), aby zmniejszyć ryzyko zablokowania samego siebie.
Dlaczego banowanie wyłącznie na podstawie błędów HTTP może być problematyczne
Wiele poradników sugeruje blokowanie adresów IP jedynie na podstawie kodów statusu HTTP (4xx/499). W praktyce bardzo często prowadzi to do samoblokady, ponieważ nowoczesne aplikacje generują serie zapytań (AJAX, panel administracyjny, przebudowa cache), przez co podczas normalnej pracy mogą pojawiać się błędy HTTP.
Ta konfiguracja wykorzystuje bezpieczniejsze podejście:
- ścieżki exploitów są zawsze traktowane jako podejrzane,
- błędy HTTP są liczone tylko wtedy, gdy zapytanie nie posiada nagłówka Referer (typowe zachowanie skanerów),
- znane złośliwe User-Agenty są uwzględniane.
Krok 1: Instalacja Fail2Ban
Zainstaluj Fail2Ban:
|
1 2 |
apt update apt install -y fail2ban |
Włącz oraz uruchom usługę:
|
1 2 |
systemctl enable fail2ban systemctl start fail2ban |
Sprawdź status działania:
|
1 2 |
fail2ban-client ping systemctl status fail2ban |
Krok 2: Utworzenie filtra nginx-secure
Utwórz plik filtra:
|
1 |
nano /etc/fail2ban/filter.d/nginx-secure.conf |
Wklej poniższą konfigurację:
|
1 2 3 4 5 6 7 8 9 10 |
[Definition] failregex = ^<HOST> - .* "(?:GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH|PROPFIND|CONNECT) (?:/\.env|/wp-config\.php|/phpinfo\.php|/(?:phpmyadmin|adminer)(?:/|$)|/(?:\.git|\.svn|\.hg)(?:/|$)|/vendor/phpunit/|/cgi-bin/).*" \d{3} .* ^<HOST> - .* "(?:GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH|PROPFIND|CONNECT) [^"]*" (?:400|403|404|405|408|413|414|429|444) [^"]* "-" ".*" ^<HOST> - .* "(?:GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH|PROPFIND|CONNECT).*" \d{3} .* "(?:[^"]*)" "(?:[^"]*(?:sqlmap|nikto|masscan|zgrab|nmap|acunetix|wpscan|dirbuster|gobuster)[^"]*)" ignoreregex = |
Krok 3: Utworzenie jail nginx-secure
Utwórz plik konfiguracji jail:
|
1 |
nano /etc/fail2ban/jail.d/nginx-secure.conf |
Wklej konfigurację:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[nginx-secure] enabled = true port = http,https filter = nginx-secure logpath = /var/log/nginx/access.log /var/log/nginx/access-*.log findtime = 600 maxretry = 20 bantime = 300 action = iptables-multiport[name=nginx-secure, port="http,https"] ignoreip = 127.0.0.1/8 ::1 |
Krok 4: Restart Fail2Ban
|
1 2 |
fail2ban-server -t systemctl restart fail2ban |
Krok 5: Sprawdzenie integracji z firewallem
Sprawdź czy łańcuch Fail2Ban istnieje:
|
1 2 |
iptables -S | grep f2b-nginx-secure iptables -L f2b-nginx-secure -n -v |
Test z zewnętrznej maszyny
Test ścieżki exploita:
|
1 2 3 |
for i in 1 2 3 4 5; do curl -I https://soban.pl/.env done |
Test logiki błędów bez Referer:
|
1 2 3 |
for i in 1 2 3 4 5; do curl -sS -o /dev/null -w "%{http_code}\n" https://soban.pl/this-path-should-not-exist-$i done |
Po wykryciu powtarzających się podejrzanych żądań adres IP zostanie zablokowany na 5 minut.
Sprawdzenie zbanowanych adresów IP
|
1 |
fail2ban-client status nginx-secure |
Odblokowanie adresu IP
Ręczne zdjęcie bana:
|
1 |
fail2ban-client set nginx-secure unbanip YOUR_IP |
Podsumowanie
- blokuje rzeczywiste próby exploitów i skanery,
- minimalizuje ryzyko samoblokady administratora,
- stosuje krótki 5-minutowy ban,
- działa z iptables-nft,
- łatwy test oraz szybkie odblokowanie adresu IP.