From e7265ff1d1814005b722930d4c81f9d46100c2e2 Mon Sep 17 00:00:00 2001 From: njomac Date: Tue, 28 Jul 2026 20:56:15 +0200 Subject: [PATCH] fix: fail2ban nginx jailovi nisu citali log + podrska za reverse proxy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- UPUTE.txt | 13 ++++++++++++- install.sh | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/UPUTE.txt b/UPUTE.txt index 472d8e3..164da2f 100644 --- a/UPUTE.txt +++ b/UPUTE.txt @@ -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: diff --git a/install.sh b/install.sh index da79b2c..e8e4791 100755 --- a/install.sh +++ b/install.sh @@ -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