Postfix (Español) - ArchWiki

Jump to content
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.

Artículos relacionados

- Postfix with SASL
- Virtual user mail system
- OpenDMARC
- OpenDKIM

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 `tú` 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

- Documentación oficial
- Documentación de Ubuntu sobre Postfix

Category:

- Mail server (Español)