[toc]
# Configuración de Postfix y PostfixSRS
<p style="text-align: justify;">
Vamos a configurar Postfix como servidor de correo y PostfixSRS (Sender Rewriting Scheme) para manejar reenvíos de correos de forma segura.
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on
# fresh installs.
compatibility_level = 3.6
# TLS parameters
smtpd_tls_cert_file = /etc/ssl/certs/email.ccuellar.test.crt
smtpd_tls_key_file = /etc/ssl/private/email.ccuellar.test.key
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
# Authentication
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unknown_recipient_domain,
reject_unlisted_recipient,
reject_unauth_destination,
reject_rbl_client dul.dnsbl.sorbs.net,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_rbl_client bl.spamcop.net
smtpd_sender_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_unknown_sender_domain
smtpd_relay_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
defer_unauth_destination
myhostname = email.ccuellar.test
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydomain = ccuellar.test
myorigin = $mydomain
mydestination = $myhostname, localhost.localdomain, localhost
relayhost =
mynetworks = 10.24.153.0/24, 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
smtp_dns_support_level = enabled
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
# Handing off local delivery to Dovecot's LMTP, and telling it where to store mail
virtual_transport = lmtp:unix:private/dovecot-lmtp
# Virtual domains, users, and aliases
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf,
mysql:/etc/postfix/mysql-virtual-email2email.cf
# Even more Restrictions and MTA params
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
#smtpd_etrn_restrictions = reject
#smtpd_reject_unlisted_sender = yes
#smtpd_reject_unlisted_recipient = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtp_always_send_ehlo = yes
#smtpd_hard_error_limit = 1
smtpd_timeout = 30s
smtp_helo_timeout = 15s
smtp_rcpt_timeout = 15s
smtpd_recipient_limit = 20
minimal_backoff_time = 180s
maximal_backoff_time = 3h
# Reply Rejection Codes
invalid_hostname_reject_code = 550
non_fqdn_reject_code = 550
unknown_address_reject_code = 550
unknown_client_reject_code = 550
unknown_hostname_reject_code = 550
unverified_recipient_reject_code = 550
unverified_sender_reject_code = 550
# More parameters by Sergio
unknown_local_recipient_reject_code = 450
bounce_queue_lifetime = 3d
# Bounce templates
bounce_template_file = /etc/postfix/bounce.cf
maximal_queue_lifetime = 4d
header_checks = regexp:/etc/postfix/header_checks
smtpd_soft_error_limit = 3
smtpd_hard_error_limit = 12
message_size_limit = 20480000
## Configurar bounce.cf
<p style="text-align: justify;">
Ahora vamos a configurar un archivo específico para los mensajes personalizados de respuesta o rebote en Postfix. Creamos el archivo llamado /etc/postfix/bounce.cf y definimos los mensajes según las necesidades del servidor. De esta forma, adaptamos las respuestas de manera más clara y apropiada.
sudo vi /etc/postfix/bounce.cf
Añadimos:
failure_template = <<EOF
Charset: UTF-8
From: MAILER-DAEMON (Mail Delivery System)
Subject: Servidor de correo: Mensaje no entregado
Postmaster-Subject: Postmaster: Mensaje no entregado
POR FAVOR, LEA DETENIDAMENTE ESTE MENSAJE.
Éste es un mensaje de correo enviado automáticamente por su servidor de correo.
No ha sido posible entregar su mensaje a uno o más destinatarios. El
mensaje que causó el error está adjunto a este mensaje.
EOF
delay_template = <<EOF
Charset: UTF-8
From: MAILER-DAEMON (Mail Delivery System)
Subject: Servidor de correo: Mensaje postpuesto
Postmaster-Subject: Postmaster: Mensaje postpuesto
POR FAVOR, LEA DETENIDAMENTE ESTE MENSAJE.
Este es un mensaje de correo enviado automáticamente por el servidor de correo.
.
##############################################
# ÉSTE ES SÓLO UN MENSAJE DE AVISO #
# NO ES NECESARIO QUE REENVÍE EL MENSAJE. #
##############################################
Su mensaje no pudo ser entregado al destinatario después de intentarlo durante
$delay_warning_time_hours hora(s).
Se seguirá intentando enviar el mensaje hasta que pasen $maximal_queue_lifetime_days días.
EOF
success_template = <<EOF
Charset: UTF-8
From: MAILER-DAEMON (Mail Delivery System)
Subject: Servidor de correo: Informe de entrega correcta de mensaje
POR FAVOR, LEA DETENIDAMENTE ESTE MENSAJE.
Este es un mensaje de correo enviado automáticamente por su servidor de correo.
Su mensaje fue entregado correctamente al/a los destinatario/s indicados a
continuación. Si el mensaje fue entregado directamente a los destinatarios,
no recibirá más notificaciones; en caso contrario, si el mensaje tuviera que
pasar por más servidores de correo, es posible que reciba más notificaciones
de estos servidores.
EOF
verify_template = <<EOF
Charset: UTF-8
From: MAILER-DAEMON (Mail Delivery System)
Subject: Servidor de correo: Informe de estado de entrega de mensaje
POR FAVOR, LEA DETENIDAMENTE ESTE MENSAJE.
Este es un mensaje de correo enviado automáticamente por su servidor de correo.
Adjunto a este mensaje se encuentra el informe de entrega solicitado.
EOF
## header_checks
<p style="text-align: justify;">
Este archivo se usa para inspeccionar las cabeceras de los correos y registrar información útil, como el asunto o el remitente.
sudo vi /etc/postfix/header_checks
Añade:
# Registramos todos los asuntos de los correos
/^subject:/ WARN
# Opcional: Registramos otros campos (descomenta si lo necesitas)
#/^from:/ WARN
#/^to:/ WARN
### Convertir Archivos en Bases de Datos
<p style="text-align: justify;">
Postfix no puede leer directamente estos archivos de texto. Necesitamos convertirlos en archivos .db usando el comando postmap.
sudo postmap /etc/postfix/header_checks
## Configurar archivos MySQL
<p style="text-align: justify;">
Postfix necesita interactuar con la base de datos MySQL para gestionar dominios, usuarios y alias. Crea los siguientes archivos:
### Archivo para dominios virtuales
sudo vi /etc/postfix/mysql-virtual-mailbox-domains.cf
Añade:
user = mailuser
password = tu_contraseña
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s' AND active='1'
### Archivo para buzones virtuales
sudo vi /etc/postfix/mysql-virtual-mailbox-maps.cf
Añade:
user = mailuser
password = tu_contraseña
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s' AND active='1'
### Archivo para alias virtuales
sudo vi /etc/postfix/mysql-virtual-alias-maps.cf
Añade:
user = mailuser
password = tu_contraseña
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s' AND active='1'
<p style="text-align: justify;">
Por último, configuramos el archivo /etc/postfix/mysql-virtual-email2email.cf, que se encargará de gestionar las verificaciones necesarias de Postfix para los alias. Este paso asegura que el sistema maneje correctamente los alias en el servidor de correo, dejando todo preparado para su funcionamiento.
sudo vi /etc/postfix/mysql-virtual-email2email.cf
Añade:
user = mailuser
password = tu_contraseña
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s' and active='1'
## Verificar configuraciones MySQL
Verifica que Postfix pueda leer los datos de la base de datos:
sudo postmap -q user1@ccuellar.test mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Si el buzón existe, el comando devolverá 1.
## Configurar master.cf
<p style="text-align: justify;">
El archivo master.cf es como el "cerebro" de Postfix: controla cómo se inician y funcionan todos los procesos del servidor de correo. Ahora vamos a editarlo para asegurarnos de que todo esté configurado correctamente.
sudo cp /etc/postfix/master.cf /etc/postfix/master.cf.orig
sudo vi /etc/postfix/master.cf
Añade:
#
# Postfix master process configuration file. For details on the format
# of the file, see the master(5) manual page (command: "man 5 master" or
# on-line: http://www.postfix.org/master.5.html).
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
# ==========================================================================
smtp inet n - y - - smtpd
#smtp inet n - y - 1 postscreen
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#smtpd pass - - y - - smtpd
#dnsblog unix - - y - 0 dnsblog
#tlsproxy unix - - y - 0 tlsproxy
# Choose one: enable submission for loopback clients only, or for any client.
#127.0.0.1:submission inet n - y - - smtpd
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#submission inet n - y - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_tls_auth_only=yes
# -o local_header_rewrite_clients=static:all
# -o smtpd_reject_unlisted_recipient=no
# Instead of specifying complex smtpd_<xxx>_restrictions here,
# specify "smtpd_<xxx>_restrictions=$mua_<xxx>_restrictions"
# here, and specify mua_<xxx>_restrictions in main.cf (where
# "<xxx>" is "client", "helo", "sender", "relay", or "recipient").
# -o smtpd_client_restrictions=
# -o smtpd_helo_restrictions=
# -o smtpd_sender_restrictions=
# -o smtpd_relay_restrictions=
# -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
# Choose one: enable submissions for loopback clients only, or for any client.
#127.0.0.1:submissions inet n - y - - smtpd
#submissions inet n - y - - smtpd
# -o syslog_name=postfix/submissions
# -o smtpd_tls_wrappermode=yes
# -o smtpd_sasl_auth_enable=yes
# -o local_header_rewrite_clients=static:all
# -o smtpd_reject_unlisted_recipient=no
# Instead of specifying complex smtpd_<xxx>_restrictions here,
# specify "smtpd_<xxx>_restrictions=$mua_<xxx>_restrictions"
# here, and specify mua_<xxx>_restrictions in main.cf (where
# "<xxx>" is "client", "helo", "sender", "relay", or "recipient").
# -o smtpd_client_restrictions=
# -o smtpd_helo_restrictions=
# -o smtpd_sender_restrictions=
# -o smtpd_relay_restrictions=
# -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
#628 inet n - y - - qmqpd
pickup unix n - y 60 1 pickup
cleanup unix n - y - 0 cleanup
qmgr unix n - n 300 1 qmgr
#qmgr unix n - n 300 1 oqmgr
tlsmgr unix - - y 1000? 1 tlsmgr
rewrite unix - - y - - trivial-rewrite
bounce unix - - y - 0 bounce
defer unix - - y - 0 bounce
trace unix - - y - 0 bounce
verify unix - - y - 1 verify
flush unix n - y 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - y - - smtp
relay unix - - y - - smtp
-o syslog_name=postfix/$service_name
# -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq unix n - y - - showq
error unix - - y - - error
retry unix - - y - - error
discard unix - - y - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - y - - lmtp
anvil unix - - y - 1 anvil
scache unix - - y - 1 scache
postlog unix-dgram n - n - 1 postlogd
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent. See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
#maildrop unix - n n - - pipe
# flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
#
# ====================================================================
#
# Recent Cyrus versions can use the existing "lmtp" master.cf entry.
#
# Specify in cyrus.conf:
# lmtp cmd="lmtpd -a" listen="localhost:lmtp" proto=tcp4
#
# Specify in main.cf one or more of the following:
# mailbox_transport = lmtp:inet:localhost
# virtual_transport = lmtp:inet:localhost
#
# ====================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Also specify in main.cf: cyrus_destination_recipient_limit=1
#
#cyrus unix - n n - - pipe
# flags=DRX user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
#
# ====================================================================
#
# Old example of delivery via Cyrus.
#
#old-cyrus unix - n n - - pipe
# flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
#
# ====================================================================
#
# See the Postfix UUCP_README file for configuration details.
#
uucp unix - n n - - pipe
flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
#ifmail unix - n n - - pipe
# flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
#bsmtp unix - n n - - pipe
# flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
#scalemail-backend unix - n n - 2 pipe
# flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
#mailman unix - n n - - pipe
# flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}
## Configurar PostfixSRS
### Instalar PostfixSRS
sudo apt update
sudo apt install postsrsd
Configurar Postfix para usar SRS
sudo vi /etc/postfix/main.cf
Añade al final:
#PostfixSRS
sender_canonical_maps = tcp:localhost:10001
sender_canonical_classes = envelope_sender
recipient_canonical_maps = tcp:localhost:10002
recipient_canonical_classes = envelope_recipient,header_recipient
Reinicia los servicios:
sudo systemctl restart postfix
sudo systemctl restart postsrsd
## Comprobar que todo funciona
### Verificar sintaxis de Postfix:
sudo postfix check
sudo systemctl restart postfix
sudo systemctl status postfix
🤗
---
## [Índice de secciones aquí](https://hackmd.io/@ccuellar/rJ73y6FpJe)
## [👈Anterior sección](https://hackmd.io/@ccuellar/ryMRcAFT1g) 😄 [Siguiente sección 👉](https://hackmd.io/@ccuellar/BJJyhAYpye)