Como configurar SPF, DKIM e DMARC em Postfix para melhorar entrega de e‑mails (passo a passo)
Redes & Segurança · Por Kevin Marcondes · Publicado em · Atualizado em · 8 min de leitura
Neste guia você verá como configurar SPF, DKIM e DMARC em Postfix para melhorar entrega de e‑mails. Vamos publicar os registros no DNS, assinar mensagens com DKIM via OpenDKIM, alinhar DMARC e validar tudo com testes. Serve para servidores Linux com Postfix já em produção ou recém‑instalados.
O que vamos fazer e pré‑requisitos
Vamos configurar autenticação de e‑mail em três frentes. SPF define quem pode enviar pelo seu domínio. DKIM assina mensagens. DMARC aplica política e gera relatórios.
Pré‑requisitos: acesso root ou sudo, Postfix instalado, domínio com DNS sob seu controle e portas abertas. Se usa firewall, libere 25 e 587. Veja em como configurar firewall no Ubuntu com UFW.
Se está montando o servidor do zero, este guia ajuda a preparar o sistema: Como instalar o Ubuntu Server passo a passo.
Importante: configure um hostname FQDN e o PTR (reverse DNS) no provedor. Sem PTR correto, provedores grandes costumam rejeitar ou pontuar mal seus envios.
- Acesso ao DNS do domínio
- Postfix instalado e enviando/recebendo e‑mails
- Hostname FQDN consistente (ex.: mail.exemplo.com)
- Portas 25/587 liberadas no firewall
- Tempo de propagação DNS (pode levar horas)
| Registro | Tipo | Nome/Host | Exemplo de valor |
|---|---|---|---|
| SPF | TXT | @ (raiz do domínio) | v=spf1 mx -all |
| DKIM | TXT | default._domainkey | v=DKIM1; k=rsa; p=CHAVE_PUBLICA |
| DMARC | TXT | _dmarc | v=DMARC1; p=quarantine; rua=mailto:[email protected] |
Verificar domínio, hostname e HELO do Postfix
O domínio no cabeçalho From deve alinhar com o HELO/EHLO do Postfix e com o PTR. Valide e ajuste myhostname e myorigin. Evite HELO genérico ou IP literal.
Cheque também mydomain e o endereço usado para e‑mails gerados localmente.
# Ver seu hostname atual
hostname -f
# Conferir parâmetros relevantes do Postfix
postconf -n | egrep 'myhostname|mydomain|myorigin|smtpd_banner'
# Ajustar hostname (exemplo) — substitua pelo seu FQDN
sudo postconf -e 'myhostname = mail.exemplo.com'
sudo postconf -e 'myorigin = $mydomain'
# Reiniciar o Postfix após ajustes
sudo systemctl restart postfix
SPF: criar e publicar o registro TXT
SPF declara quais hosts podem enviar e‑mails pelo seu domínio. O registro é TXT na raiz do domínio. Comece com política moderada e endureça após testar. Apenas um registro SPF por domínio; múltiplos quebram a validação.
Se também envia por serviços externos, inclua mecanismos adequados com include, ip4 ou ip6.
- -all bloqueia remetentes fora da lista (estrito)
- ~all marca como suspeito, mas não bloqueia (relaxado)
- Use mx para autorizar os MX do domínio
- Adicione ip4:/ip6: para IPs específicos
- Evite ultrapassar o limite de 10 consultas DNS
| Exemplo | Descrição | Quando usar |
|---|---|---|
| v=spf1 mx -all | Somente os MX podem enviar | Domínios simples, um servidor |
| v=spf1 ip4:203.0.113.10 a mx ~all | Autoriza IP fixo, A e MX | Fase de testes (mais tolerante) |
| v=spf1 mx include:mailservice.example ~all | Inclui serviço de terceiros | Envio também por provedores externos |
# Exemplo de linha de zona (provedores têm telas próprias para isso)
# Tipo: TXT | Nome/Host: @ | Valor:
"v=spf1 mx -all"
# Após publicar, valide a resolução
dig +short TXT exemplo.com | sed 's/\"/"/g'
DKIM: instalar e integrar OpenDKIM ao Postfix
DKIM assina mensagens com uma chave privada; o destinatário valida com a chave pública no DNS. Usaremos OpenDKIM como milter do Postfix.
Também é hora de garantir TLS no SMTP. Para certificados gratuitos, veja Como gerar SSL grátis com Let's Encrypt.
# Instalar OpenDKIM e ferramentas
sudo apt update && sudo apt install -y opendkim opendkim-tools
# Diretórios e arquivos básicos
sudo mkdir -p /etc/opendkim/keys/exemplo.com
# Configuração principal do OpenDKIM
sudo tee /etc/opendkim.conf >/dev/null <<'CONF'
Syslog yes
UMask 002
UserID opendkim:opendkim
Socket inet:8891@localhost
Selector default
Mode sv
Canonicalization relaxed/simple
AutoRestart yes
OversignHeaders From
KeyTable /etc/opendkim/KeyTable
SigningTable /etc/opendkim/SigningTable
TrustedHosts /etc/opendkim/TrustedHosts
CONF
# Mapas de assinatura e hosts confiáveis
sudo tee /etc/opendkim/KeyTable >/dev/null <<'CONF'
default._domainkey.exemplo.com exemplo.com:default:/etc/opendkim/keys/exemplo.com/default.private
CONF
sudo tee /etc/opendkim/SigningTable >/dev/null <<'CONF'
*@exemplo.com default._domainkey.exemplo.com
CONF
sudo tee /etc/opendkim/TrustedHosts >/dev/null <<'CONF'
127.0.0.1
::1
localhost
*.exemplo.com
CONF
# Permissões
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod -R go-rwx /etc/opendkim/keys
# Habilitar o milter no Postfix
sudo postconf -e 'milter_default_action = accept'
sudo postconf -e 'milter_protocol = 6'
sudo postconf -e 'smtpd_milters = inet:localhost:8891'
sudo postconf -e 'non_smtpd_milters = inet:localhost:8891'
# Ativar serviços
sudo systemctl enable --now opendkim
sudo systemctl restart postfix
DKIM: gerar a chave e publicar no DNS
Gere um par de chaves por domínio e selector. Publique a chave pública no DNS como TXT em default._domainkey.seudominio. Proteja a chave privada com permissões restritas.
Depois de publicar, valide com a ferramenta e só então faça envios reais.
- Use tamanho de chave 2048 bits
- Um selector por política/chave (ex.: default, s2026)
- Rotacione a chave periodicamente
- Copie apenas o valor p= para o DNS
# Gere a chave (substitua exemplo.com e o selector se desejar)
cd /etc/opendkim/keys/exemplo.com
sudo opendkim-genkey -s default -d exemplo.com -b 2048
sudo chown opendkim:opendkim default.private
sudo chmod 600 default.private
# Exiba a entrada DNS sugerida
cat default.txt
# Reinicie para garantir leitura das chaves
sudo systemctl restart opendkim postfix
DMARC: definir política, alinhamento e relatórios
DMARC instrui destinatários sobre o que fazer quando SPF ou DKIM falham e envia relatórios. Comece com p=none para observar. Evolua depois para quarantine e reject quando tudo estiver alinhado.
Alinhamento exige que o domínio em From coincida com o domínio validado por SPF ou DKIM. Use adkim/aspf=s (strict) quando estiver confiante.
- p=none apenas monitora (sem impacto na entrega)
- p=quarantine envia suspeitos ao spam
- p=reject rejeita mensagens não alinhadas
- rua/ruf recebem relatórios agregados/forenses
- pct controla a porcentagem da política aplicada
| Política | Efeito | Uso recomendado |
|---|---|---|
| p=none | Somente coleta relatórios | Fase inicial, validar configuração |
| p=quarantine | Mensagens suspeitas vão para spam | Intermediário, após reduzir falsos positivos |
| p=reject | Rejeita mensagens não alinhadas | Fase final, quando tudo está correto |
# Registro DMARC (TXT) — Nome/Host: _dmarc
# Ajuste emails de relatório para sua caixa dedicada
"v=DMARC1; p=none; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1; adkim=s; aspf=s; pct=100"
# Após publicar, confira
dig +short TXT _dmarc.exemplo.com | sed 's/\"/"/g'
Testes: validar SPF, DKIM e DMARC
Valide primeiro os registros DNS. Depois, confira a chave DKIM com a ferramenta e envie um e‑mail de teste para uma caixa externa. Verifique nos cabeçalhos Authentication‑Results, DKIM‑Signature e Received‑SPF.
Se usa TLS no SMTP, confirme o certificado e os conjuntos de cifras negociados.
- Confirme que existe apenas um registro SPF
- Checagem DKIM: selector correto e chave pública publicada
- Alinhamento DMARC: From coincide com domínio validado
- Envie para provedores diferentes e compare cabeçalhos
# SPF e DMARC
dig +short TXT exemplo.com | sed 's/\"/"/g'
dig +short TXT _dmarc.exemplo.com | sed 's/\"/"/g'
# DKIM: teste do selector (default) — substitua domínio
opendkim-testkey -d exemplo.com -s default -vvv
# Após enviar um e-mail de teste, veja logs locais
sudo journalctl -u postfix -n 100 | egrep 'DKIM|smtpd|policy' || tail -n 100 /var/log/mail.log
Problemas comuns e como resolver
Alguns erros se repetem. Confira esta lista antes de depurar mais a fundo.
Lembre que propagação DNS pode levar horas. Testes imediatos podem falhar por cache.
- Várias entradas SPF: mantenha só uma; combine mecanismos
- Selector DKIM errado: confirme default._domainkey.seudominio
- Permissões da chave privada: 600 e dono opendkim
- Milter não carregou: cheque smtpd_milters e porta 8891
- DMARC falha por desalinhamento: From difere do domínio DKIM/SPF
- Serviço de terceiros enviando sem SPF/DKIM: ajuste include/keys
Perguntas frequentes
Posso ter mais de um registro SPF?
Não. Deve existir apenas um registro TXT de SPF por domínio. Se precisar autorizar vários serviços, combine mecanismos no mesmo valor (mx, a, ip4/ip6, include). Registros SPF múltiplos fazem a validação falhar e prejudicam a entrega.
Qual política DMARC devo usar primeiro?
Comece com p=none para coletar relatórios e ajustar alinhamento. Quando estiver estável, avance para p=quarantine e, por fim, p=reject. Ajuste pct para aplicar gradualmente. Use adkim/aspf=s quando tudo estiver alinhado.
O que é o selector DKIM e como escolher?
O selector identifica qual chave pública usar (ex.: default, s2026). Ele compõe o nome DNS do registro, como default._domainkey.seudominio. Use um selector por chave ativa. Para rotação, crie um novo selector, publique a chave e troque a configuração.
Quanto tempo demora para a configuração funcionar?
A parte local, no Postfix e no OpenDKIM, é imediata após reiniciar serviços. Já o DNS pode levar de minutos a horas para propagar, conforme o TTL e caches. Sempre valide com consultas DNS e, só depois, teste envios para várias caixas.
Preciso de TLS para SPF, DKIM e DMARC funcionarem?
Não é obrigatório para a validação, mas é recomendado para segurança e reputação. Habilite STARTTLS no Postfix com um certificado válido, de preferência automatizado. Isso reduz interceptações e melhora a postura do seu servidor.
Precisa de ajuda para ajustar Postfix e DNS?
Se a autenticação ainda falha ou você quer revisar sua configuração antes de aplicar políticas mais rígidas, fale comigo para uma sessão de suporte pontual.
Falar sobre suporte técnicoVeja também
- tutorial: implementar Canary releases com Traefik em Docker Compose usando headers e weight routing para deploys graduais de aplicações PHP
- Tutorial: configurar HAProxy com Let's Encrypt e healthchecks para balanceamento de tráfego entre containers Docker em VPS (passo a passo)
- Tutorial prático: implementar mTLS entre Nginx e microserviços usando smallstep CA em Docker Compose
- Tutorial: configurar cgroup v2 e systemd ResourceControl para limitar CPU, memória e I/O de containers Docker no Debian