- Update: se modificó para usar rewritecond tambien, proque si bloqueaba comoestaba original pero ahora deb dar error 403 a los bots y no 404. Literalmente en 4 horas mas de 1500 entradas de amazon con 404
- Update 2. El archivo mensual raw del foro son 32 mb comprimidos, y de 418mb sin comprimir, le pedi a claude que reescribiera el import.
- mas de medio millon de una sola direccion de un bot ruso.
- unos 350 mil de diferentes direcciones de GPTbot, bloqueado
- Aprox lo mismo de amazon
Pueden descargarse del repositorio los archivos en https://github.com/AlfonsoOrozcoAguilarnoNDA/snippetsMIT/tree/main/brucenbanned
Esta semana ha coincidido con que los bots lectores de sitios web estan desbocados y están causando problemas de rendimiento en algunos servidores. Por ejemplo el caso de gptbot es uno, pero tengo cosas como amazonbot tratando de leer foros archivados o blogs de clientes , y en promedio aunque mis servidores CPANEL suelen manejar un máximo de 96 sitios (por cuestiones de estadística, no tanto “peso” o numero de licencias) se estan creando situaciones ridículas y una necesidad real de bannear de manera centralizada.
- Importante, el archivo raw de apache se puede bajar de muchos paneles de control y de debian. En eel caso de cpanel, se baja de la sección raw. Seleccioné los cuatro archivos mas grandes y los descomprimí y renombre.
Ejemplo, esta es una linea del raw log de apache de uno de mis stios, Noto que el mj ya esta banneado como robots.
-
65.108.125.120 – – [28/Apr/2026:08:11:57 -0600] “GET /mybb/showthread.php?tid=2681&pid=23363 HTTP/1.1” 200 58045 “-” “Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)”
El problema y la necesidad real es que un renglón no pasa nada,pero cuando tienes 19 mb de UN SOLO SITIO diariamente, es excesivo. Y moverlo a vultr solo mueve el problema allá.
Ahora imagina que tengo un sitio que solo es una redireccion y tengo 600 logins en el mismo dia a
- GET /autodiscover/autodiscover.xml
Tratando de revisar credenciales de outlook. Provoca un error además porque el archivo no existe.
Uno de los wordpress que tengo tuvo esto en u ndia :
- 193.142.147.5 (57848) Es decir, la ip trató de entrar 57848 por fuerza bruta
Por lo mismo, creo que es necesario hacer un snippet y presento el diálogo que le di a gemini Gemini para hacerlo y las premisas.
- Tengo una idea para un proceso específico de bloqueo de bots. Te comento la idea: sería bajo PHP procedural, Bootstrap 4.6.2 y Font Awesome 5.15.4.
- La situación es que estoy teniendo 50 mil visitas diarias en un foro, de parte de bots. Puedo descargar sin problemas el acceso raw de Apache y mandar el sitio de cPanel a Vultr, pero no es una solución real porque solo paso el peso del log de un lugar a otro.
- Por lo mismo creo que lo mejor que puedo hacer es una función que lea un archivo
.txtcon el raw ya existente en el sitio, y sobre eso mostrar estadísticas y, con un clic, banear en.htaccessdel mismo directorio la dirección IP. - Se necesitarían dos tablas:
- Una para guardar el log indexado.
- Otra para las direcciones baneadas, incluyendo dominio, dirección IP y fecha del baneo.
- La idea es que sea multidominio, porque como tengo 20 sitios de WordPress no quiero instalar una base para cada uno, pero sí podría copiar el archivo de un lado a otro. Y pueda usarse en sitios que no tengan wordpress
- Recuerda que el raw de apache ya lleva subdirectorios implícitos
- No voy a tomar decisiones de baneo por agent (quien dicen ser), sino por lo que hacen. Y el log yo lo subo por FTP, así que debe haber un botón para importar el archivo a la base de datos.
- Por ejemplo, tengo un dominio que solo es una redirección y más de 25 mil visitas diarias de bots. Me interesa, por ejemplo, este caso:
- 65.108.125.120 – – [28/Apr/2026:08:11:57 -0600] “GET /mybb/showthread.php?tid=2681&pid=23363 HTTP/1.1” 200 58045 “-” “Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)”
- Se banea la dirección, se cambian todos los registros de la tabla de esa dirección a “baneado” y dejo de verlos en mi panel de control.
- La importación me pide dos cosas:
- El nombre del
.txt. - El nombre del dominio, que no necesariamente es el actual.
- El nombre del
- Prefiero que no haya campo status sea
ipbannedporque se entiende más;varcharde tres, default “NO”, y al banear “YES”, con mayúsculas, campo indexado obvio. - Así que, de lo que te pasé de la línea de mj12bot, se pueden definir unos ocho campos, ipraw, fecha raw, metodo get post etc. el valor de https el numero 58045 que spongo son bits enviados, y el agente declarado.
- Al presionar el botón en el panel de Bootstrap, el flujo lógico sería:
- a) Insertar la IP en una tabla maestra de
baneos_globales. - b) Ejecutar:
UPDATE log_indexado SET ipbanned = 'YES' WHERE ip_remota = '$ip_seleccionada';c) Refrescar la vista del panel, donde el
SELECTprincipal tenga unWHERE ipbanned = 'NO'.
- a) Insertar la IP en una tabla maestra de
- Necesitamos un filtro por IP, por User-Agent que se elija directo en un combo, por status y por dominio.
- Al importar, además debe leer de la tabla de baneos para marcar como baneadas todas esas instancias y no volverlas a procesar.
- Y como login, que revise una dirección IP en whitelist; si no, que diga que no es válida.
- La idea es tener una sola instancia del script, pero que pueda cambiar entre diversos servidores. Meterle OAuth puede ser complicado e innecesario
- Por cierto, debe borrar el archivo de logs una vez importado.
- El baneo debe ser solo por IP, no por agente.
- Considera, por favor, que el script debe tener barra de navegación con un combodown con tres opciones, mostrar versión de PHP y de MariaDB, y si se puede, hasta abajo las diez IP con más visitas y su número NO BANNEADAS, así como una opción inversa de insertar un campo para saber quién es realmente
65.108.125.120, es decir, convertir a nombre de host. - Si me está visitando desde Contabo o un servidor de OVH, es un bot casi seguro.
- Obvio debe haber desplazamiento a la derecha si no se ve todo en la pantalla.
- No se te olvide footer fijo y cabecera fija, e identificarte como modelo en el navbrand.
- NO quiero Acción Rápida: Un botón de “Baneo Masivo” al lado de cada IP de esa lista para limpiar el log de golpe, porque puede dar falsos positivos.
- NO quiero: Al lado de la IP, un botón o enlace que ejecute la función
gethostbyaddr(). Más bien que ejecute unDISTINCTy unUPDATEmasivo; es muchísimo más eficiente y rápido. - Generar como función lo del
.htaccess - Serían solo dos archivos con dos tablas, que deben verificar si existen.
- Antes que se me olvide, considera que existe
config.phpy ahí ya está definido$link, que hace el acceso a la base de datos comomysqli. - Serían solo dos archivos con dos tablas, que deben verificar si existen.
- En el menú principal debe haber un link al módulo de importar.
- Recuerda que existe
config.phpy ahí ya está definido$linkpara el acceso a la base de datos conmysqli. - Es importante destacar que los logs raw no necesariamente tienen la extension .txt, asi que yo los subo de otros sitios, otra extensión y los cambio por .txt. Consideralos en el combo, Gracias.
Nota : al verificar ortografia con copilot aunque le dije que no lo ejecutara lo ejecuto y no me corrigió la ortografia.
Gemini esta funcionando regular:
- Borró el crear tablas en una iteracion
- Tuve que hacer tres iteraciones para que guardara la hora correcta.
- La opcion de importar dejo de borrar el archivo.
- la opcion de resolver los hostnames globales no, pero si lo hace de manera local. suficiente de momento.
- Al final le pedí agregar una seccion al readme.md del repositorio. Se comió el 40% de lo existente. Lo que hice fue copiar la referencia y pegarla en el existente.
Lo que si note es que por alguna razon algunos clientes borraron el .htaccess. Puse esto para parar a amazon.
Inicia .htaccess
# 1. BLOQUEO DE BOTS POR USER-AGENT
SetEnvIfNoCase User-Agent “^Baiduspider” block_bot
SetEnvIfNoCase User-Agent “Amazonbot” block_bot
SetEnvIfNoCase User-Agent “PetalBot” block_bot
SetEnvIfNoCase User-Agent “MJ12bot” block_bot
SetEnvIfNoCase User-Agent “Awario” block_bot
SetEnvIfNoCase User-Agent “Bytespider” block_bot
SetEnvIfNoCase User-Agent “DotBot” block_bot
SetEnvIfNoCase User-Agent “SemrushBot” block_bot
SetEnvIfNoCase User-Agent “GPTBot” block_bot
SetEnvIfNoCase User-Agent “SERankingBacklinksBot” block_bot
# 2. APLICAR BLOQUEOS (Bots e IPs)
Order Allow,Deny
Allow from All
Deny from env=block_bot
# Lista negra de IPs detectadas
deny from 37.1.207.98
deny from 193.142.147.5
deny from 216.244.66.242
deny from 185.191.171.14
deny from 168.144.37.16
deny from 94.26.106.111
deny from 198.144.149.253
deny from 168.144.37.16
deny from 3.133.142.227
deny from 185.191.171.0/24
deny from 193.142.146.202
deny from 199.167.138.22
deny from 5.188.211.14
deny from 5.188.211.21
deny from 5.188.211.0/24
deny from 84.38.185.214
deny from 188.143.232.24
deny from 188.143.232.14
deny from 5.189.239.157
deny from 194.169.175.17
deny from 194.169.175.10
deny from 37.27.51.141
deny from 43.134.137.151
# 3. EXCEPCIÓN PARA LA PÁGINA DE ERROR 403
<Files 403.shtml>
Order Allow,Deny
allow from all
</Files>
# 4. CONFIGURACIÓN DE ERRORES
ErrorDocument 404 /index.php?module=404
# 5. MOTOR DE REESCRITURA (Redirecciones y HTTPS)
RewriteEngine On
# Bloqueo de bots por User-Agent (va ANTES de las reglas de HTTPS)
RewriteCond %{HTTP_USER_AGENT} Amazonbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} GPTBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Baiduspider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} PetalBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} DotBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SemrushBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} MJ12bot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Awario [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SERankingBacklinksBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Bytespider [NC]
# A – FORZAR HTTPS (Para todos los dominios y subdominios)
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
fin .htaccess
Pueden descargarse del repositorio los archivos en https://github.com/AlfonsoOrozcoAguilarnoNDA/snippetsMIT/tree/main/brucenbanned
Si, es bruce N banned, juego de palabras de Bruce Banner(hulk) pero no quiero problemas de copyright.
- Como nota, de 175112 registros de tres dominios, mas de 58 mil corresponden a un intento de fuerza bruta de wordpress. Los dos de 216 en ip son de Anthropic que si permioto, y amazon uso 434 direcciones distintas
SELECT COUNT(DISTINCT ip_remota) AS total_ips_amazon FROM log_indexado WHERE user_agent LIKE ‘%Amazon%’;
Fueron 434 direcciones diferentes
Mj12 42 y petal bot 40
-
La Red (Amazon): 434 IPs. Es un rastreo masivo y distribuido. Bloquearlas una por una es inútil; ahí es donde la regla de
SetEnvIfNoCase User-Agent "Amazonbot" block_botbrilla.
Conclusión
De 175,112 registros, el 33% es basura de fuerza bruta y el resto es un ejército distribuido de bots. Si no mides, no existes; y si no bloqueas, pagas la cuenta del servidor para que otros entrenen sus modelos.
A futuro:
Es posible que sea buena idea Seguir manejando cpanel. Asi puedo copiar el .htacces mas rapidamente a todos los dominios involucrados y leer el archivo raw.
