Como determinar (e bloquear) endereços IP de scrapers / bots através do CloudFlare no Discourse?

Tenho um cenário em que mais de 13.000 rastreadores foram detectados e o tráfego do banco de dados disparou. Alguém está claramente fazendo scraping do nosso fórum, mas não tenho certeza de como identificar o IP e tomar medidas contra ele, já que o tráfego está passando pelo DNS da CloudFlare.

Alguma sugestão sobre como fazer isso?

Gostaria de configurar uma solução automática de limitação de taxa que detectasse comportamento agressivo de rede e, em seguida, aplicasse limitação de taxa ou desabilitasse o acesso por um período de tempo.

Você tem o modelo do Cloudflare no seu arquivo de configuração yml?

Sim, isso está em /var/discourse/containers/app.yml:

  - "templates/cloudflare.template.yml"

Devo mencionar que estou realmente batendo em um muro: estou vendo o acesso ao banco de dados (que utilizo em outro servidor de banco de dados no mesmo site) constantemente entre 13 e 20 Mbps, e houve um pico quando o número de rastreadores disparou, sem que isso se estabilizasse há quase duas semanas. O painel de controle do servidor está mostrando que o tráfego atingiu níveis absurdos exatamente nesse período e não diminuiu desse nível de acesso constante, chegando a indicar que os servidores podem ficar sem banda se isso continuar.

Você tem o modelo de limitação de taxa incluído? Você vê os números de IP corretos nos logs (não os IPs do Cloudflare)?

Eu também tenho isso no app.yml:

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

Também vejo os endereços IP corretos dos usuários — não tenho certeza do que você quer dizer com os logs. Hmm.

Como você deve lembrar, eu pensei em tentar conter o consumo de banda neste momento, alterando tudo para usar endereços IP privados internos, já que isso, ao menos, me impediria de receber algumas contas elevadas.

Percebi algo mais peculiar aqui. Alterei a conexão do banco de dados do IP público para o IP privado, a fim de não esgotar tão rapidamente a cota de transferência mensal. No servidor de banco de dados, eu esperava ver apenas conexões feitas via IP privado a partir do servidor Docker do Discourse. De fato, vejo tráfego vindo do IP privado local agora, mas ainda vejo quantidades desproporcionais de tráfego vindo do IP público, consumindo rapidamente a cota mensal.

Procurei exaustivamente tanto pelo endereço IP público quanto pelo nome de host do servidor de banco de dados no servidor Docker do Discourse, mas não os encontrei em lugar nenhum. Mesmo entrando no aplicativo (./launcher enter app) e executando env | grep DB, vejo o endereço IP PRIVADO correto sendo usado para a LAN aqui. Posso fazer um grep no sistema de arquivos e simplesmente não vejo as ocorrências que esperaria.

Alguma ideia de como o Discourse ou a imagem do Docker ainda podem estar acessando o IP errado? Simplesmente não consigo entender de onde todo esse tráfego de IP público está surgindo no servidor do Discourse.