Наводнение от скрейпери при безплатния план на Cloudflare: какво го спря и какво оставихме изключено

Операции

Една сутрин един от нашите сайтове с обяви спря да се отваря. Cloudflare показваше на посетителите грешка 524, сървърът отнемаше от две до шест минути за страница, а ние не получихме никаква информация в продължение на около десет часа. Причината беше скрейпер, минаващ през резидентни прокси с около 225 заявки в секунда.

Формата на наводнението

Всяка страница се рендираше за всяка заявка, затова всеки worker зареждаше стотици рендери и достигаше лимита си за CPU.

Защо лимитите по адрес не помогнаха

Ограничението на честотата брои заявките по адрес. При една до три заявки от всеки от хилядите адреси нито един адрес не се доближава до лимита. Блокирането на държави би блокирало нашите посетители. Онова, което скрейпърът не можеше евтино да имитира, беше да се държи като браузър, който вече е бил на сайта.

На ръба на Cloudflare: три безплатни правила

Безплатният план позволява пет персонализирани WAF правила на зона. Използвахме три, всички с управлявано предизвикателство вместо блокиране, така че човек, хванат погрешка, да премине с клик:

И трите пропускат проверените ботове на 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 уеб приложения.

Обновено: