Dieser Guide führt durch das Aufsetzen von Abusive HTTP Watch gegen ein echtes Access-Log auf einem OpenBSD-System. Derselbe Ablauf funktioniert mit kleinen Anpassungen auch auf FreeBSD und Linux.

1. Skript installieren

Skript an einen Systempfad legen und ausführbar machen.

doas install -m 0755 abusive_http_watch.pl /usr/local/sbin/abusive_http_watch

Der Daemon hat keine externen Perl-Dependencies — nur die Standardbibliothek (Fcntl, IO::Handle, Sys::Syslog, Socket). Wenn perl auf dem System ist, läuft das Skript.

2. Runtime-Verzeichnis anlegen

Der Daemon schreibt die Blocklist in eine einzelne Datei. Wähle einen Pfad, von dem deine Firewall lesen wird.

doas mkdir -p /var/www/run
doas chown _www:_www /var/www/run

Die Blocklist-Datei (/var/www/run/abusive_http_hosts per Default) wird beim ersten Lauf angelegt, falls sie nicht existiert.

3. Gegen ein aktuelles Log testen

Bevor du den Daemon ins System einhängst, lass ihn direkt gegen ein Access-Log laufen, um sein Verhalten zu sehen.

ABUSIVE_DEBUG=1 abusive_http_watch /var/www/logs/access.log

Die Debug-Ausgabe ([dbg] ip=…, [dbg] token match ip=…, [dbg] count ip=… N/3) zeigt den Matcher in Echtzeit. Wenn eine IP die Hit-Schwelle (Default 3) überschreitet, siehst du [added] <ip> -> /var/www/run/abusive_http_hosts.

Ctrl-C zum Stoppen. Blocklist prüfen:

cat /var/www/run/abusive_http_hosts

Du solltest eine kurze IP-Liste sehen — die lautesten Prober im Beobachtungszeitfenster.

4. Firewall an die Blocklist anhängen

Auf OpenBSD eine <abusive>-Tabelle hinzufügen, die aus der Datei lädt:

table <abusive> persist file "/var/www/run/abusive_http_hosts"
block in quick on egress from <abusive> label abusive

pf neu laden:

doas pfctl -f /etc/pf.conf

Die Tabelle blockt jetzt alles von diesen IPs an der Firewall — keine Webserver-CPU mehr für sie verschwendet.

Damit neue Einträge automatisch übernommen werden, die Tabelle in kurzen Intervallen neu laden. Einfacher Cron:

*/2 * * * * /sbin/pfctl -t abusive -T replace -f /var/www/run/abusive_http_hosts

Auf Linux ist das Äquivalent ein nftables-Set oder ipset, das per ähnlichem Cron aus derselben Datei neu geladen wird.

5. Als Daemon starten

rc.d-Skript installieren (siehe Betrieb für das Skript). Aktivieren und starten:

doas rcctl enable abusive_http_watch
doas rcctl start abusive_http_watch

Der Daemon folgt dem Log nun fortlaufend und schreibt die Blocklist. tail -f /var/log/daemon (oder die konfigurierte Syslog-Facility) zeigt added-Events live.

6. Verifizieren

Ein paar Minuten warten, dann prüfen:

wc -l /var/www/run/abusive_http_hosts
doas pfctl -t abusive -T show | wc -l

Die Zahlen sollten übereinstimmen. Wenn ja, bist du fertig — der Daemon läuft, die Blocklist wächst, die Firewall filtert.

Wenn die Blocklist-Datei nach ein, zwei Stunden auf einem öffentlichen Webserver leer bleibt, ist dein Access-Log ungewöhnlich sauber (Glückwunsch) oder der Daemon liest nicht den Pfad, den du denkst. Siehe Betrieb fürs Troubleshooting.