Pakete:
* Debian (ab 12): ''fail2ban python3-pyinotify python3-systemd''
Per default überwacht fail2ban bei debian ssh:
egrep -A7 '\[sshd?\]' /etc/fail2ban/jail.conf
less /etc/fail2ban/filter.d/sshd.conf
…
[DEFAULT]
…
banaction = iptables-multiport
…
less /etc/fail2ban/action.d/iptables-multiport.conf
fail2ban Zusammenfassung der Konfiguration anzeigen:
fail2ban-client status
fail2ban-client status sshd
====== Apache Basic Auth ======
Pakete: apache2 fail2ban (Debian 9)
mkdir -p /srv/www/fail2ban
htpasswd -c /srv/www/htpasswd_fail2ban heinz
AllowOverride AuthConfig
AuthType Basic
AuthName "Bitte Username und Passwort"
AuthBasicProvider file
AuthUserFile /srv/www/htpasswd_fail2ban
Require valid-user
Hello fail2ban!
Hello fail2ban
Zugriff lokal testen:
wget --user heinz --password xxx -nv -O - http://127.0.0.1/fail2ban-test/index.html
[apache-auth]
enabled = true
fail2ban-client reload
fail2ban-client status
fail2ban-client status apache-auth
Von einem anderen Rechner aus:
ab -n 10 -A heinz:nono http://192.168.212.11/fail2ban-test/index.html
less /var/log/fail2ban.log
====== Apache Log mit HTTP Status 400 (Bad Request) ======
Beispiel für Zeile aus ''access.log'' mit Status 400:
server.example.org:80 139.162.173.209 - - [10/Jan/2026:21:10:46 +0000] "GET default.asp HTTP/1.1" 400 444 "-" "-"
===== Filter =====
[Definition]
failregex = ^\S+ - - \[[^\]]*\] "[^"]+" 400
(( '''' siehe
^Tag^Description^Example regex in filter file^
||Matches IPv4/IPv6 address or hostname|''^Failed login from $''|
||Matches IPv4 address only|''^Failed login from $''|
||Matches IPv6 address only|''^Failed login from $''|
||Matches IPv4/IPv6 address (no hostname)|''^Connection from $''|
||Matches IP with optional CIDR notation|''^Connection from $''|
|...|Captures a username|''^Failed login for \S+$''|
|...|Captures a failure ID|''^Error \d+ from $''|
||Used for multi-line matching|''^Start pattern$^End pattern$''|
))
Filter testen:
fail2ban-regex 'server.example.org:80 139.162.173.209 - - [10/Jan/2026:21:10:46 +0000] "GET default.asp HTTP/1.1" 400 444 "-" "-"' /etc/fail2ban/filter.d/apache-badrequest.local
-> sollte ''1 matched'' ausgeben
fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-badrequest.local
-> sollte die korrekte Anzahl Zeilen mit Status 400 ausgeben.
===== Jail =====
[apache_bad_request]
enabled = true
port = http,https
filter = apache-badrequest
logpath = /var/log/apache*/*access.log
maxretry = 3
Testen:
fail2ban-client reload
-> ''OK''
fail2ban-client status
-> ''Jail list: … apache_bad_request…''
fail2ban-client status apache_bad_request