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, comreason_codeprivate_range,ssh_session_activeouown_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.