Потік скрейперів на безкоштовному тарифі Cloudflare: що його зупинило і що ми залишили вимкненим

Операції

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

Форма потоку

Кожна сторінка рендерилася для кожного запиту, тому кожен воркер ставив у чергу сотні рендерів і впирався в ліміт CPU.

Чому ліміти на адресу не допомогли

Обмеження частоти рахує запити з однієї адреси. Якщо з тисяч адрес надходить по одному-три запити, жодна окрема адреса ніколи не наближається до ліміту. Блокування країн заблокувало б наших відвідувачів. Те, що скрейпер не міг дешево підробити, — це поведінка браузера, який уже був на сайті.

На межі Cloudflare: три безкоштовні правила

Безкоштовний тариф дозволяє п'ять власних правил WAF на зону. Ми використали три, усі з керованим викликом (managed challenge), а не блокуванням, щоб людина, яка потрапила під правило помилково, могла пройти далі:

Усі три пропускають верифікованих ботів Cloudflare, user agent, що називають себе роботами, наші власні адреси, шляхи API та webhook, а також файли, які не є сторінками. Через два дні потік усе ще тривав: за одну годину правило фейкових браузерів поставило під сумнів понад 10 000 запитів. 10 000 подій, які повертає Cloudflare на запит, надійшли з 9 627 адрес, жодна з яких не мала більше 4.

На початковому сервері: шлюз у застосунку

Безголовна частина має повні заголовки браузера, тому лише крайові правила не зупиняють її, коли аварійне правило вимкнене. В самому застосунку ми поставили невеликий проміжний шар перед рендерером сторінок:

За першу хвилину шлюз відхилив близько 6 700 фейкових браузерів і відвернув близько 6 700 незнайомців, обслуговуючи незнайомців зі швидкістю близько 9 сторінок на секунду. Повільні запити впали до нуля, навантаження CPU воркерів знизилось з їхнього ліміту до 12–15 відсотків, а пам’ять — з 4–5 ГБ на кожен до 0,65 ГБ.

Що ми залишили вимкненим

Головний висновок

Потік через резидентні проксі легко впізнати за тим, чого бракує: заголовки browser fetch, cookies і Referer. Ставте під сумнів це на краю, тримайте незнайомців у межах того, що ваші воркери можуть відрендерити, і переконайтеся, що щось поза сервером помітить, коли сторінка перестане відкриватися. Night Watch пакує всі три: вартовий, правила з автоматичним перемиканням для аварійного та шлюз для Python-вебзастосунків.

Оновлено: