Qué construye esto
Un servidor de correo completo para un solo dominio: Postfix para el transporte, Dovecot para IMAP y la entrega local, rspamd para el filtrado y el firmado de DKIM, y los tres registros DNS que deciden si los grandes receptores ponen tu correo en la bandeja de entrada o en una carpeta que nadie abre. Envía, recibe, autentica y no es un relé abierto.
Gestionar tu propio correo es un consejo poco moderno y en su mayor parte con buena razón. La entregabilidad es la parte difícil, no el software. Si te equivocas en el DNS, el Postfix más cuidadosamente configurado del mundo enviará mensajes directamente al vacío.
Antes de empezar
- Un R-8 o superior. El filtrado está limitado por la CPU y rspamd usará felizmente todos los núcleos que le des durante una oleada de spam.
- Un dominio cuyo DNS controles, y paciencia para la propagación.
- Registro DNS inverso configurado en la dirección de la instancia con el nombre de host de tu correo. Es editable desde el panel y es obligatorio: los receptores rechazan a los remitentes no resolubles.
- Un ticket a soporte preguntando si el puerto 25 de salida está abierto en tu instancia. Pregunta antes de construir, no después.
mail.example.comen todo. Sustituye por los tuyos.
1. Nombre de host y DNS
hostnamectl set-hostname mail.example.com
apt update && apt full-upgrade -yPublica estos registros ahora, porque el paso del certificado necesita el registro A y el paso del firmado necesita un lugar donde poner la clave. Los valores en la tabla son lo que hace cada registro, no lo que hay que pegar.
| Registro | Nombre | Contenido |
|---|---|---|
| A / AAAA | mail | Las direcciones de la instancia desde el panel |
| MX | @ | 10 mail.example.com. |
| TXT | @ | v=spf1 mx -all |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:[email protected]; adkim=s; aspf=s |
| PTR | dirección de la instancia | mail.example.com — configurado en el panel |
El registro SPF dice: mis hosts MX envían mi correo, todo lo demás está falsificado. Fallo duro en lugar de fallo blando, porque ~all invita a los receptores a tomar su propia decisión y su decisión no será la generosa. DMARC comienza en p=none para que recoja informes durante una semana antes de que se rechace nada en tu nombre.
2. Certificados
apt install -y certbot
certbot certonly --standalone -d mail.example.comNada está escuchando en el puerto 80 todavía, así que el modo independiente es el camino más simple. Los ganchos de renovación vienen al final, una vez que los demonios existan para recargar.
3. Postfix
DEBIAN_FRONTEND=noninteractive apt install -y postfix postfix-pcre dovecot-imapd dovecot-lmtpd rspamd redis-serverAhora configura el transporte. Cada línea abajo es deliberada; postconf las escribe en su lugar para que no haya editor en el que equivocarse:
postconf -e "myhostname = mail.example.com"
postconf -e "mydestination = localhost"
postconf -e "smtpd_banner = \$myhostname ESMTP"
postconf -e "inet_interfaces = all"
postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem"
postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem"
postconf -e "smtpd_tls_security_level = may"
postconf -e "smtp_tls_security_level = dane"
postconf -e "smtpd_tls_mandatory_protocols = >=TLSv1.2"
postconf -e "smtpd_sasl_type = dovecot"
postconf -e "smtpd_sasl_path = private/auth"
postconf -e "smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination"
postconf -e "smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unknown_recipient_domain reject_unauth_destination"
postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
postconf -e "virtual_mailbox_domains = example.com"
postconf -e "smtpd_milters = inet:127.0.0.1:11332"
postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
postconf -e "milter_default_action = accept"La línea más importante de todas es smtpd_relay_restrictions. Termina con reject_unauth_destination, que es lo que evita que todo internet use tu máquina para enviar su correo. Un relé abierto te hace deslistar en horas y además es una violación de la política de uso aceptable.
Habilita el puerto de envío para que tus propios clientes puedan enviar, con autenticación requerida y sin acceso anónimo:
postconf -M submission/inet="submission inet n - y - - smtpd"
postconf -P "submission/inet/syslog_name=postfix/submission"
postconf -P "submission/inet/smtpd_tls_security_level=encrypt"
postconf -P "submission/inet/smtpd_sasl_auth_enable=yes"
postconf -P "submission/inet/smtpd_client_restrictions=permit_sasl_authenticated,reject"4. Dovecot
Los buzones en Maildir bajo un único usuario del sistema mantienen esta construcción pequeña. Crea el usuario y el almacenamiento:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 -d /var/vmail -m vmail
install -d -o vmail -g vmail -m 700 /var/vmail/example.comEscribe /etc/dovecot/conf.d/99-local.conf:
mail_location = maildir:/var/vmail/%d/%n
mail_uid = vmail
mail_gid = vmail
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_min_protocol = TLSv1.2
auth_mechanisms = plain login
disable_plaintext_auth = yes
passdb {
driver = passwd-file
args = scheme=ARGON2ID username_format=%u /etc/dovecot/users
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}Crea un buzón. El comando pide dos veces y escribe un hash, nunca la contraseña en sí:
echo -n "[email protected]:" >> /etc/dovecot/users
doveadm pw -s ARGON2ID >> /etc/dovecot/users
chmod 640 /etc/dovecot/users
chgrp dovecot /etc/dovecot/users5. rspamd y DKIM
Genera la clave de firmado y publica la parte pública:
install -d -o _rspamd -g _rspamd -m 750 /var/lib/rspamd/dkim
rspamadm dkim_keygen -s mail -b 2048 -d example.com -k /var/lib/rspamd/dkim/example.com.mail.key
chown _rspamd:_rspamd /var/lib/rspamd/dkim/example.com.mail.key
chmod 400 /var/lib/rspamd/dkim/example.com.mail.keyEse comando imprime un registro DNS en la salida estándar. Publícalo como un registro TXT en mail._domainkey.example.com, exactamente como se imprime, con los segmentos entre comillas unidos como tu proveedor de DNS espere. Luego dile a rspamd dónde vive la clave, en /etc/rspamd/local.d/dkim_signing.conf:
path = "/var/lib/rspamd/dkim/$domain.$selector.key";
selector = "mail";
allow_username_mismatch = true;
use_domain = "header";
sign_authenticated = true;
sign_local = true;Vincula el milter y establece una contraseña para la interfaz web:
echo "bind_socket = \"127.0.0.1:11332\";" > /etc/rspamd/local.d/worker-proxy.inc
rspamadm pwPega el hash resultante en /etc/rspamd/local.d/worker-controller.inc como password = "...". Accede a la interfaz a través de un túnel SSH en lugar de abrir el puerto 11334 al mundo.
6. Inicia todo
systemctl enable --now redis-server rspamd dovecot postfix
postfix check
systemctl --no-pager --failedAñade un gancho de renovación para que un nuevo certificado llegue a ambos demonios:
echo "systemctl reload postfix dovecot" > /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-mail.shVerifícalo
Tres pruebas. La primera es local, la segunda es la que importa, la tercera es la que te mantiene fuera de las listas negras.
echo | openssl s_client -starttls smtp -connect mail.example.com:25 -servername mail.example.com 2>/dev/null | grep -E "subject=|Verify return"Luego envía un mensaje desde tu nuevo servidor a un buzón que tengas en un gran proveedor de correo web, abre el mensaje recibido y lee sus cabeceras completas. Buscas una línea:
Authentication-Results: mx.receiver.example;
dkim=pass [email protected];
spf=pass smtp.mailfrom=example.com;
dmarc=pass (p=NONE) header.from=example.comTres pasos y has terminado. Un dkim=none significa que rspamd no está firmando, así que revisa rspamadm configdump dkim_signing. Un spf=fail casi siempre significa que el mensaje salió por IPv6 mientras que tu registro SPF solo cubre la dirección MX de v4.
Por último, demuestra que no eres un relé. Desde cualquier otra máquina, conéctate e intenta enviar correo entre dos dominios que no poseas:
apt install -y swaks
swaks --to [email protected] --from [email protected] --server mail.example.comEl resultado correcto es un rechazo en la etapa del destinatario: 554 5.7.1 Relay access denied. Cualquier otra cosa significa que has configurado una máquina que será abusada en el mismo día, y deberías parar y releer el paso tres.
Después
Deja DMARC en p=none durante una semana y lee los informes agregados. Una vez que muestren solo tu propio servidor firmando tu propio correo, muévete a p=quarantine, luego p=reject dos semanas después. Añade una copia de seguridad fuera del nodo para /var/vmail mientras estás en ello, porque el correo es lo único de lo que los usuarios nunca tienen una segunda copia, y nuestro complemento de copia de seguridad escribe en un sitio diferente al de la instancia.