Voltar para blog

Gerenciamento e limpeza de fila no Exim (MTA) com abordagem forense e segura

08/09/2025 · 3 min · Email

Compartilhar

Fila alta no Exim não é só problema de volume. Pode ser indício de conta comprometida, script malicioso, destino recusando autenticação ou degradação de reputação do IP.

Neste runbook, o foco é: investigar primeiro, remover depois. Isso evita apagar mensagem legítima no pânico e preserva evidência para correção definitiva.

0) Erro conceitual que derruba troubleshooting

Muita gente tenta operar a fila por endereço e tropeça logo no início.

Exemplo clássico (incorreto):

exim -Mvh silvana@domain.com

Os comandos -Mvh, -Mvb e -Mrm não aceitam endereço. Eles exigem Message-ID (ex.: 1tXyZ-0004p-2A).

Por isso o exiqgrep é a ponte certa entre e-mail e ID:

Sem o -i, a saída vem com metadados extras e quebra automação por pipe.

1) Triagem inicial da fila

1.1 Volume e estado geral

exim -bp
exim -bp | exiqsumm

1.2 Quantidade total de mensagens

exim -bpc

1.3 Separar mensagens congeladas

exiqgrep -z -i

Se a fila tem muito frozen , geralmente há bounce loop, destino inexistente ou envio abusivo bloqueado repetidamente.

2) Inspeção forense por ID antes de remover

Com ID da mensagem:

exim -Mvh ID_DA_MENSAGEM   # headers
exim -Mvb ID_DA_MENSAGEM   # body
exim -Mvl ID_DA_MENSAGEM   # log detalhado da mensagem

Pontos que eu sempre valido:

  1. remetente real (Return-Path e From);
  2. rota (Received) e host de origem;
  3. motivo da retenção (timeout, auth fail, SPF, RBL, quota, destino inválido);
  4. padrão repetitivo em múltiplas mensagens.

3) Limpeza seletiva (cirúrgica)

3.1 Remover por remetente

exiqgrep -i -f 'user@domain.com' | xargs -r exim -Mrm

3.2 Remover por destinatário

exiqgrep -i -r 'target@otherdomain.com' | xargs -r exim -Mrm

3.3 Remover apenas congeladas

exiqgrep -z -i | xargs -r exim -Mrm

3.4 Reprocessar fila sem remover (quando necessário)

exim -qff

3.5 Limpeza por idade (bounce eterno / retry antigo)

Remover mensagens mais antigas que 7 dias (604800 segundos):

exiqgrep -i -o 604800 | xargs -r exim -Mrm

Esse filtro é útil quando há cauda antiga travando a operação, sem tocar em mensagens recentes ainda válidas.

3.6 Emergência total (somente quando validado)

Se fila estiver comprometida ao ponto de risco operacional:

exiqgrep -i | xargs -r exim -Mrm

Antes da execução, rode:

exim -bp | exiqsumm

para confirmar volume por domínio e evitar apagar tráfego legítimo por impulso.

4) Padrões de incidente que encontrei em produção

  1. Plugin WordPress comprometido disparando spam via mail().
  2. Conta SMTP vazada enviando por script externo.
  3. Destino bloqueando por RBL e acumulando retry.
  4. Domínio com DNS quebrado causando defers contínuos.

Comandos de apoio para investigação:

grep -i "cwd=/home" /var/log/exim_mainlog | tail -n 200
grep -i "A=dovecot_login" /var/log/exim_mainlog | tail -n 200
grep -i "rejected\|blacklist\|spam" /var/log/exim_mainlog | tail -n 200
grep 'silvana@domain.com' /var/log/exim_mainlog | tail -n 20

5) Prevenção de recorrência no WHM/cPanel

5.1 Limite por domínio (global)

5.2 Limite por conta

5.3 Sinais de hardening que implementei

6) Checklist pós-incidente (aceite)

  1. fila estabilizada abaixo do baseline definido;
  2. sem crescimento anômalo por 24h;
  3. origem do abuso identificada e bloqueada;
  4. limites de envio aplicados;
  5. reputação do IP monitorada em RBLs.

Gerenciar fila Exim em produção não é comando único de limpeza. É processo de triagem, evidência, ação seletiva e prevenção. Esse método reduz reincidência e preserva entregabilidade dos e-mails legítimos.

CC BY-NC

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.