Ce guide accompagne le lancement d’Abusive HTTP Watch sur un access log réel d’un système OpenBSD. Le même flux fonctionne sur FreeBSD et Linux avec de petites adaptations.

1. Installer le script

Déposer le script à un emplacement système et le rendre exécutable.

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

Le daemon n’a aucune dépendance Perl externe — seulement la bibliothèque standard (Fcntl, IO::Handle, Sys::Syslog, Socket). Si perl est sur le système, le script tourne.

2. Créer le répertoire runtime

Le daemon écrit la blocklist dans un fichier unique. Choisissez un chemin que votre pare-feu va lire.

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

Le fichier blocklist (/var/www/run/abusive_http_hosts par défaut) est créé au premier lancement s’il n’existe pas.

3. Tester sur un log récent

Avant de relier le daemon au système, le lancer directement sur un access log pour voir son comportement.

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

La sortie debug ([dbg] ip=…, [dbg] token match ip=…, [dbg] count ip=… N/3) permet d’observer le matcher en temps réel. Quand une IP dépasse le seuil de hits (par défaut 3), vous voyez [added] <ip> -> /var/www/run/abusive_http_hosts.

Ctrl-C pour arrêter. Inspecter la blocklist :

cat /var/www/run/abusive_http_hosts

Vous devriez voir une courte liste d’IP — les sondeurs les plus bruyants dans la fenêtre observée.

4. Câbler le pare-feu sur la blocklist

Sur OpenBSD, ajouter une table <abusive> chargée depuis le fichier :

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

Recharger pf :

doas pfctl -f /etc/pf.conf

La table bloque maintenant tout depuis ces IP au pare-feu — plus de CPU serveur web dépensé pour elles.

Pour reprendre les nouveaux entrées automatiquement, recharger la table sur un intervalle court. Approche cron simple :

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

Sur Linux, l’équivalent est un set nftables ou ipset rechargé depuis le même fichier par un cron similaire.

5. Lancer comme daemon

Installer le script rc.d (voir Exploitation pour le script). Activer et démarrer :

doas rcctl enable abusive_http_watch
doas rcctl start abusive_http_watch

Le daemon suit maintenant le log en continu et écrit la blocklist. tail -f /var/log/daemon (ou la facility syslog configurée) montre les événements added en direct.

6. Vérifier

Attendre quelques minutes, puis :

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

Les chiffres doivent correspondre. Si c’est le cas, c’est terminé — le daemon tourne, la blocklist croît, le pare-feu filtre.

Si le fichier blocklist reste vide après une ou deux heures sur un serveur web public, votre access log est anormalement propre (félicitations) ou le daemon ne lit pas le chemin que vous pensez. Voir Exploitation pour le troubleshooting.