Postfix (Español)

From ArchWiki
Esta traducción de Postfix fue revisada el 2020-12-06. Si existen cambios puede actualizarla o avisar al equipo de traducción.

Postfix es un agente de transferencia de correo que de acuerdo con su sitio web:

intenta ser rápido, fácil de administrar y seguro, al mismo tiempo que es lo suficientemente compatible con sendmail para no molestar a los usuarios existentes. Por lo tanto, el exterior es parecido a sendmail, pero el interior es completamente diferente.

Este artículo se basa en Servidor de correo. El objetivo de este artículo es configurar Postfix y explicar qué hacen los archivos de configuración básicos. Hay instrucciones para configurar la entrega solo para usuarios locales del sistema y un enlace a una guía para la entrega a usuarios virtuales.

Instalación

Instale el paquete postfix.

Configuración

Véase Configuración básica de Postfix. Los archivos de configuración están en /etc/postfix por defecto. Los dos archivos más importantes son:

  • master.cf, define qué servicios de Postfix están habilitados y cómo se conectan los clientes con ellos, véase master(5)
  • main.cf, el archivo de configuración principal, véase postconf(5)

Los cambios de configuración necesitan un reinicio de postfix.service para tener efecto.

Alias

Véase aliases(5).

Puede especificar los alias (también conocidos como reenviadores) en /etc/postfix/aliases.

Debe asignar todo el correo dirigido a root a otra cuenta, ya que no es una buena idea leer el correo como superusuario.

Descomente la siguiente línea, y cambie a una cuenta real.

root: tú

Una vez que haya terminado de editar /etc/postfix/aliases debe ejecutar la orden postalias:

postalias /etc/postfix/aliases

Para cambios posteriores puedes utilizar:

newaliases
Sugerencia: Alternativamente puede crear el archivo ~/.forward, por ejemplo /root/.forward para el superusuario. Especifique el usuario al que se debe reenviar el correo del superusuario, por ejemplo usuario@localhost.
/root/.forward
usuario@localhost

Correo local

Para enviar correo solo a los usuarios locales del sistema (que están en /etc/passwd) actualice /etc/postfix/main.cf para reflejar la siguiente configuración. Descomente, cambie o añada las siguientes líneas:

myhostname = localhost
mydomain = localdomain
mydestination = $myhostname, localhost.$mydomain, localhost
inet_interfaces = $myhostname, localhost
mynetworks_style = host
default_transport = error: outside mail is not deliverable

Todos los demás ajustes pueden permanecer sin cambios. Después de configurar el archivo de configuración anterior, es posible que desee configurar algunos #Alias y luego #Iniciar Postfix.

Correo virtual

El correo virtual es un correo que no se asigna a una cuenta de usuario (/etc/passwd).

Véase Virtual user mail system with Postfix, Dovecot and Roundcube para una guía completa de cómo configurarlo.

Comprobar configuración

Ejecute la orden postfix check. Debería mostrar cualquier cosa que pueda haber hecho mal en un archivo de configuración.

Para ver todas sus configuraciones, escriba postconf. Para ver en qué se diferencian de los valores por defecto, pruebe postconf -n.

Iniciar Postfix

Nota: Debe ejecutar newaliases al menos una vez para que Postfix se ejecute, incluso si no configuró ningún #Alias.

Inicie/active postfix.service.

TLS

Para más información, véase Soporte TLS en Postfix.

SMTP seguro (enviando)

Por defecto, Postfix/sendmailno enviará correo electrónico cifrado a otros servidores SMTP. Para utilizar TLS cuando esté disponible, añada la siguiente línea a main.cf:

/etc/postfix/main.cf
smtp_tls_security_level = may

Para forzar TLS (y fallar cuando el servidor remoto no lo soporte), cambie may a encrypt. Note, sin embargo, que esto viola el RFC:2487 si el servidor SMTP es referenciado públicamente.

SMTP seguro (recibiendo)

Advertencia: Si implementa TLS, asegúrese de seguir la guía de weakdh.org para prevenir FREAK/Logjam. Desde mediados de 2015, la configuración predeterminada ha sido segura contra POODLE. Para más información véase Server-side TLS.

Por defecto, Postfix no aceptará el correo seguro.

Necesita obtener un certificado. Apunte Postfix a sus certificados TLS añadiendo las líneas siguientes a main.cf:

/etc/postfix/main.cf
smtpd_tls_security_level = may
smtpd_use_tls = yes
smtpd_tls_cert_file = /ruta/al/cert.pem
smtpd_tls_key_file = /ruta/al/key.pem

Hay dos formas de aceptar el correo seguro. STARTTLS sobre SMTP (puerto 587) y SMTPS (puerto 465). Este último fue previamente desaprobado pero fue reintegrado por el RFC:8314.

Para activar STARTTLS sobre SMTP (puerto 587), descomente las siguientes líneas en master.cf:

/etc/postfix/master.cf
submission inet n       -       n       -       -       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 smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Las opciones smtpd_*_restrictions permanecen comentadas porque $mua_*_restrictions no están definidas en main.cf por defecto. Si defide configurar alguna $mua_*_restrictions, descomente esas líneas también.

Para activar SMTPS (puerto 465), descomente las líneas siguientes en master.cf:

/etc/postfix/master.cf
smtps     inet  n       -       n       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Y en primera línea, reemplace smtps con submissions. (este es el nombre oficial del servicio según IANA; Postfix todavía hace referencia al nombre antiguo)

El razonamiento que rodea a las líneas $smtpd_*_restrictions es el mismo que arriba.

Nota: Si obtiene un mensaje de error como postfix/master[5309]: fatal: 0.0.0.0:smtps: Servname not supported for ai_socktype, asegúrese de tener la siguiente línea en postfix/master.cf:
submissions inet n       -       n       -       -       smtpd

También asegúrese de que /etc/services está actualizado e incluye la siguiente línea:

submissions 465/tcp

Consejos y trucos

Lista negra de correos electrónicos entrantes

La lista negra de correos electrónicos entrantes por dirección del remitente se puede hacer fácilmente con Postfix.

Cree y abra el fichero /etc/postfix/blacklist_incoming y añada la dirección de correo electrónico del remitente:

usuario@ejemplo.com REJECT

Luego use la orden postmap para crear una base de datos:

# postmap hash:blacklist_incoming

Añada el siguiente código antes de la primera regla permisiva en main.cf:

smtpd_recipient_restrictions = check_sender_access hash:/etc/postfix/blacklist_incoming

Finalmente reinicie postfix.service.

Ocultar la IP y el agente de usuario del remitente en el encabezado Received

Este es un problema de privacidad principalmente, si utiliza Thunderbird y envía un correo electrónico. El encabezado Received contendrá su IP LAN y WAN e información sobre el cliente de correo electrónico que utilizó. (Fuente original: AskUbuntu) Lo que queremos hacer es eliminar el encabezado Received de los correos electrónicos salientes.

Para hacer esto, primero añada la siguiente línea a main.cf:

smtp_header_checks = regexp:/etc/postfix/smtp_header_checks

Cree /etc/postfix/smtp_header_checks con este contenido:

/^Received: .*/     IGNORE
/^User-Agent: .*/   IGNORE

Finalmente, reinicie postfix.service.

Postfix en una jaula chroot

Postfix no se pone en una jaula chroot por defecto. La documentación de Postfix [1] proporciona detalles sobre cómo llevar a cabo tal enjaulado. Los pasos se describen a continuación y se basan en el script de configuración de chroot que se proporciona en el código fuente de Postfix.

Primero, entre en el archivo master.cf en el directorio /etc/postfix y cambie todas las entradas chroot a 'yes' (y) excepto para los servicios qmgr, proxymap, proxywrite, local, y virtual

Segundo, cree dos funciones que nos ayudarán más adelante con la copia de archivos en la jaula chroot (véase el último paso)

CP="cp -p"
cond_copy() {
  # find files as per pattern in $1
  # if any, copy to directory $2
  dir=`dirname "$1"`
  pat=`basename "$1"`
  lr=`find "$dir" -maxdepth 1 -name "$pat"`
  if test ! -d "$2" ; then exit 1 ; fi
  if test "x$lr" != "x" ; then $CP $1 "$2" ; fi
}

A continuación, haga los nuevos directorios para la jaula:

set -e
umask 022
POSTFIX_DIR=${POSTFIX_DIR-/var/spool/postfix}
cd ${POSTFIX_DIR}
mkdir -p etc lib usr/lib/zoneinfo
test -d /lib64 && mkdir -p lib64

Encuentra el archivo localtime:

lt=/etc/localtime
if test ! -f $lt ; then lt=/usr/lib/zoneinfo/localtime ; fi
if test ! -f $lt ; then lt=/usr/share/zoneinfo/localtime ; fi
if test ! -f $lt ; then echo "cannot find localtime" ; exit 1 ; fi
rm -f etc/localtime

Copie localtime y algunos archivos de sistema en el directorio etc del chroot:

$CP -f $lt /etc/services /etc/resolv.conf /etc/nsswitch.conf etc
$CP -f /etc/host.conf /etc/hosts /etc/passwd etc
ln -s -f /etc/localtime usr/lib/zoneinfo

Copie las bibliotecas requeridas en el chroot utilizando la función creada previamente cond_copy

cond_copy '/usr/lib/libnss_*.so*' lib
cond_copy '/usr/lib/libresolv.so*' lib
cond_copy '/usr/lib/libdb.so*' lib

Y no olvide recargar Postfix.

DANE (DNSSEC)

Registro de recursos

Advertencia: Esta no es una sección trivial. Tenga en cuenta que debe estar seguro de lo que está haciendo. Mejor lea antes Errores comunes.

DANE admite varios tipos de registros, sin embargo, no todos ellos son adecuados en Postfix.

El uso del certificado 0 no es compatible, el 1 se asigna al 3 y 2 es opcional, por lo tanto es recomendable publicar un registro "3". Más en Registros de recursos.

Configuración

DANE oportunista (opportunistic) se configura de esta manera:

/etc/postfix/main.cf
smtpd_use_tls = yes
smtp_dns_support_level = dnssec
smtp_tls_security_level = dane
/etc/postfix/master.cf
dane       unix  -       -       n       -       -       smtp
  -o smtp_dns_support_level=dnssec
  -o smtp_tls_security_level=dane

Para utilizar políticas por dominio, por ejemplo DANE oportunista para ejemplo.org y DANE obligatorio (mandatory) para ejemplo.com, utilice algo como esto:

/etc/postfix/main.cf
indexed = ${default_database_type}:${config_directory}/

# Per-destination TLS policy
#
smtp_tls_policy_maps = ${indexed}tls_policy

# default_transport = smtp, but some destinations are special:
#
transport_maps = ${indexed}transport
transport
ejemplo.com dane
ejemplo.org dane
tls_policy
ejemplo.com dane-only
Nota: Para DANE obligatorio global, cambie smtp_tls_security_level a dane-only. Tenga en cuenta que esto provoca un error tempfail en Postfix (responder con un código de error 4.X.X) en todos los envíos que no utilicen DANE.

La documentación completa se encuentra aquí.

Extras

  • PostfixAdmin — Una interfaz administrativa basada en web para Postfix.
http://postfixadmin.sourceforge.net/ || postfixadmin

Postgrey

Postgrey se puede utilizar para activar listas grises en un servidor de correo Postfix.

Instalación

Instale el paquete postgrey. Para tenerlo funcionando rápidamente, edite el archivo de configuración de Postfix y añada estas líneas:

/etc/postfix/main.cf
smtpd_recipient_restrictions =
  check_policy_service inet:127.0.0.1:10030

Luego inicie/active el servicio postgrey. Después, recargue el servicio postfix. Ahora la lista gris debería estar activada.

Configuración

La configuración se realiza mediante la edición del archivo postgrey.service. Primero cópielo para editarlo.

# cp /usr/lib/systemd/system/postgrey.service /etc/systemd/system/

Lista blanca

Para añadir listas blancas automáticas (los envíos exitosos entran en la lista blanca y no tienen que esperar nunca más), puede añadir la opción --auto-whitelist-clients=N y reemplazar N por un número adecuadamente pequeño (o dejarlo en su valor por defecto de 5).

...en realidad, el método preferido debería ser la anulación (override):

cat /etc/systemd/system/postgrey.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/postgrey --inet=127.0.0.1:10030 \
       --pidfile=/run/postgrey/postgrey.pid \
       --group=postgrey --user=postgrey \
       --daemonize \
       --greylist-text="Greylisted for %%s seconds" \
       --auto-whitelist-clients

Para añadir su propia lista de clientes en la lista blanca además de los predeterminados, cree el archivo /etc/postfix/whitelist_clients.local e introduzca un dominio por línea, luego reinicie postgrey.service para que los cambios surtan efecto.

Solución de problemas

Si especifica --unix=/path/to/socket y el archivo de socket no se crea, asegúrese de haber eliminado el valor predeterminado --inet=127.0.0.1:10030 del archivo de servicio.

Para una documentación completa de las posibles opciones véase perldoc postgrey.

SpamAssassin

Esta sección describe cómo integrar SpamAssassin.

Configuración genérica independiente de SpamAssassin

Nota: Si desea combinar SpamAssassin y Dovecot Mail Filtering, ignore las siguientes dos líneas y continúe después.

Edite /etc/postfix/master.cf y añada el filtro de contenido bajo smtp.

smtp      inet  n       -       n       -       -       smtpd
  -o content_filter=spamassassin

También añada la siguiente entrada de servicio para SpamAssassin.

spamassassin unix -     n       n       -       -       pipe
  flags=R user=spamd argv=/usr/bin/vendor_perl/spamc -e /usr/bin/sendmail -oi -f ${sender} ${recipient}

Ahora puede iniciar y activar spamassassin.service.

SpamAssassin combinado con Dovecot LDA / Sieve (Filtrado de correo)

Configure LDA y Sieve-Plugin como se describe en Dovecot#Sieve. Pero ignore la última línea mailbox_command... .

En su lugar, añada una tubería (pipe) en /etc/postfix/master.cf:

 dovecot   unix  -       n       n       -       -       pipe
       flags=DRhu user=vmail:vmail argv=/usr/bin/vendor_perl/spamc -u spamd -e /usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}

Y actívelo en /etc/postfix/main.cf:

 virtual_transport = dovecot

SpamAssassin combinado con Dovecot LMTP / Sieve

Configure LMTP y Sieve como se describe en Dovecot#Sieve.

Edite /etc/dovecot/conf.d/90-plugins.conf y añada:

 sieve_before = /etc/dovecot/sieve.before.d/
 sieve_extensions = +vnd.dovecot.filter
 sieve_plugins = sieve_extprograms
 sieve_filter_bin_dir = /etc/dovecot/sieve-filter
 sieve_filter_exec_timeout = 120s #this is often needed for the long running spamassassin scans, default is otherwise 10s

Cree el directorio y coloque spamassassin como un binario que pueda ser ejecutado por dovecot:

 # mkdir /etc/dovecot/sieve-filter
 # ln -s /usr/bin/vendor_perl/spamc /etc/dovecot/sieve-filter/spamc

Cree un nuevo archivo, /etc/dovecot/sieve.before.d/spamassassin.sieve que contenga:

 require [ "vnd.dovecot.filter" ];
 filter "spamc" [ "-d", "127.0.0.1", "--no-safe-fallback" ];

Compile las reglas sieve spamassassin.svbin:

 # cd /etc/dovecot/sieve.before.d
 # sievec spamassassin.sieve

Finalmente, reinicie dovecot.service.

Procesamiento de correo basado en reglas

Con los servicios de políticas se puede ajustar fácilmente el comportamiento de Postfix en la entrega de correos. postfwd y policyd (policyd-mysqlAUR, policyd-pgsqlAUR o policyd-sqliteAUR) proporcionan servicios para hacerlo. Esto le permite, por ejemplo, implementar listas grises y negras de remitentes y receptores, así como el control de políticas SPF.

Los servicios de políticas son servicios independientes y están conectados a Postfix tal que así:

/etc/postfix/main.cf
smtpd_recipient_restrictions =
  ...
  check_policy_service unix:/run/policyd.sock
  check_policy_service inet:127.0.0.1:10040

La colocación de los servicios de políticas al final de la cola reduce la carga, ya que solo se procesan los correos legítimos. Asegúrese de colocarlo antes de la primera declaración permisiva para capturar todos los mensajes entrantes.

Marco de políticas del remitente

Para utilizar el marco de políticas del remitente con Postfix, puede instale python-spf-engineAUR, python-postfix-policyd-spfAUR o postfix-policyd-spf-perlAUR.

Con spf-engine o python-postfix-policyd-spf

Edite /etc/python-policyd-spf/policyd-spf.conf a sus necesidades. Una versión ampliamente comentada se puede encontrar en /etc/python-policyd-spf/policyd-spf.conf.commented. Preste especial atención a la política de verificación HELO, ya que la configuración estándar rechaza estrictamente los fallos HELO.

En el archivo main.cf, añada un tiempo de espera para policyd:

/etc/postfix/main.cf
policy-spf_time_limit = 3600s

A continuación, añada un transporte:

/etc/postfix/master.cf
policy-spf  unix  -       n       n       -       0       spawn
     user=nobody argv=/usr/bin/policyd-spf

Por último, debe añadir policyd a smtpd_recipient_restrictions. Para minimizar la carga, sitúela al final de las restricciones pero por encima de cualquier línea reject_rbl_client DNSBL:

/etc/postfix/main.cf
smtpd_recipient_restrictions=
     ...
     permit_sasl_authenticated
     permit_mynetworks
     reject_unauth_destination
     check_policy_service unix:private/policy-spf

Ahora recargue el servicio postfix.

Puede comprobar su configuración con lo siguiente:

/etc/python-policyd-spf/policyd-spf.conf
defaultSeedOnly = 0

Con postfix-policyd-spf-perl

Realice el mismo proceso con postfix como con python-postfix-policyd-spf, pero con las siguientes diferencias:

Tiempo de espera para policyd en el archivo main.cf:

/etc/postfix/main.cf
policy_time_limit = 3600

Transporte:

/etc/postfix/master.cf
policy  unix  -       n       n       -       0       spawn
     user=nobody argv=/usr/lib/postfix/postfix-policyd-spf-perl

Añada el policyd a smtpd_recipient_restrictions:

Advertencia: Especifique check_policy_service después de jected_unauth_destination o su sistema puede convertirse en un relay abierto.
/etc/postfix/main.cf
smtpd_recipient_restrictions=
     ...
     reject_unauth_destination
     check_policy_service unix:private/policy
     ...

Esquema de reescritura del remitente

Para utilizar el esquema de reescritura del remitente con Postfix, instale postsrsdAUR y ajuste la configuración:

/etc/postsrsd/postsrsd
SRS_DOMAIN=yourdomain.tld
SRS_EXCLUDE_DOMAINS=yourotherdomain.tld,yet.anotherdomain.tld
SRS_SEPARATOR==
SRS_SECRET=/etc/postsrsd/postsrsd.secret
SRS_FORWARD_PORT=10001
SRS_REVERSE_PORT=10002
RUN_AS=postsrsd
CHROOT=/usr/lib/postsrsd

Active e inicie el demonio, asegurándose de que se ejecute también después de reiniciar. A continuación, configure Postfix en consecuencia ajustando las siguientes líneas:

/etc/postfix/main.cf
sender_canonical_maps = tcp:localhost:10001
sender_canonical_classes = envelope_sender
recipient_canonical_maps = tcp:localhost:10002
recipient_canonical_classes= envelope_recipient,header_recipient

Reinicie Postfix y comience a reenviar correo.

Solución de problemas

Warning: "database /etc/postfix/*.db is older than source file .."

Si recibe alguna o ambas advertencias con journalctl:

warning: database /etc/postfix/virtual.db is older than source file /etc/postfix/virtual
warning: database /etc/postfix/transport.db is older than source file /etc/postfix/transport

Entonces puede solucionarlo utilizando estas órdenes dependiendo de los mensajes que reciba:

postmap /etc/postfix/transport
postmap /etc/postfix/virtual

Y reiniciar postfix.service.

Véase también