Mitigacao por IP

Limita UMA origem por um prazo, sem banir (v2.63.0+). Duas camadas, com uma lista so.

Uso

# L4 (firewall): conexoes TCP novas do IP, em todas as portas (inclusive container)
sudo implant rate-limit throttle 203.0.113.7 --tier strict --ttl 1h --reason "varredura"
sudo implant rate-limit unthrottle 203.0.113.7

# L7 (Traefik): requisicoes do IP num router, 429 acima da taxa, sem restart
sudo implant traefik-ratelimit throttle 203.0.113.7 --router app@docker --rate 10/s --ttl 30m
sudo implant traefik-ratelimit unthrottle l7-0123456789

implant mitigations list           # as duas camadas
sudo implant mitigations sweep     # expira as L7 vencidas (o timer faz a cada minuto)
L4 (rate-limit throttle) L7 (traefik-ratelimit throttle)
Limita conexoes TCP novas por segundo requisicoes por segundo ou minuto
Escopo o IP inteiro (INPUT e portas de container) um router
Taxa --tier light (20/s, burst 40) ou strict (3/s, burst 6) --rate N/s|N/m, --burst (padrao 2xN)
Prazo --ttl (ate 7d); o kernel expira; volta no boot --ttl (ate 7d); timer implant-mitigations (1 min e no boot)
Exige rate-limit aplicado file-provider em diretorio com watch: true e a API do Traefik

Com HTTP/2 e keep-alive um cliente faz muitas requisicoes numa conexao so: o L4 quase nao o sente. Para "N requisicoes por segundo", use o L7.

Opcoes comuns

Flag Descricao
--ttl Prazo: 30m, 1h, 3600. Obrigatorio, ate 7 dias
--reason Texto livre (quem pos, por que); aparece na lista
--origin console, manual (padrao) ou auto_ban
--router, --service No L4, so registro de onde veio a origem (para a lista)
--dry-run Mostra o que faria
--traefik, --for-container L7: qual Traefik, quando o host tem mais de um (v2.65.0+)

Como o L7 funciona

O implant cria um router-sombra (implant-thr-<id>@file) no arquivo implant-mitigations.yml do file-provider:

  • regra: a do router original && ClientIP(ip);
  • prioridade acima da original;
  • o mesmo servico, entrypoints e tls;
  • middlewares: o limite primeiro e depois os do router original. Autenticacao, cabecalhos e a guarda do traefik-edge continuam valendo para aquele IP.

O router original vem da API do Traefik (a porta e lida do entrypoint traefik da config estatica, em arquivo ou por argumentos). Depois de gravar, o implant confere na API que o router-sombra subiu; se o Traefik o recusar, o arquivo anterior volta.

Recusas

  • faixa privada, loopback ou reservada; faixa que cubra o IP de qualquer sessao SSH ativa no servidor; e os enderecos do proprio servidor (ip_protected, com reason_code private_range, ssh_session_active ou own_server_ip, v2.64.1+);
  • no L4, IP da whitelist do implant (ip_whitelisted) e host sem rate-limit (rate_limit_not_applied).

Com CDN ou proxy na frente, o IP visto e o do proxy: limita-lo limita todo mundo atras dele.

Auto-ban

Os DROPs do L4 caem numa chain propria e contam no sinal iptables_drops com peso 1/3: o IP ja esta mitigado, e so quem insiste muito vira ban. O 429 do L7 nao conta no traefik_http.

Saida JSON

Envelopes rate-limit.throttle|unthrottle|throttle-list, traefik-ratelimit.throttle|unthrottle|throttle-list, mitigations.list|sweep. Cada mitigacao:

Campo Significado
id l4-<ip> ou l7-<hex>
layer l4 ou l7
ip, family alvo e v4/v6
target router, service, entrypoints (L7); no L4, o router/servico registrado
limit tier (L4) ou rate/burst
created_at, expires_at, ttl_remaining_seconds prazo
reason, origin quem pos e por que
effective a camada confirmou (regras no kernel / router carregado no Traefik)

Falha: failure {code, reason, suggestions[]} e codigo de saida 1. Codigos: invalid_option, ip_protected, ip_whitelisted, rate_limit_not_applied, traefik_not_found, file_provider_missing, file_provider_single_file, file_provider_no_watch, traefik_api_unavailable, router_not_found, traefik_rejected.

Veja tambem