Files
schiwagoaandClaude Opus 5.5 d7dcd9d6b1 Initial version: npm-scanner image, filters, entrypoint, watcher, testbed
- Image based on crazymax/fail2ban:1.1.1 with inotify-tools
- Filters npm-scanner and npm-wplogin, tested with fail2ban-regex in the build
- jail.local generated from .env, optional npm-wplogin and recidive
- Watcher reloads the jails when NPM creates a new proxy host log
- check command, docs, testbed for LXC

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:41:08 +01:00

3.3 KiB
Raw Permalink Blame History

Konfiguration

Alle Einstellungen stehen in der .env neben der docker-compose.yaml. Nach einer Änderung:

docker compose run --rm npm-scanner check
docker compose up -d

Die jail.local wird bei jedem Start neu aus der .env erzeugt.

Variablen

Allgemein

Variable Standard Bedeutung
NPM_SCANNER_VERSION latest Image-Tag
TZ Europe/Vienna Zeitzone für Log-Zeitstempel
F2B_LOG_LEVEL INFO CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG
F2B_DB_PURGE_AGE 30d So lange bleiben alte Sperren in der DB – Grundlage für die steigende Sperrdauer und recidive
NPM_LOG_DIR – (Pflicht) Log-Ordner des NPM auf dem Host
NPM_LOG_DIR2 = NPM_LOG_DIR Zweiter Log-Ordner (jlesage: logs/). Ist es derselbe Ordner wie NPM_LOG_DIR, wird er nur einmal gelesen.
WHITELIST leer IPs/Netze, die nie gesperrt werden, mit Leerzeichen getrennt. 127.0.0.1/8 und ::1 sind immer dabei.
F2B_CHAIN DOCKER-USER iptables-Kette für die Sperren
ENABLE_NEWLOG_WATCH true Neue Proxy-Hosts automatisch überwachen
NEWLOG_SETTLE_SECONDS 5 Wartezeit nach dem Erscheinen einer neuen Logdatei
IPTABLES_MODE auto Vom Basis-Image: auto, legacy (erzwingt iptables-legacy)

Zeitangaben: Zahl mit Einheit s, m, h, d, w – zum Beispiel 10m, 24h, 4w.

npm-scanner (immer aktiv)

Variable Standard Bedeutung
SCANNER_MAXRETRY 3 Treffer bis zur Sperre
SCANNER_FINDTIME 1h Zeitfenster für die Treffer
SCANNER_BANTIME 24h Erste Sperrdauer
SCANNER_MAXTIME 4w Höchste Sperrdauer bei Wiederholung

Gelesen werden proxy-host-*_access.log, default-host_access.log, fallback_access.log und fallback_http_access.log in beiden Log-Ordnern.

npm-wplogin (optional)

Zählt POST auf wp-login.php und xmlrpc.php auf allen Hosts hinter dem NPM.

Variable Standard
ENABLE_WPLOGIN false
WPLOGIN_MAXRETRY 5
WPLOGIN_FINDTIME 10m
WPLOGIN_BANTIME 24h
WPLOGIN_MAXTIME 4w

recidive (optional)

Sperrt Wiederholungstäter über alle Jails in INPUT und F2B_CHAIN.

Variable Standard
ENABLE_RECIDIVE false
RECIDIVE_MAXRETRY 3
RECIDIVE_FINDTIME 1w
RECIDIVE_BANTIME 4w

Mit recidive schreibt fail2ban sein Log nach ./data/log/fail2ban.log (recidive liest es). docker logs zeigt es trotzdem weiter an.

Eigene Jails, Filter und Actions

Der Ordner ./data wird beim Start eingebunden:

Ordner Wirkung
./data/jail.d/*.local Wird nach der erzeugten jail.local gelesen – eigene Jails oder Überschreibungen
./data/filter.d/*.conf Eigene Filter. Gleichnamige Filter des Images werden ersetzt.
./data/action.d/*.conf Eigene Actions, zum Beispiel für ntfy
./data/db/ fail2ban-Datenbank – nicht von Hand ändern

Beispiel: Sperrdauer für npm-scanner auf 48 h, ohne die .env zu ändern:

nano ./data/jail.d/50-eigene.local
[npm-scanner]
bantime = 48h
docker compose restart npm-scanner

Die NPM-Logs liegen im Container unter /logs/npm1 und /logs/npm2.