Voltar para blog

Resolvendo conflitos de configuração no Exim e SpamAssassin (IPv4 vs IPv6)

18/01/2026 · 2 min · E-mail

Compartilhar

Incidentes de e-mail em produção frequentemente vêm em cascata: você corrige um erro de sintaxe e logo aparece um erro de fluxo. Neste caso, foi exatamente isso: primeiro o Exim não subia por configuração duplicada; depois, com Exim no ar, o anti-spam passou a falhar por mismatch IPv4/IPv6.

1) Falha inicial: Exim abortando no start

Erro observado:

Exim configuration error in line 3 of /etc/exim.variables.conf:
"av_scanner" option set for the second time

1.1 Diagnóstico de configuração

grep -n "^av_scanner" /etc/exim.variables.conf
exim -bV | head -n 20
exim -bP av_scanner 2>/dev/null

Se existirem duas declarações da mesma diretiva, o parser aborta.

1.2 Correção aplicada

  1. editar /etc/exim.variables.conf;
  2. manter apenas uma ocorrência de av_scanner;
  3. validar sintaxe e reiniciar serviço.
exim -bV >/dev/null
systemctl restart exim
systemctl status exim --no-pager

2) Segunda falha: anti-spam recusando conexão local

Após Exim voltar, apareceram eventos na fila e log:

spamc[...] connect to spamd on ::1 failed: Connection refused

Isso aponta para mismatch de pilha de rede:

2.1 Prova técnica da causa raiz

ss -lntp | grep 783
# ou
netstat -lnpt | grep 783

Saída típica do problema:

tcp  LISTEN 0 128 127.0.0.1:783  0.0.0.0:*  users:(("spamd",pid=...))

Sem bind em ::1, toda chamada IPv6 local falha.

3) Correção funcional no Exim (forçando spamc em IPv4)

No exim.conf, ajuste do filtro de transporte:

transport_filter = /usr/bin/spamc -d 127.0.0.1 -u ${lookup{$domain}lsearch*{/etc/virtual/domainowners}{$value}}

Valide a linha após edição:

grep -n "transport_filter.*spamc" /etc/exim.conf

Recarregue Exim e teste fila:

systemctl restart exim
exim -qff

4) Persistência da correção em DirectAdmin

Editar /etc/exim.conf direto não é suficiente em ambientes com CustomBuild. Atualização/rebuild pode sobrescrever.

4.1 Aplicação correta via template custom

mkdir -p /usr/local/directadmin/custombuild/custom/exim/conf
cp /etc/exim.conf /usr/local/directadmin/custombuild/custom/exim/conf/exim.conf

Se usar CustomBuild para regenerar:

cd /usr/local/directadmin/custombuild
./build exim_conf
./build exim
systemctl restart exim

5) Validação pós-correção (aceite operacional)

  1. Exim sobe sem erro de parser.
  2. spamc não apresenta Connection refused em ::1.
  3. fila processa normalmente sem retenção por antispam local.
  4. ajuste persiste após ciclo de build/update do DirectAdmin.

Comandos de checagem:

tail -f /var/log/exim/mainlog | egrep -i "spamc|spamd|refused|error"
exim -bp | head -n 40

6) Lições operacionais

  1. Sempre resolver erro de parser primeiro, sem “pular etapa”.
  2. Em fluxo Exim + SpamAssassin, valide loopback (IPv4/IPv6) explicitamente.
  3. Em DirectAdmin, toda correção crítica precisa entrar no template custom.

Esse incidente só fechou quando tratei sintaxe, rede local e persistência ao mesmo tempo. Corrigir um ponto isolado não estabiliza MTA em produção.

CC BY-NC

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.