Поплава од скрепер на Cloudflare Free план: што ја запре, и што оставивме исклучено

Операции

Едно утро нашиот сајт со огласи престана да се отвора. Cloudflare на посетителите им прикажа грешка 524, изворот за секоја страница требаше две до шест минути, а ние ништо не ни кажа околу десет часа. Причината беше скрепер кој минуваше низ резидентни прокси на околу 225 барања во секунда.

Формата на поплавата

Секоја страница се рендерираше за секое барање, па секој worker чекаше во ред стотици рендерирања и го достигна своето ограничување на CPU.

Зошто ограничувањата по адреса не помогнаа

Ограничувањето на стапката ги брои барањата по адреса. Со едно до три барања од илјадници адреси, ниту една адреса никогаш не се приближува до ограничувањето. Блокирањето на земји би ги блокирало нашите посетители. Она што скреперот не можеше евтино да го фалсификува беше однесувањето како прелистувач кој веќе бил на сајтот.

На Cloudflare edge: три бесплатни правила

Free планот дозволува пет WAF прилагодени правила по зона. Ние искористивме три, сите со managed challenge наместо блок, за да може човек фатен по грешка да го помине предизвикот:

Сите три ги пропуштаат проверените ботови на Cloudflare, корисничките агенти што се претставуваат како роботи, нашите сопствени адреси, патеките за API и webhook, и датотеките што не се страници. Два дена подоцна, поплавата сè уште траеше: за еден час правилото за лажни прелистувачи предизвика повеќе од 10.000 барања. 10.000 настани што Cloudflare ги враќа по барање дојдоа од 9.627 адреси, ниту една со повеќе од 4.

На изворот: порта во апликацијата

Безглавниот дел има целосни заглавја на прелистувач, па затоа правилата на работ сами не го фаќаат додека итноста е исклучена. Во самата апликација ставивме мал middleware пред рендерирачот на страницата:

Во првата минута портата одби околу 6.700 лажни прелистувачи и отфрли околу 6.700 странци, додека им опслужи на странците околу 9 страници во секунда. Бавните барања паднаа на нула, CPU-то на worker-ите падна од нивното ограничување на 12 до 15 проценти, а нивната меморија од 4 до 5 GB по еден на 0,65 GB.

Што оставивме исклучено

Заклучокот

Поплава низ резидентни прокси-сервери лесно се забележува по она што му недостасува: заглавја за fetch на прелистувач, колачиња и Referer-и. Предизвикајте го тоа на работ, држете ги странците во границите што вашите worker-и можат да ги рендерираат, и осигурајте се нешто надвор од серверот да забележи кога страницата престанува да се отвора. Night Watch ги пакува сите три: надзорот, правилата со автоматско префрлување за итното, и портата за Python веб апликации.

Ажурирано: