Nginx Rate Limiting, Microcaching e Bot Tarpits: Como Travar Bots e Scrapers no HestiaCP

Nginx Rate Limiting, Microcaching e Bot Tarpits: Como Travar Bots e Scrapers no HestiaCP

O Custo Desigual dos Pedidos Web: Borda vs. Aplicação Interna

Em qualquer arquitetura web moderna, servir um ficheiro estático a partir da memória RAM demora frações de microssegundo ao processador. No entanto, quando um pedido dinâmico bate no teu servidor—como uma consulta pesada à base de dados, a validação de uma password com bcrypt ou uma chamada de API—a tua máquina gasta centenas de milissegundos e vários megabytes de memória RAM por cada ligação.

Esta diferença brutal é a arma favorita de redes de bots e scrapers automatizados. Um atacante consegue disparar milhares de tentativas de login por segundo usando quase nenhuma largura de banda. Se o teu servidor web deixar passar esse tráfego diretamente para os processos de backend (como PHP-FPM ou Node.js), a tua base de dados esgota as ligações abertas, os processadores chegam aos 100% de uso e os teus clientes reais deparam-se com erros de HTTP 504 Gateway Timeout.

BACKEND DESPROTEGIDO VS. REVERSE PROXY NGINX BLINDADO

  • CENÁRIO SEM PROTEÇÃO (TODOS OS PEDIDOS CHEGAM AO BACKEND): [2.000 Pedidos de Bots/s] → [ Nginx ] → [ Processos PHP/Node + Base de Dados ]
  • (Servidor Encrava com 100% CPU)
  • Queda Total: HTTP 504 Gateway Timeout
  • CENÁRIO BLINDADO (RATE LIMITING + TARPITS NA BORDA): [2.000 Pedidos de Bots/s] → [ Filtro Leaky Bucket no Nginx ]
  • Procura de Vulnerabilidades → [ Tarpit: 50 bytes/s ]
  • Picos Abusivos por IP → [ HTTP 429 Bloqueio ]
  • Utilizadores Legítimos → [ Resposta Instantânea ]

Se geres servidores com HestiaCP sobre Debian, o Nginx atua como o teu primeiro ponto de contacto com o mundo exterior. Ao configurares rate limiting inteligente, microcache e armadilhas (tarpits), transformas o teu servidor numa fortaleza impenetrável. Na Webxtek, desenhamos arquiteturas que absorvem qualquer ataque na borda antes que o teu código interno sinta a pressão.


Algoritmo Leaky Bucket no Nginx: Zonas, Bursts e Nodelay

O rate limiting no Nginx assenta no princípio do balde furado (leaky bucket). Imagina um balde com um pequeno orifício no fundo por onde a água sai a uma cadência fixa. Os pedidos entram pelo topo do balde. Se a água entrar mais depressa do que consegue sair, o nível sobe. Quando o balde atinge a capacidade máxima, a água transborda e os novos pedidos são imediatamente descartados.

No Nginx, configuras isto através da diretiva limit_req_zone (que reserva uma zona de memória partilhada) e da diretiva limit_req (que aplica a regra a uma rota específica).

O FUNCIONAMENTO DO LEAKY BUCKET NO NGINX

  • Pedidos dos Clientes a Baterem no Servidor
  • Zona de Memória do Nginx: cadência de 5 pedidos/s
  • Pedido 1: [ Pedido 2 ] [ Pedido 3 ] (Dentro da Fila)
  • Capacidade de Tolerância (Burst Buffer): burst=10
  • Pedidos Excessivos > Limite Pedidos Dentro da Cadência
  • Erro HTTP 429 Imediato: [ Enviados para a Aplicação ]

Adiciona estas definições ao ficheiro /etc/nginx/nginx.conf dentro do bloco http:

# Cria zonas de rastreio de IPs em memória partilhada (10MB guarda ~160.000 IPs)
limit_req_zone $binary_remote_addr zone=limite_geral:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=limite_login:10m rate=1r/s;

# Código de resposta devolvido a quem exceder os limites
limit_req_status 429;

No ficheiro de configuração do teu website ou no modelo do HestiaCP, protege os pontos de autenticação críticos:

# Proteção rígida do formulário de login
location = /api/v1/auth/login {
    # Permite pequenos picos de 3 pedidos mas processa sem atrasos artificiais
    limit_req zone=limite_login burst=3 nodelay;

    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

Com esta regra, qualquer bot que tente adivinhar credenciais de utilizadores fica limitado a um único pedido por segundo, enquanto um utilizador humano consegue submeter o formulário sem qualquer atrito.


Microcaching: O Segredo de Guardar Dados Dinâmicos Durante 1 Segundo

O microcaching consiste em guardar a resposta dinâmica de uma página durante uma janela temporal minúscula—tipicamente entre um e dois segundos. Para um utilizador normal a navegar no teu site, um segundo de cache é impercetível. Mas para o teu servidor, faz toda a diferença entre continuar a funcionar ou deitar-se abaixo.

Se um scraper disparar 500 pedidos à tua página inicial no mesmo segundo, o Nginx executa a tua aplicação exatamente uma vez. Os restantes 499 pedidos são servidos diretamente da memória RAM em 0,2 milissegundos, sem incomodar o motor PHP ou Node.js.

# Reserva espaço em memória RAM para o microcache
proxy_cache_path /var/cache/nginx/micro levels=1:2 keys_zone=MICROCACHE:10m max_size=256m inactive=10m;

server {
    server_name oteusite.com;

    set $ignorar_cache 0;

    # Não faz cache de pedidos POST ou sessões autenticadas
    if ($request_method = POST) { set $ignorar_cache 1; }
    if ($http_cookie ~* "sessao_utilizador|token_login|wordpress_logged_in") { set $ignorar_cache 1; }

    location / {
        proxy_cache MICROCACHE;
        proxy_cache_valid 200 301 302 1s;
        proxy_cache_valid 404 10s;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_bypass $ignorar_cache;
        proxy_no_cache $ignorar_cache;

        add_header X-Cache-Status $upstream_cache_status;

        proxy_pass http://127.0.0.1:8080;
    }
}

Quando desenvolvemos websites de alta performance, aplicamos microcaching para assegurar que as páginas carregam com tempos de resposta imediatos, independentemente de picos imprevistos de visitas.


Bot Tarpits: Como Esgotar a Concorrência de Scrapers Hostis

Em vez de devolveres imediatamente um erro 403 que avisa o bot para mudar de IP, podes usar uma armadilha conhecida como tarpit. Um tarpit aceita a ligação TCP do invasor, envia os cabeçalhos normais e depois começa a transmitir o conteúdo da página a uma velocidade desesperadamente lenta (ex: 50 bytes por segundo).

Como o script do atacante fica à espera que a transferência termine, as ligações abertas dele esgotam-se e o bot fica encravado durante minutos sem causar qualquer peso ao teu servidor.

FUNCIONAMENTO DE UM BOT TARPIT NO NGINX

  • Script do Invasor (Tem 100 ligações simultâneas disponíveis)
  • Tenta Aceder a Rotas Suspeitas (/wp-login.php, /.env, /xmlrpc.php)
  • Bloco de Tarpit no Nginx do Teu Servidor
  • limit_rate 50 (Transmite apenas 50 bytes por segundo)
  • O Bot Fica Preso durante 300 Segundos à Espera da Resposta!: (As Ligações do Invasor Ficam Esgotadas; O Teu Servidor Continua com 0% de Carga)

Configura o teu tarpit diretamente no Nginx:

# Captura bots à procura de vulnerabilidades antigas
location ~* ^/(wp-login\.php|\.env|\.git|xmlrpc\.php|phpmyadmin) {
    # Limita a largura de banda a uns escassos 50 bytes por segundo
    limit_rate 50;

    default_type text/plain;
    return 200 "Armadilha ativada. Ligação retida por comportamento suspeito.\n";
}

Esta técnica consome o tempo e os recursos do atacante sem te custar praticamente nada em termos de processamento.


Personalizar Modelos no HestiaCP sem Perder Alterações

No painel HestiaCP, nunca deves alterar diretamente os ficheiros em /etc/nginx/conf.d/domains/, porque o painel substitui essas alterações sempre que renova um certificado SSL.

Para que a tua blindagem seja definitiva, deves criar modelos próprios:

# Vai à pasta de modelos do HestiaCP
cd /usr/local/hestia/data/templates/web/nginx/

# Duplica o modelo padrão para criares uma versão blindada
cp default.tpl blindado.tpl
cp default.stpl blindado.stpl

# Edita o ficheiro blindado.stpl e insere as regras de rate limiting e microcache
nano blindado.stpl

# Aplica o novo modelo ao teu domínio através da CLI do Hestia
v-change-web-domain-tpl admin oteusite.com blindado
v-restart-web

Seguindo as recomendações de segurança da OWASP e combinando este nível de personalização com os nossos planos de alojamento gerido e manutenção contínua de sistemas, garantes que os teus nós Linux mantêm máxima resiliência e estabilidade contra qualquer ameaça na Internet.

Na prática, aplicas exatamente estes padrões operacionais em setores exigentes como cibersegurança b2b e inteligência corporativa e cibersegurança. Quando alinhas a tua estrutura através de websites de alta performance e alojamento gerido para websites e aplicações, transformas boas práticas técnicas numa vantagem competitiva real e mensurável para o teu negócio.

[+] [ INDEX_DIRECTORY ] 13 tópicos ▼
[ SYSTEM.FAQ ]

Perguntas Frequentes

Como é que o algoritmo leaky bucket do Nginx controla o tráfego abusivo?

O Nginx guarda o ritmo de pedidos por IP numa zona de memória partilhada. Pedidos que ultrapassem a cadência definida entram numa fila temporária ou recebem um erro HTTP 429 se a fila encher.

O que é o microcaching e porque impede que a tua aplicação encrave com picos?

O microcaching guarda em memória a resposta dinâmica do servidor durante 1 a 5 segundos. Em picos repentinos de tráfego, centenas de pedidos são respondidos da RAM sem sobrecarregar a base de dados.

O que é um bot tarpit e como neutraliza scrapers maliciosos?

Um tarpit atrasa deliberadamente a resposta a bots, transmitindo dados a uma velocidade microscópica (ex: 50 bytes/s). Isto esgota as ligações do atacante sem gastar recursos do teu servidor.

Como podes alterar modelos do Nginx no HestiaCP sem perderes as mudanças?

Deves duplicar os modelos em /usr/local/hestia/data/templates/web/nginx/ com um nome novo (ex: blindado.tpl e blindado.stpl) e associá-los ao teu domínio através do painel ou da linha de comandos.

> INICIAR_PROJETO

Precisa de um website que transmita confiança, apareça na pesquisa e dê mais força à sua presença digital? Comece a conversa aqui.