Agente ReportedIP para Linux
El agente es un único binario estático que hace dos trabajos en un servidor Linux: mantiene la lista negra comunitaria en el cortafuegos del núcleo y notifica a los atacantes que encuentra en los registros de ese servidor. De forma opcional también bloquea él mismo esos hallazgos locales. Sustituye al script de sincronización escrito a mano que documenta este sitio, y asume el trabajo que hacía fail2ban.
linux/amd64 y linux/arm64.
Cada servidor necesita una licencia, una
viene incluida en Professional y tres en Business, véase
Licencias de servidor. Las licencias se añaden y se retiran en
Agent Servers, dentro de tu
cuenta.
Qué hace
La lista negra comunitaria en el núcleo
Cinco listas, una por servicio expuesto (ssh, mail, web, ftp, edge), más una sexta,
group, con lo que han notificado los demás servidores del grupo de tu cuenta, descargadas tan a
menudo como lo permita tu licencia e intercambiadas en un conjunto de ipset o de nftables de
forma atómica. Una lista que volvió vacía o más corta que min_entries no se
aplica nunca, así que una descarga fallida deja en su sitio el conjunto anterior. La lista del
grupo es la excepción: no tiene mínimo, y una lista del grupo vacía vacía su conjunto.
Ataques locales reconocidos y notificados
Catorce tipos de fuente, dieciocho fuentes de evento, cada una con su propio umbral. El agente sigue los registros que el servidor ya escribe, cuenta los golpes por dirección y notifica la dirección en cuanto se alcanza su umbral. Ninguna línea de registro, ningún nombre de usuario y ninguna URL sale de la máquina.
Hallazgos locales bloqueados
Activado tras la instalación (ban.enabled: true). Una dirección que el agente
ha detectado él mismo entra en un conjunto del núcleo con plazo, y un reincidente se bloquea más
tiempo cada vez. Ponlo en false para un host que solo deba notificar.
Por dónde seguir
- Instalación: las condiciones de uso, las comprobaciones, cada pregunta, las opciones y las variables de un despliegue, un host sin systemd.
- Ejemplos de instalación: Ansible y cloud-init, una imagen base, paneles de control, un host de correo o de base de datos, contenedores LXC y cortafuegos en la nube.
- Configuración: cada clave de config.yaml, los umbrales, la escalada de bloqueos, el correo y cuándo tiene efecto un cambio.
- Detección y reglas: los tipos de fuente, los escaneos de puertos desde el registro del núcleo, añadir un registro que el instalador pasó por alto, qué sale de la máquina y los archivos de reglas.
- Bloqueo: las dos clases de conjunto, cómo empieza y termina un bloqueo, la cadena en el núcleo y cómo levantar un bloqueo.
- Grupos: bloqueos compartidos entre tus servidores y tus sitios WordPress, los límites por plan, la lista blanca y el webhook.
- Funcionamiento: comandos, códigos de salida, las unidades, la monitorización, la reputación de la propia dirección del host y la tabla de resolución de problemas.
- Licencias: una licencia por servidor, el presupuesto de informes, los grupos a partir de Professional y qué sigue funcionando sin ella.
- Sustituir fail2ban: la migración en tres pasos, y el camino de vuelta.
Requisitos
| Necesario | Para qué, y qué pasa sin ello |
|---|---|
Un filtro de paquetes en el que se pueda escribir: ipset con iptables, o nftables | apt install ipset iptables o apt install nftables, en la familia RHEL dnf. Sin uno de los dos el host notifica y no bloquea, y esa es una forma de funcionamiento admitida. ip6tables se usa cuando está; sin esa herramienta los bloqueos IPv6 se registran pero no se aplican. |
| systemd | El único requisito duro de install, porque escribe y activa tres unidades. Se comprueba leyendo /run/systemd/system y no por la presencia de systemctl. El binario en sí no depende de él: watch para la detección más un sync desde cron dan un host que funciona, montado a mano. |
| Root | El agente escribe reglas de cortafuegos y lee registros que no son legibles por todos. No hay un modo reducido para un usuario normal. |
| Una clave API de tu cuenta | Se usa dos veces durante la instalación, una para descargar el binario licenciado y otra para registrar el host. Una clave por host es la recomendación; varios hosts con una clave están permitidos y no cuestan nada más, porque un host se identifica por su ID de instalación. |
curl o wget, más sha256sum | Solo para install.sh, para la descarga y la suma de comprobación. Se niega a instalar cuando falta la herramienta de suma. |
Nada más. El binario está enlazado estáticamente y construido sin cgo, así que no trae intérprete, ni biblioteca compartida, ni repositorio de paquetes, ni ayudante de cron propio. Se desarrolló y se midió en Debian 12 (bookworm) en arm64 con ISPConfig, nginx, Postfix, pure-ftpd y bind.
ipset o nftables, y qué decide auto
Los dos backends hacen el mismo trabajo. Lo que importa es cuál usa ya el host, porque dos filtros de paquetes escribiendo la misma cadena INPUT es la forma en que desaparece una tarde.
backend | Qué pasa |
|---|---|
auto (por defecto) | Se prefiere ipset cuando ipset e iptables están los dos en el host, en otro caso se usa nft. Esa preferencia existe porque CSF y la guía de cortafuegos publicada usan esa cadena de herramientas, así que un host con reglas existentes las conserva. |
ipset | Conjuntos en ipset, reglas en la cadena rip-blacklist de iptables e ip6tables. Falla con un mensaje claro cuando falta una de las dos herramientas, en vez de recurrir a la otra. |
nftables | Conjuntos y reglas en la tabla nativa inet reportedip. Falla cuando falta nft. |
Solo cuenta un binario que exista, nunca una cadena de versión: iptables --version en un
host con el backend nft dice algo que parece correcto y no significa nada. En cuanto un host ha
sincronizado, el backend elegido queda registrado, y un cambio posterior necesita
reportedip-agent sync --migrate-backend en vez de construir en silencio un segundo juego
de reglas.
Comprobar primero el host
doctor es el comando que se ejecuta antes de instalar. No cambia absolutamente
nada: ningún archivo, ningún directorio, ninguna regla, ningún conjunto. Todo lo que informa lo ha
leído.
reportedip-agent doctor
| Sección | Qué responde |
|---|---|
system | La distribución tal como la nombra su propio os-release, el núcleo, la plataforma, si systemd está realmente en marcha, la zona horaria con la que se leen los registros sin desfase horario, y el espacio libre donde vivirá el directorio de estado. |
ssh | Qué unidad ejecuta sshd, y el puerto. Con ssh.socket el puerto sale del proceso a la escucha, porque sshd -T sigue respondiendo 22 mientras el puerto real está en la unidad de socket. doctor dice cuál de los dos se aplicó. |
firewall | Dónde están ipset, iptables, ip6tables y nft, qué backend resulta de eso, y si el conjunto de bloqueos locales lleva un plazo por entrada. Ese último punto decide si el núcleo hace caducar un bloqueo por su cuenta. |
panel | ISPConfig, Plesk, cPanel o DirectAdmin. Esta versión solo conoce la disposición de registros por sitio de ISPConfig; los demás se nombran en vez de adivinarse, porque un glob equivocado haría que el agente leyera contadores de bytes en lugar de registros de acceso. |
sources | Cada fuente configurada resuelta a archivos reales, cuántos son y cuántos son legibles, el mayor con un número de líneas estimado, y un aviso sobre archivos que están y están vacíos. En el host de panel más grande medido, los globs web se resuelven a 196 archivos. También nombra un registro que este host escribe y que ninguna fuente lee. Así se ve un servicio instalado después del agente, y ese hallazgo justifica el código de salida 1. |
mail | Si un aviso podría salir realmente de este host. De dieciocho hosts medidos, catorce podían entregar correo, dos tenían sendmail con el MTA parado, y dos no tenían MTA alguno. |
verdict | El resumen, y se corresponde con el código de salida. |
Leer el veredicto
| Salida | Veredicto | Qué significa |
|---|---|---|
0 | está todo lo que el agente necesita | Instala. |
1 | funciona en este host, con los límites de arriba | Cada límite se imprime por su nombre. Un backend de cortafuegos ausente significa que este host notifica y no bloquea, y esa es una instalación válida. Una fuente que no resuelve nada merece arreglarse antes. |
2 | no puede funcionar en este host | No es un host Linux, o es un host que no puede ni bloquear ni leer un solo registro. Arregla la causa antes de instalar. |
Vuelve a ejecutar doctor después de la instalación. Con una configuración en su sitio
informa de las fuentes configuradas en vez de las detectadas, y añade la desviación de reloj por
fuente que midió el demonio. Una fuente cuyo registro sella cada línea a más de un minuto del reloj
del sistema tiene una ventana de recuento que nunca se llena, y ese es el único fallo que se parece
exactamente a «el detector no funciona».
Instalación rápida
Tres comandos en un host que todavía no tiene nada de esto. Ejecútalos en este orden y el agente notifica, las listas de la comunidad están en el núcleo y no se ha descartado nada que no hayas aceptado.
# 1. Install, as root. At a terminal it shows the terms of use and
# takes a yes, then asks for your key, then three short questions;
# an Enter answers drop and local bans on.
curl -fsSL https://reportedip.com/agent/install.sh | sh
# For automation, and for fifty hosts, nothing is asked: the terms
# are accepted up front and the key comes from the environment.
curl -fsSL https://reportedip.com/agent/install.sh | REPORTEDIP_ACCEPT_TERMS=1 REPORTEDIP_KEY="YOUR_API_KEY" sh
# 2. The first sync builds the chain and the sets. The installation
# itself touches no firewall rule.
reportedip-agent sync
# 3. See that it ran, and read what would be dropped before it is.
reportedip-agent status
reportedip-agent doctor
reportedip-agent test /var/log/auth.log
Qué deja cada uno: el primero coloca el binario en /usr/local/bin, escribe
/etc/reportedip-agent/config.yaml a partir de lo que ha encontrado en este host e
instala las tres unidades de systemd. El segundo crea la cadena del cortafuegos y los conjuntos,
que la instalación no toca a propósito, y los llena. El tercero es la prueba: status
muestra un recuento de entradas por lista y el estado de licencia de este host, doctor
nombra todo lo que falta, y test vuelve a pasar tu propio registro para mostrar qué
dirección habría superado qué umbral. Las reglas descartan desde la primera sincronización, porque
eso es lo que escribe la instalación, así que la lista blanca va antes de esa sincronización y no dos
días después. Responde log en su lugar para un host en el que quieras leer primero un
diario. La página de instalación
es la misma instalación explicada por completo, y ese detalle es su razón de ser.
La primera hora, en orden
Cada paso responde a una pregunta de la que depende el siguiente. En otro orden, una instalación que funciona parece averiada.
reportedip-agent doctor. Antes que nada, porque es el único comando que no cambia nada.reportedip-agent sync. La primera ejecución construye la cadena, crea los conjuntos y descarga las listas configuradas, una tras otra con una pausa corta entre ellas.reportedip-agent status. Comprueba que cada lista configurada tiene un número de IPv4 plausible, que la cadena diceok, que la lista blanca contiene las direcciones que esperas, y queaccountmuestra tu rol y el estado de licencia de este host.- Arregla la lista blanca. El instalador añadió a la lista blanca la dirección desde la que llegó tu sesión SSH, que es una suposición. Sustitúyela por el rango desde el que administras de verdad, y añade tu monitorización, tu host de copias y el rango de tu oficina.
- Vuelve a leer
statusal cabo de un día. Los contadores de paquetes de la cadena dicen cuánto han parado de verdad las reglas, yban listdice qué direcciones ha detectado este host en sus propios registros. - Solo en un host para el que hayas respondido
log: las reglas están del todo construidas y coinciden, solo registran en vez de descartar, así que el registro del núcleo te muestra exactamente qué habría cortadodrop. Lee un diario, luego ponmode: dropy ejecutasync, que reconstruye las reglas.
reportedip-agent doctor
reportedip-agent sync
reportedip-agent status
reportedip-agent whitelist add 203.0.113.0/24 "management"
reportedip-agent whitelist add 198.51.100.7 "monitoring"
reportedip-agent whitelist list
log también te da
esos dos días, un host que tomó el valor por omisión no.
Actualizaciones y notas de versión
El agente busca una versión nueva cada seis horas, durante la sincronización. Verifica la descarga
contra una firma Ed25519 con la clave pública integrada en el binario, devuelve a su sitio el binario en
ejecución si el cambio falla y reinicia él mismo el servicio watch.
reportedip-agent update hace lo mismo a petición, y update --check solo
informa de lo que está publicado.
Volver a ejecutar el comando de instalación también actualiza un host. Un host por debajo de la
versión mínima que admite el servicio se sigue actualizando solo; hasta que lo hace, el agente lo
advierte en su registro, en status (exit 1) y en update --check. Las vueltas a una versión anterior se rechazan en general, así que un
host que ha descargado una versión más reciente no retrocede por sí solo.
Lo que ha cambiado la versión actual es público y no necesita ninguna clave:
curl -s https://reportedip.com/agent/whats-new
reportedip-agent update --check
Los cambios en la propia REST API, o sea los campos de respuesta y los códigos de estado que afectan a una integración, están en cambio en el Changelog de la API.
Últimas versiones
- 0.3.41:
--admin-ipacepta ahora de verdad un rango CIDR. Hasta 0.3.40 un rango se recortaba a su dirección de red, así que en la lista blanca automática solo acababa esa dirección. Conbackend: autoel agente prefiere ipset, y las indicaciones del instalador ya lo dicen. - 0.3.40:
status --jsonpara la monitorización: un documento con esquema 1 y el mismo veredicto y código de salida que el texto, sin petición a la API, y una configuración rota (exit 2) también entrega un documento.statusinforma ahora de un demonio watch parado con exit 1: el demonio deja una señal de vida cada 30 segundos, y una de más de dos minutos cuenta como parado. La configuración para los sistemas de monitorización habituales está en Monitorización. - 0.3.39: la regla de escaneo de puertos ya no banea clientes FTP en modo pasivo. Cada conexión de datos va a un puerto que el servidor abre solo para esa transferencia, la regla conocía los puertos en escucha solo por la última sincronización, y por eso subir una carpeta parecía un escaneo en pocos segundos. La regla consulta ahora al núcleo si en ese momento escucha un socket en el puerto (
-m socket --nowildcardcon iptables,socket transparentcon nftables), y el rango pasivo de un pure-ftpd, proftpd o vsftpd en marcha se lee de su configuración y queda fuera de la regla. En un servidor sin rango configurado queda fuera en su lugar el rango de puertos efímeros del núcleo. La cadena se reconstruye una vez en la siguiente sincronización. - 0.3.38:
installacepta el nivel de registro, como--log-level debug|info|warn|erroro comoREPORTEDIP_LOG_LEVEL. El valor por defecto sigue siendowarn. Un despliegue que quiere leerlo todo en cada host diceinfouna sola vez en lugar de editar después la configuración de cada host, y un nivel que el analizador rechazaría se rechaza antes de escribir nada. - 0.3.37: un servicio que solo escucha en la interfaz loopback ya no cuenta como alcanzable. El sondeo de puertos contaba cada escucha de la tabla del núcleo sin importar a qué dirección estuviera vinculada, así que el resolvedor local que ocupa
127.0.0.53:53en un host Debian corriente parecía un servidor de nombres, y un servidor de correo que solo acepta correo de su propia máquina parecía uno abierto a Internet. Un puerto que tiene un socket en loopback junto a uno real sigue contando. Esto decide también qué puertos trata como abiertos la regla de escaneo de puertos. - 0.3.35:
doctornombra un registro que este host escribe y que no lee ninguna fuente, y dice dónde añadir la fuente. La detección se ejecuta una sola vez, en la instalación, y eso se queda así, porque un servicio detenido por mantenimiento nunca debe apagar una fuente. La dirección contraria no tenía a nadie que la vigilara: un servidor de correo instalado en un host que antes no tenía ninguno pasaba desapercibido, y el host parecía sano mientras ese servicio quedaba sin vigilancia. El hallazgo produce el código de salida 1. - 0.3.34:
installlee los registros web de la propia configuración del servidor web, incluidos los archivos de host virtual bajoconf.dysites-enabled, en lugar de una lista de nombres por defecto. Un alojamiento real nombra sus registros según el sitio, así que las rutas por defecto encontraban el registro por defecto y se perdían el resto: en un host medido, otros dos registros, uno de ellos un registro de acceso con direcciones reales, se habrían quedado sin leer. Un registro cuyo formato oculta la dirección del cliente se sigue dejando fuera, y cada registro tomado así se nombra en una línea durante la instalación. - 0.3.32:
statusya no llama degraded a un host porque su lista de grupo esté vacía, que es el estado normal de una clave que no está en ningún grupo, ydoctorya no afirma que no haya ninguna fuente de registro en un host cuyo sshd escribe en el diario de systemd en lugar de en un archivo. - 0.3.29: una instalación nueva escribe
log_level: warnen lugar deinfo, así que un host nuevo se queda callado en el diario de systemd hasta que algo pide atención. Las líneas de rutina, una lista actualizada, una notificación en cola, un bloqueo local puesto, no cambian y están a una palabra de distancia. Un host que ya está instalado conserva lo que dice su archivo de configuración. - 0.3.27: la lista blanca del grupo: las direcciones y prefijos que nombra un grupo de tu cuenta no los bloquea ni notifica nunca ningún miembro. La sincronización la lee con la lista de grupo, la escribe en
group-whitelistbajo el directorio de estado y la aplica en la misma pasada al conjunto de lista blanca del núcleo, al filtro de las listas y a la puerta de notificación;whitelist listystatusmuestran las entradas con sus notas. La lista blanca de este host, la lista blanca automática y las capas integradas se quedan como están. - 0.3.26: un escaneo de puertos rápido se quedaba por debajo de su propio umbral: la regla de escaneo registraba diez SYN por minuto con la ráfaga por defecto del núcleo de cinco, así que un escáner que sondea mil puertos en pocos segundos dejaba cinco líneas, y la regla necesita diez. La regla admite ahora una ráfaga de veinte, los veinte primeros sondeos de un escaneo se registran de golpe, y después la tasa mantiene el registro en silencio. La cadena se reconstruye una vez.
- 0.3.25: un host cuya clave no está en ningún grupo perdía su cadena con 0.3.24, porque el conjunto de grupo solo lo crea su primer feed y la regla que lo nombra era rechazada. Ahora cada conjunto de lista se crea antes de que una regla lo nombre. 0.3.24 fue retirada.
- 0.3.24: la lista de grupo
groupen el conjuntorip-groupen todos los puertos; la reputación de la dirección desde la que este host notifica, como condición de saludreputation; la detección de escaneos de puertos desde el registro del núcleo con la fuentescan. La cadena se reconstruye una vez tras esta actualización y sus contadores de paquetes empiezan de cero.
Consumo de recursos
Medido en un host Debian 12 arm64 con siete archivos de registro seguidos por el agente: 16,6 MB de memoria residente. No hay intérprete que arrancar, ni base de datos, ni directorio de caché que calentar, y eso es la mayor parte de la explicación de esa cifra tan pequeña.
Qué no es el agente
No es un antivirus, ni un cortafuegos de aplicaciones web, ni un sustituto de Imunify360. No lee tus archivos, no examina cuerpos de peticiones y no pone nada en cuarentena. Bloquea y notifica direcciones, y lo hace sobre una superficie pequeña y auditable. Para protección a nivel de una sola petición en un sitio WordPress, usa en su lugar el plugin Hive. Los dos se ejecutan en la misma máquina sin estorbarse.
Última actualización: · Mantenido por el equipo de ReportedIP