Resolvendo conflitos de configuração no Exim e SpamAssassin (ipv4 vs ipv6)
Voltar para blog

Resolvendo conflitos de configuração no Exim e SpamAssassin (ipv4 vs ipv6)

07/06/2026 · 3 min · E-mail

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#

Para isolar e analisar o parâmetro duplicado:

grep -n "^av_scanner" /etc/exim.variables.conf
exim -bV -C /etc/exim.conf
exim -bP av_scanner 2>/dev/null
grep -c "^av_scanner" /etc/exim.conf

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

1.2 correção aplicada#

  1. editar exim.variables.conf;
  2. manter apenas uma ocorrência de av_scanner;
  3. validar sintaxe e reiniciar serviço.
# Validar sintaxe completa com o arquivo de configuração
exim -bV -C /etc/exim.conf && echo "Config OK" || echo "Config FAIL"
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 para incluir a diretiva de conexão IPv4 explicita (-d 127.0.0.1) e também o tempo limite de conexão (-t 30 para timeout de 30 segundos), evitando travamentos se o spamd estiver sobrecarregado:

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

Valide a linha após edição (ancorando no início da linha para evitar falsos positivos com comentários):

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

Recarregue Exim e monitore a fila:

systemctl restart exim
exim -bp

3.1 alternativa de correção: forçar ipv6/ipv4 no spamd#

Em vez de alterar a chamada no Exim, você pode configurar o daemon do SpamAssassin (spamd) para aceitar conexões tanto em IPv4 quanto em IPv6 locais.

Edite o arquivo de configuração de inicialização spamassassin ou os argumentos do serviço do systemd para incluir a escuta nos dois endereços:

ExecStart=/usr/bin/spamd -d --listen-addr=127.0.0.1 --listen-addr=::1

Depois, reinicie o serviço:

systemctl restart spamassassin

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

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"
# ou no cPanel:
# tail -f /var/log/exim_mainlog | egrep -i "spamc|spamd|refused|error"
exim -bp | head -n 40

5.1 fluxo de diagnóstico#

O fluxo abaixo descreve graficamente os passos para identificar e mitigar o problema:

flowchart TD %% Custom color definitions classDef default fill:#1e3a5f,stroke:#fff,stroke-width:1px,color:#fff; classDef highlight fill:#78350f,stroke:#fff,stroke-width:1px,color:#fff; classDef alert fill:#7f1d1d,stroke:#fff,stroke-width:1px,color:#fff; classDef success fill:#14532d,stroke:#fff,stroke-width:1px,color:#fff; A[Exim não inicia]:::alert --> B[grep av_scanner]:::default B --> C{Duplicado?}:::default C -->|Sim| D[Remover linha duplicada]:::highlight C -->|Não| E[Ver outros erros]:::alert D --> F[exim -bV -C /etc/exim.conf]:::default F --> G{Parsing OK?}:::default G -->|Não| H[Corrigir sintaxe]:::alert G -->|Sim| I[systemctl restart exim]:::success I --> J[Fila acumulando?]:::default J -->|Sim| K[spamc Connection refused ::1]:::alert K --> L[ss -lntp | grep 783]:::default L --> M{"spamd ouvindo<br/>apenas 127.0.0.1?"}:::default M -->|Sim| N[forçar spamc para 127.0.0.1]:::highlight N --> O[Validar: exim -bhc test]:::success

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.
  4. Defina timeouts nos filtros de transporte do Exim para evitar travamentos em cascata.

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.

Este artigo foi útil?

Deixe uma reação rápida para apoiar o conteúdo:

CC BY-NC

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.

0 comentários