Ten przewodnik prowadzi przez ustawienie Abusive HTTP Watch wobec prawdziwego access-loga na systemie OpenBSD. Ten sam przebieg działa z drobnymi adaptacjami także na FreeBSD i Linux.

1. Zainstalować skrypt

Umieścić skrypt w ścieżce systemowej i nadać prawa wykonywania.

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

Daemon nie ma żadnych zewnętrznych zależności Perl — tylko standardowa biblioteka (Fcntl, IO::Handle, Sys::Syslog, Socket). Jeśli perl jest w systemie, skrypt działa.

2. Utworzyć katalog runtime

Daemon pisze blocklistę do pojedynczego pliku. Wybierz ścieżkę, z której twój firewall będzie czytał.

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

Plik blocklisty (/var/www/run/abusive_http_hosts domyślnie) jest tworzony przy pierwszym uruchomieniu, jeśli nie istnieje.

3. Test wobec aktualnego logu

Zanim podpniesz daemona do systemu, uruchom go bezpośrednio wobec access-loga, aby zobaczyć jego zachowanie.

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

Debug-output ([dbg] ip=…, [dbg] token match ip=…, [dbg] count ip=… N/3) pokazuje matcher w czasie rzeczywistym. Gdy jakieś IP przekroczy próg trafień (domyślnie 3), zobaczysz [added] <ip> -> /var/www/run/abusive_http_hosts.

Ctrl-C, aby zatrzymać. Sprawdzić blocklistę:

cat /var/www/run/abusive_http_hosts

Powinieneś zobaczyć krótką listę IP — najgłośniejsze prober-y w obserwowanym oknie czasowym.

4. Podpiąć firewall pod blocklistę

Na OpenBSD dodać tabelę <abusive>, która ładuje się z pliku:

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

Przeładować pf:

doas pfctl -f /etc/pf.conf

Tabela teraz blokuje wszystko od tych IP na firewallu — żadne CPU serwera web nie jest już na nie marnowane.

Aby nowe wpisy były automatycznie przejmowane, przeładowywać tabelę w krótkich odstępach. Prosty cron:

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

Na Linuksie odpowiednikiem jest set nftables lub ipset, przeładowywany przez podobny cron z tego samego pliku.

5. Uruchomić jako daemon

Zainstalować skrypt rc.d (patrz Operacje po skrypt). Aktywować i uruchomić:

doas rcctl enable abusive_http_watch
doas rcctl start abusive_http_watch

Daemon teraz ciągle podąża za logiem i pisze blocklistę. tail -f /var/log/daemon (lub skonfigurowana facility syslog) pokazuje na żywo eventy added.

6. Weryfikacja

Poczekać kilka minut, potem sprawdzić:

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

Liczby powinny się zgadzać. Jeśli tak, jesteś gotowy — daemon działa, blocklista rośnie, firewall filtruje.

Jeśli plik blocklisty pozostaje pusty po godzinie-dwóch na publicznym serwerze web, twój access-log jest niezwykle czysty (gratulacje) lub daemon nie czyta tej ścieżki, którą myślisz. Patrz Operacje po troubleshooting.