# QuickstartInstallieren, starten, beobachten — unter zehn Minuten vom ersten Kommando bis zu geblockten IPs.

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.

```sh
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.

```sh
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.

```sh
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:

```sh
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:

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

`pf` neu laden:

```sh
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:

```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](../operations/) für das
Skript). Aktivieren und starten:

```sh
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:

```sh
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](../operations/) fürs Troubleshooting.
