fix: fail2ban nginx jailovi nisu citali log + podrska za reverse proxy

1) Debian/Ubuntu u jail.d/defaults-debian.conf postavlja globalni
   backend = systemd. Nasi nginx jailovi ga nisu nadjacali, pa su
   naslijedili systemd, ignorirali logpath i citali journal u kojem
   nginx access loga nema. "fail2ban-client get nginx-basicauth
   logpath" je vracao "No file is currently monitored" — jailovi
   nikad nisu banali nista, iako fail2ban-regex nad istim logom
   nalazi 48 poklapanja. Dodan eksplicitan backend = auto na oba
   nginx jaila; sshd ostaje na systemd backendu gdje mu je mjesto.

2) Novo pitanje pri instalaciji: je li server iza reverse proxyja.
   Ako da, generira se conf.d/guacamole-realip.conf sa
   set_real_ip_from / real_ip_header X-Forwarded-For. Bez toga je
   $remote_addr uvijek IP proxyja, pa bi fail2ban banirao proxy i
   zakljucao sve korisnike odjednom, rate limit bi bio jedan
   zajednicki budzet, a GeoIP bi gledao krivu adresu.

Provjereno iza Nginx Proxy Managera: direktan pristup i dalje daje
LAN IP, spoofani X-Forwarded-For s nepovjerljive adrese se ignorira,
a kroz proxy fail2ban sad biljezi stvarni javni IP klijenta.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-28 20:56:15 +02:00
parent 149ea6f8f3
commit e7265ff1d1
2 changed files with 47 additions and 1 deletions
+12 -1
View File
@@ -108,7 +108,18 @@ Skripta postavlja sljedeća pitanja redom:
Potrebni: MaxMind Account ID i License Key (besplatno).
Primjer zemalja: HR BA SI RS AT DE
6. WEB GUI
6. REVERSE PROXY
y = da, n = ne
Odgovorite DA ako je server iza Nginx Proxy Managera,
Traefika, HAProxyja ili slicnog. Trazi IP adresu proxyja.
Zasto je vazno: bez toga nginx za svaki zahtjev vidi IP
proxyja umjesto klijentovog. Posljedice su ozbiljne —
fail2ban banira sam proxy i time zakljuca SVE korisnike
odjednom, rate limit postaje jedan zajednicki budzet za
sve, a GeoIP filtrira po adresi proxyja i ne radi nista.
7. WEB GUI
y = da, n = ne
Instalira Flask web aplikaciju za upravljanje svim postavkama.
Ako da:
+35
View File
@@ -125,6 +125,21 @@ if [[ "$DO_GEOIP" =~ ^[Yy]$ ]]; then
read -rp "Dozvoljene zemlje (ISO kodovi, razmak, npr: HR BA SI): " GEO_COUNTRIES
fi
echo ""
echo -e "${CYAN}Reverse proxy${NC} ispred ovog servera (npr. Nginx Proxy Manager)?"
echo " Bez ovoga nginx vidi IP proxyja umjesto klijentovog, pa fail2ban"
echo " banira proxy i zakljuca sve korisnike odjednom."
read -rp "Je li server iza reverse proxyja? [y/N]: " DO_PROXY
DO_PROXY="${DO_PROXY:-n}"
TRUSTED_PROXY=""
if [[ "$DO_PROXY" =~ ^[Yy]$ ]]; then
while true; do
read -rp "IP adresa proxyja (npr. 192.168.1.5 ili 10.0.0.0/24): " TRUSTED_PROXY
[[ -n "$TRUSTED_PROXY" ]] && break
warn "Adresa ne moze biti prazna"
done
fi
echo ""
read -rp "$(echo -e "${CYAN}Web GUI${NC} — instalirati web sučelje za upravljanje? [y/N]: ")" DO_WEBGUI
DO_WEBGUI="${DO_WEBGUI:-n}"
@@ -361,6 +376,20 @@ limit_req_zone $binary_remote_addr zone=guac_req:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=guac_ws:10m rate=30r/m;
EOF
# Iza reverse proxyja je $remote_addr uvijek IP proxyja. Bez ovoga
# fail2ban banira proxy (pa i sve korisnike odjednom), rate limit
# postaje jedan zajednicki budzet, a GeoIP gleda krivi IP.
if [[ -n "$TRUSTED_PROXY" ]]; then
cat > /etc/nginx/conf.d/guacamole-realip.conf << EOF
set_real_ip_from ${TRUSTED_PROXY};
real_ip_header X-Forwarded-For;
real_ip_recursive on;
EOF
info "Real IP: vjerujem X-Forwarded-For zaglavlju od ${TRUSTED_PROXY}"
else
rm -f /etc/nginx/conf.d/guacamole-realip.conf
fi
if [[ "$PKG" == "apt" ]]; then
NGINX_CONF="/etc/nginx/sites-available/guacamole"
NGINX_ENABLED="/etc/nginx/sites-enabled/guacamole"
@@ -436,8 +465,13 @@ ignoreregex =
EOF
cat > /etc/fail2ban/jail.d/guacamole.conf << EOF
# Debian/Ubuntu u jail.d/defaults-debian.conf postavlja globalni
# backend = systemd. Bez eksplicitnog backenda ovi jailovi naslijede
# systemd, ignoriraju logpath i ne procitaju nijednu liniju
# nginx access loga — nikad nista ne banaju.
[nginx-basicauth]
enabled = true
backend = auto
port = http,https
filter = nginx-basicauth
logpath = /var/log/nginx/access.log
@@ -447,6 +481,7 @@ bantime = 3600
[nginx-guacamole]
enabled = true
backend = auto
port = http,https
filter = nginx-guacamole
logpath = /var/log/nginx/access.log