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 [email protected]
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:
- destinatário:
exiqgrep -i -r [email protected] - remetente:
exiqgrep -i -f [email protected]
Sem o -i, a saída vem com metadados extras e quebra automação por pipe.
1) Triagem inicial da fila e auditoria de logs#
A triagem inicial permite obter uma visão sistêmica sobre o estado de congestionamento do servidor.
1.1 volume e estado geral#
Para inspecionar o estado geral da fila em tempo real:
exim -bp
exim -bp | exiqsumm
1.2 quantidade total de mensagens#
Para contar rapidamente as mensagens spooled:
exim -bpc
1.3 separar mensagens congeladas#
Mensagens que falharam seguidamente nas tentativas de retransmissão entram em estado frozen:
exiqgrep -z -i
Se a fila tem muito frozen , geralmente há bounce loop, destino inexistente ou envio abusivo bloqueado repetidamente.
1.4 verificação e análise detalhada de logs#
Para realizar um diagnóstico aprofundado do fluxo de e-mails em exim_mainlog:
- Mensagens por status: Listar quantidade de mensagens em cada status da fila:
exim -bp | awk '{print $1}' | sort | uniq -c | sort -rn
- Mensagens congeladas (frozen) totais:
exiqgrep -z -i | wc -l
- Mensagens muito antigas na fila: Identificar mensagens retidas há mais de 7 dias (604800 segundos):
exiqgrep -i -o 604800 | wc -l
- Mensagens por domínio de destino: Classificar os domínios acumulados na fila:
exim -bp | grep -oP '(?<=for )\S+' | sort | uniq -c | sort -rn | head -10
2) Inspeção forense por ID antes de remover#
Com o Message-ID da mensagem em mãos, é possível inspecionar seu conteúdo detalhadamente:
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:
- remetente real (
Return-PatheFrom); - rota (
Received) e host de origem; - motivo da retenção (timeout, auth fail, SPF, RBL, quota, destino inválido);
- padrão repetitivo em múltiplas mensagens.
2.1) Varredura de DNS e reputação#
Mensagens presas na fila por falhas de entrega de rede exigem uma auditoria no DNS dos domínios destino para descartar bloqueios ou configurações incompletas:
- Resolução de Registros MX:
dig MX dominio.com +short
- Verificação de Registros SPF:
dig TXT dominio.com | grep -i "v=spf1"
- Verificação de Registros DMARC:
dig TXT _dmarc.dominio.com
2.2) Auditoria de RBL (listas de bloqueio)#
Verifique se o endereço IP do seu servidor foi inserido em listas de reputação públicas de spam (RBLs):
- Checar RBLs via comando dig:
for rbl in zen.spamhaus.org bl.spamcop.net; do
result=$(dig +short 4.3.2.1.$rbl) # Substitua 4.3.2.1 pelo IP invertido do seu host
if [ -n "$result" ]; then
echo "LISTADO na RBL $rbl: $result"
fi
done
- Checagem de Reputação Online (API MXToolbox):
curl -s "https://mxtoolbox.com/api/v1/lookup/blacklists/1.2.3.4" | jq .
3) Limpeza seletiva (cirúrgica) com backup prévio#
3.1) Backups preventivos da fila e dados específicos#
Antes de executar qualquer comando de limpeza ou expurgo, é de extrema importância exportar os estados da fila atual em exim-queue-backup.txt e criar um backup estruturado dos e-mails suspeitos em emails-from-spammer.txt:
- Backup Geral da Fila:
exim -bp > /root/exim-queue-backup-$(date +%Y%m%d).txt
- Backup de Mensagens de um Remetente Específico:
exiqgrep -i -f '[email protected]' > /root/emails-from-spammer.txt
- Verificar Volume da Fila antes de Limpar:
exim -bp | exiqsumm
3.2 remover por remetente#
exiqgrep -i -f '[email protected]' | xargs -r exim -Mrm
3.3 remover por destinatário#
exiqgrep -i -r '[email protected]' | xargs -r exim -Mrm
3.4 remover apenas congeladas#
exiqgrep -z -i | xargs -r exim -Mrm
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
Rode sempre exim -bp | exiqsumm antes para confirmar volume por domínio e evitar apagar tráfego legítimo por impulso.
3.7 reprocessar fila sem remover#
exim -qff
4) Pós-limpeza e validação do ambiente#
Com a fila reprocessada e limpa, valide as condições do ecossistema do Exim.
4.1) Confirmação da limpeza e monitoramento imediato#
Confirme que os comandos de expurgo surtiram efeito e a fila retornou a níveis aceitáveis:
- Quantidade Pós-Limpeza:
exim -bpc
- Contar Mensagens Congeladas Restantes:
exiqgrep -z -i | wc -l
- Filtrar Logs em
exim_mainlogpor Erros Recentes:
tail -50 /var/log/exim_mainlog | grep -iE "error|fail"
- Monitorar Fila Ativamente:
watch -n 60 "exim -bpc"
4.2) Verificação de autenticação SMTP e abusos#
Investigue se há indícios de contas de e-mail vazadas que estejam enviando spam autenticado:
- Tentativas Falhas de Autenticação:
grep -iE "auth|login|failed" /var/log/exim_mainlog | tail -n 20
- Volume de Falhas de Autenticação (Ataques Força Bruta):
grep -c "auth fail" /var/log/exim_mainlog
- Contas SMTP mais Ativas:
grep "A=dovecot_login" /var/log/exim_mainlog | awk '{print $6}' | sort | uniq -c | sort -rn | head -n 20
4.3) Verificação de rate limiting#
Confirme a aplicação e as configurações das regras de limitação de envio ativas no MTA:
- Verificar Limites Globais de Recipients configurados no Exim:
exim -bP max_rcpt
exim -bP max_held_timeout
- Mensagens Acumuladas por Remetente:
exim -bp | grep -oP '(?<=<= )\S+' | sort | uniq -c | sort -rn | head -10
5) Prevenção de recorrência no WHM/cPanel e políticas de rate limit#
5.1) Configuração de limites no painel#
Para evitar recorrência de filas cheias por spammers, defina limites rígidos nos painéis administrativos do WHM ou injete regras diretamente no arquivo de configuração do Exim em exim.conf:
- WHM global:
WHM > Tweak Settings > Mail > Max hourly emails per domain(definir limite recomendado de 200). - WHM por conta:
WHM > Modify an Account > Resource Limits > Maximum Hourly Email by Domain Relayed(definir limite recomendado de 100). - Injeção de ACL de Limite Customizado no
exim.conf:
acl_smtp_rcpt:
accept
condition = ${if >{${extract{1}{:}{${readfile{/etc/virtual/domain.com_max}}}}{0}}
# Código adicional de validação de limite
5.2) Implementação de monitoramento contínuo#
Crie o script de alerta automático em check-exim-queue.sh:
cat > /usr/local/bin/check-exim-queue.sh << 'EOF'
#!/bin/bash
QUEUE_SIZE=$(exim -bpc)
THRESHOLD=100
if [ "$QUEUE_SIZE" -gt "$THRESHOLD" ]; then
echo "ALERTA: Fila Exim com $QUEUE_SIZE mensagens detectadas no servidor." | \
mail -s "Exim Queue Alert" [email protected]
fi
EOF
chmod +x /usr/local/bin/check-exim-queue.sh
Agende no cron do root para executar a cada 5 minutos:
echo "*/5 * * * * /usr/local/bin/check-exim-queue.sh" | crontab -
5.3) Verificação de segurança de scripts e credenciais#
Para neutralizar abusos originados de scripts PHP locais que ignoram SMTP e enviam e-mails com a função mail():
- Achar Remetentes mais Comuns via Fila:
exim -bp | grep -oP '(?<=<= )\S+' | sort | uniq -c | sort -rn | head -10
- Localizar Scripts PHP Modificados recentemente que chamam mail():
find /home -name "*.php" -newer /var/log/exim_mainlog -exec grep -l "mail\|smtp" {} \;
6) Checklist de limpeza e matriz de riscos#
Checklist operacional de limpeza de fila#
- [ ] Fase 1: Diagnóstico de Volume
- [ ] Contar volume total com
exim -bpc. - [ ] Classificar domínios acumulados via
exim -bp | exiqsumm. - [ ] Verificar volume de mensagens congeladas.
- [ ] Fase 2: Investigação Forense
- [ ] Inspecionar cabeçalhos com
exim -Mvhde IDs aleatórios. - [ ] Identificar rotas e scripts causadores de spam.
- [ ] Auditar logins SMTP em
exim_mainlog. - [ ] Fase 3: Backup de Emergência
- [ ] Exportar estado geral em
exim-queue-backup.txt. - [ ] Realizar backup isolado de e-mails suspeitos.
- [ ] Fase 4: Expurgo Cirúrgico
- [ ] Executar limpeza de IDs por remetentes ou frozen.
- [ ] Tratar mensagens antigas (> 7 dias) da fila.
- [ ] Fase 5: Validação Pós-Limpeza
- [ ] Verificar retorno a níveis saudáveis da fila.
- [ ] Auditar se novas mensagens continuam congelando.
- [ ] Fase 6: Medidas Preventivas
- [ ] Configurar limites horários no WHM.
- [ ] Ativar script de alerta
check-exim-queue.shno cron. - [ ] Saneamento de scripts e credenciais vazadas.
Matriz de riscos operacionais de fila#
| Incidente / Risco | Severidade | Impacto | Ação de Mitigação Implementada | |
|---|---|---|---|---|
| Limpeza de Legítimos | Crítica | Expurgo indesejado de e-mails comerciais. | Backup integral da fila com redirecionamento de logs e `exim -bp | exiqsumm` antes da limpeza. |
| Vazamento de SMTP | Alta | Uso de contas autenticadas para spam global. | Auditoria de login no log, rotação de senhas SMTP e bloqueio de usuários. | |
| Spam por Script PHP | Alta | Bloqueio de IP por chamadas direct mail. | Rastrear scripts modificados usando find acoplado com varredura de strings mail. | |
| Bloqueio em RBL | Alta | Falha de entrega geral dos e-mails legítimos. | Configuração e testes de queries RBL usando DNS locais (Spamhaus/Spamcop). | |
| Bounce Loop | Média | Retenções excessivas de bounces congelados. | Limpeza direcionada das mensagens congeladas da fila com exiqgrep -z. |
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.
Este artigo foi útil?
Deixe uma reação rápida para apoiar o conteúdo:
Este post está licenciado sob CC BY-NC.



Comentários
Participe da discussão abaixo.
0 comentários