[Definition] # ── NPM access log format (current) ────────────────────────────────────────── # [DD/Mon/YYYY:HH:MM:SS +0000] - STATUS STATUS - METHOD SCHEME HOST "PATH" # [Client REAL_IP] [Length N] [Gzip N] [Sent-to IP] "UA" "REFERER" # # fail2ban strips the timestamp before applying failregex, leaving: # " - STATUS STATUS - METHOD SCHEME HOST "PATH" [Client IP] ..." # # Bans IPs probing for well-known vulnerable paths. # Default jail: 3 hits in 30 minutes → 48h ban (very aggressive, intentionally). # # Test against your logs: # fail2ban-regex /nginx-logs/proxy-host-1_access.log /etc/fail2ban/filter.d/npm-probe.conf # ───────────────────────────────────────────────────────────────────────────── failregex = - \d+ \d+ - \S+ \S+ \S+ "/(?:\.env[^"]*|\.git[^"]*|wp-login\.php[^"]*|wp-admin[^"]*|xmlrpc\.php[^"]*|phpmyadmin[^"]*|pma/[^"]*|adminer[^"]*|admin\.php[^"]*|config\.php[^"]*|setup\.php[^"]*|install\.php[^"]*|actuator[^"]*|console[^"]*|manager/html[^"]*|invoker/[^"]*|solr/[^"]*|geoserver/[^"]*|boaform/[^"]*|HNAP1[^"]*|cgi-bin/[^"]*|shell\.php[^"]*|cmd\.php[^"]*|eval-stdin\.php[^"]*)[^"]*" \[Client \] ignoreregex =