Una avalancha de scrapers en el plan gratuito de Cloudflare: qué la detuvo y qué dejamos desactivado

Operaciones

Una mañana, uno de nuestros sitios de fichas de producto dejó de abrir. Cloudflare mostraba a los visitantes un error 524, el origen tardaba entre dos y seis minutos por página, y nada nos avisó durante unas diez horas. La causa fue un scraper que pasaba por proxies residenciales a unos 225 solicitudes por segundo.

La forma de la avalancha

Cada página se renderizaba para cada solicitud, por lo que cada worker encolaba cientos de renderizados y alcanzaba su límite de CPU.

Por qué los límites por dirección no podían ayudar

Un límite de frecuencia cuenta las solicitudes por dirección. Con una a tres solicitudes de cada una de miles de direcciones, ninguna dirección se acerca nunca a un límite. Bloquear países habría bloqueado a nuestros visitantes. Lo que el scraper no podía fingir de forma barata era comportarse como un navegador que ya había visitado el sitio.

En el edge de Cloudflare: tres reglas gratuitas

El plan gratuito permite cinco reglas personalizadas de WAF por zona. Usamos tres, todas con un desafío gestionado en lugar de un bloqueo, para que una persona atrapada por error haga clic y pase:

Las tres dejan pasar los bots verificados de Cloudflare, los user agents que se identifican como robots, nuestras propias direcciones, las rutas de la API y de los webhooks, y los archivos que no son páginas. Dos días después, la inundación seguía: en una hora, la regla de navegador falso había desafiado a más de 10.000 solicitudes. Los 10.000 eventos que Cloudflare devuelve por consulta provenían de 9.627 direcciones, ninguna con más de 4.

En el origen: una barrera en la app

La mitad sin interfaz gráfica tiene cabeceras de navegador completas, por lo que las reglas del borde no la detectan mientras la regla de emergencia está desactivada. En la propia app, colocamos un pequeño middleware delante del renderizador de páginas:

En su primer minuto, la barrera rechazó unos 6.700 navegadores falsos y apartó a unos 6.700 desconocidos, mientras servía a los desconocidos unas 9 páginas por segundo. Las solicitudes lentas cayeron a cero, la CPU de los workers bajó de su límite al 12-15 por ciento, y su memoria de 4-5 GB cada uno a 0,65 GB.

Lo que dejamos desactivado

La conclusión

Una inundación a través de proxies residenciales es fácil de detectar por lo que le falta: cabeceras de fetch del navegador, cookies y Referers. Desafíala en el borde, mantén a los desconocidos dentro de lo que tus workers pueden renderizar y asegúrate de que algo externo al servidor se dé cuenta cuando una página deja de abrirse. Night Watch empaqueta las tres cosas: la vigilancia, las reglas con un interruptor automático para la de emergencia, y la barrera para apps web en Python.

Actualizado: