# QuickstartInstalar, lanzar, observar — menos de diez minutos desde el primer comando hasta las IPs bloqueadas.

Esta guía recorre la puesta en marcha de Abusive HTTP Watch sobre
un access log real en un sistema OpenBSD. El mismo flujo funciona
en FreeBSD y Linux con pequeños ajustes.

## 1. Instalar el script

Depositar el script en una ubicación del sistema y hacerlo
ejecutable.

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

El daemon no tiene dependencias Perl externas — solo la biblioteca
estándar (`Fcntl`, `IO::Handle`, `Sys::Syslog`, `Socket`). Si
`perl` está en el sistema, el script corre.

## 2. Crear el directorio de runtime

El daemon escribe la blocklist en un único fichero. Elige una ruta
desde la que tu firewall pueda leer.

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

El fichero blocklist (`/var/www/run/abusive_http_hosts` por
defecto) se crea en el primer arranque si no existe.

## 3. Probar contra un log reciente

Antes de cablear el daemon al sistema, lanzarlo directamente
contra un access log para ver su comportamiento.

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

La salida debug (`[dbg] ip=…`, `[dbg] token match ip=…`,
`[dbg] count ip=… N/3`) deja observar el matcher en tiempo real.
Cuando una IP cruza el umbral de hits (3 por defecto), aparece
`[added] <ip> -> /var/www/run/abusive_http_hosts`.

Ctrl-C para parar. Inspeccionar la blocklist:

```sh
cat /var/www/run/abusive_http_hosts
```

Debes ver una lista corta de IPs — los probers más ruidosos en la
ventana observada.

## 4. Cablear el firewall a la blocklist

En OpenBSD, añadir una tabla `<abusive>` que carga desde el
fichero:

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

Recargar `pf`:

```sh
doas pfctl -f /etc/pf.conf
```

La tabla bloquea ahora todo desde esas IPs en el firewall — sin
gastar más CPU del servidor web.

Para recoger entradas nuevas automáticamente, recargar la tabla
en un intervalo corto. Cron sencillo:

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

En Linux, el equivalente es un set `nftables` o `ipset` recargado
desde el mismo fichero por un cron similar.

## 5. Ejecutar como daemon

Instalar el script `rc.d` (ver [Operación](../operations/) para
el script). Activar y arrancar:

```sh
doas rcctl enable abusive_http_watch
doas rcctl start abusive_http_watch
```

El daemon sigue ahora el log de forma continua y escribe la
blocklist. `tail -f /var/log/daemon` (o la facility syslog
configurada) muestra los eventos `added` en vivo.

## 6. Verificar

Esperar unos minutos, luego:

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

Las cifras deben coincidir. Si lo hacen, has terminado — el daemon
corre, la blocklist crece, el firewall filtra.

Si el fichero blocklist sigue vacío tras una o dos horas en un
servidor web público, tu access log está anormalmente limpio
(enhorabuena) o el daemon no lee la ruta que crees. Ver
[Operación](../operations/) para troubleshooting.
