Нашествие скраперов на бесплатном тарифе Cloudflare: что его остановило и что мы оставили выключенным

Операции

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

Форма нашествия

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

Почему лимиты на адрес не помогли

Rate limit считает запросы на адрес. При одном-трех запросах с каждого из тысяч адресов ни один адрес не приближается к лимиту. Блокировка стран отсекла бы наших посетителей. То, что скрапер не мог дешево подделать, — это поведение браузера, который уже бывал на сайте.

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

Бесплатный тариф позволяет использовать пять пользовательских правил WAF на зону. Мы использовали три, все с managed challenge вместо блокировки, чтобы человек, попавший под правило по ошибке, мог пройти проверку:

Все три пропускают проверенных ботов Cloudflare, пользовательские агенты, называющие себя роботами, наши собственные адреса, пути API и вебхуков, а также файлы, не являющиеся страницами. Спустя два дня поток не прекращался: за один час правило для фейковых браузеров отправило на проверку более 10 000 запросов. 10 000 событий, возвращаемых Cloudflare за один запрос, пришли с 9 627 адресов, ни с одного из них не было больше 4.

На исходном сервере: шлюз в приложении

Безголовая половина имеет полные заголовки браузера, поэтому только правил на уровне edge недостаточно, пока аварийное правило выключено. В самом приложении мы поставили небольшой middleware перед рендерером страниц:

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

Что мы оставили выключенным

Главный вывод

Поток через резидентные прокси легко распознать по отсутствующим элементам: заголовкам fetch браузера, cookie и Referer. Проверяйте это на уровне edge, ограничивайте незнакомцев тем, что могут отрендерить ваши воркеры, и убедитесь, что что-то вне сервера замечает, когда страница перестает открываться. Night Watch упаковывает все три компонента: watchdog, правила с автоматическим переключением для аварийного и шлюз для веб-приложений на Python.

Обновлено: