Поплава од скрепер на Cloudflare Free план: што ја запре, и што оставивме исклучено
Операции
Едно утро нашиот сајт со огласи престана да се отвора. Cloudflare на посетителите им прикажа грешка 524, изворот за секоја страница требаше две до шест минути, а ние ништо не ни кажа околу десет часа. Причината беше скрепер кој минуваше низ резидентни прокси на околу 225 барања во секунда.
Формата на поплавата
- Илјадници адреси, по едно до три барања секоја. Домашни широкопојасни врски во САД, Шпанија, Франција, Бразил, Велика Британија и други земји, видот на сообраќај што го изнајмува мрежа за резидентни прокси.
- Chrome кориснички агенти на Mac, со верзии од 103 до 151.
- Речиси никогаш колаче или Referer. Од 2.697 барања што ги примерочивме на серверот, 4 носеа колаче и 4 Referer.
- Два вида клиенти. Околу половина не испраќаа
Sec-Fetch-*заглавја и без клиентски хинтови: скрипта со копирана низа за кориснички агент. Другата половина испраќаше целосни прелистувачки заглавја: безглав прелистувач.
Секоја страница се рендерираше за секое барање, па секој worker чекаше во ред стотици рендерирања и го достигна своето ограничување на CPU.
Зошто ограничувањата по адреса не помогнаа
Ограничувањето на стапката ги брои барањата по адреса. Со едно до три барања од илјадници адреси, ниту една адреса никогаш не се приближува до ограничувањето. Блокирањето на земји би ги блокирало нашите посетители. Она што скреперот не можеше евтино да го фалсификува беше однесувањето како прелистувач кој веќе бил на сајтот.
На Cloudflare edge: три бесплатни правила
Free планот дозволува пет WAF прилагодени правила по зона. Ние искористивме три, сите со managed challenge наместо блок, за да може човек фатен по грешка да го помине предизвикот:
- Лажно прелистувач: GET чиј кориснички агент содржи
Chrome/и кој немаSec-Fetch-Modeзаглавие. Секој Chrome од 2019 го испраќа. - Скреперски облаци: барање за страница од мрежите на Alibaba, Tencent и Huawei Cloud, од каде што дојде поголемиот дел од она што го предизвикавме.
- Итен случај, исклучено по основно: GET без ниту едно колаче и без Referer. Човек кој бил на сајтот, или кој доаѓа преку линк, поминува недопрен; скрепер кој не чува колачиња се соочува со предизвик на секое барање. Ние го вклучуваме само за време на поплава, бидејќи го предизвикува и оној кој ја внесува адресата во свеж прелистувач.
Сите три ги пропуштаат проверените ботови на Cloudflare, корисничките агенти што се претставуваат како роботи, нашите сопствени адреси, патеките за API и webhook, и датотеките што не се страници. Два дена подоцна, поплавата сè уште траеше: за еден час правилото за лажни прелистувачи предизвика повеќе од 10.000 барања. 10.000 настани што Cloudflare ги враќа по барање дојдоа од 9.627 адреси, ниту една со повеќе од 4.
На изворот: порта во апликацијата
Безглавниот дел има целосни заглавја на прелистувач, па затоа правилата на работ сами не го фаќаат додека итноста е исклучена. Во самата апликација ставивме мал middleware пред рендерирачот на страницата:
- кориснички агент на Chrome без
Sec-Fetch-Modeниту client hints добива 403 пред да се изврши било каква работа; - странец, без ниту еден од нашите колачиња и без Referer, се опслужува само додека worker-от има слободен капацитет, по неколку страници во секунда. Над тоа, страница 503 од 400 бајти поставува колаче и се превчитува по две секунди. Човек ја добива страницата при вториот обид; скрепер што не чува колачиња никогаш не ја добива.
Во првата минута портата одби околу 6.700 лажни прелистувачи и отфрли околу 6.700 странци, додека им опслужи на странците околу 9 страници во секунда. Бавните барања паднаа на нула, CPU-то на worker-ите падна од нивното ограничување на 12 до 15 проценти, а нивната меморија од 4 до 5 GB по еден на 0,65 GB.
Што оставивме исклучено
- Bot Fight Mode. Тој предизвикува автоматизиран сообраќај и не може да се прескокне со прилагодено правило на Free планот, а ги фати webhook-овите на нашиот добавувач на плаќања.
- Under Attack mode за целата зона. Тој ги става сите посетители, API клиенти и webhook-ови низ интерстицијалната страница. Итното правило ја врши истата работа само за барањата за страници од странци.
- Правилото за ограничување на стапката на Free планот. Тој брои по адреса, што оваа поплава никогаш не го активира.
- Блокирање на AI скрепери. Сакаме да бидеме пронајдени од AI асистенти за пребарување, а тие скрепери не беа проблемот.
Заклучокот
Поплава низ резидентни прокси-сервери лесно се забележува по она што му недостасува: заглавја за fetch на прелистувач, колачиња и Referer-и. Предизвикајте го тоа на работ, држете ги странците во границите што вашите worker-и можат да ги рендерираат, и осигурајте се нешто надвор од серверот да забележи кога страницата престанува да се отвора. Night Watch ги пакува сите три: надзорот, правилата со автоматско префрлување за итното, и портата за Python веб апликации.