Как определить (и заблокировать) IP-адреса скраперов/ботов через CloudFlare на Discourse?

У меня возникла ситуация: обнаружено более 13 000 краулеров, а трафик базы данных вырос до небес. Очевидно, что кто-то парсит наш форум, но я не уверен, как определить IP-адрес и предпринять меры, поскольку запросы идут через DNS CloudFlare.

Есть ли у кого-то идеи, как это сделать?

Я хотел бы настроить автоматическое решение для ограничения скорости, которое будет выявлять агрессивное сетевое поведение, а затем либо ограничивать скорость для таких клиентов, либо отключать их на определённый период времени.

Есть ли в вашем конфигурационном файле YML шаблон Cloudflare?

Да, это находится в /var/discourse/containers/app.yml:

  - "templates/cloudflare.template.yml"

Я должен упомянуть, что у меня возникла серьёзная проблема: доступ к базе данных (я использую отдельный сервер БД на том же сайте) постоянно находится в диапазоне 13–20 Мбит/с. Скорость резко возросла, когда количество краулеров достигло пика, и с тех пор уже почти две недели не снижается. Панель управления сервером показывает, что трафик в это же время вырос до абсурдных значений и не возвращается к норме. Если такая ситуация сохранится, серверы могут исчерпать доступную полосу пропускания.

Включен ли у вас шаблон ограничения скорости? Видите ли вы в логах правильные IP-адреса (не IP-адреса Cloudflare)?

У меня в app.yml тоже есть это:

  - "templates/web.ratelimited.template.yml"

Я также вижу правильные IP-адреса пользователей — не совсем понимаю, что вы имеете в виду под логами. Хм.

Как вы, возможно, помните, я подумывал о том, чтобы в данный момент сократить потребление трафика, просто изменив всё так, чтобы использовались внутренние приватные IP-адреса, поскольку это хотя бы остановит получение мною крупных счетов.

Я также заметил кое-что ещё необычное. Я изменил подключение к базе данных с публичного IP-адреса на приватный, чтобы не так быстро расходовать месячное квоту на передачу данных, но на сервере базы данных я ожидал видеть только подключения, осуществляемые с приватного IP-адреса от сервера Discourse в Docker. Сейчас я действительно вижу трафик с локального приватного IP-адреса, но всё ещё наблюдаю несоразмерно большое количество трафика, поступающего с публичного IP-адреса, из-за чего месячная квота всё ещё быстро расходуется.

Я искал и искал как публичный IP-адрес, так и имя хоста сервера базы данных на сервере Discourse в Docker, но нигде не мог их найти. Даже если я захожу в приложение (./launcher enter app) и выполняю команду env | grep DB, я вижу правильный ПРИВАТНЫЙ IP-адрес для используемой здесь локальной сети. Я могу выполнить поиск через файловую систему, но просто не нахожу тех вхождений, которые ожидал бы увидеть.

Есть ли у вас какие-либо идеи, почему Discourse или образ Docker всё ещё могут обращаться к неправильному IP-адресу? Я просто не могу понять, откуда на сервере Discourse берётся весь этот трафик с публичного IP-адреса.