Esta es una entrada dentro de la serie para la instalación de un servidor de correo completo. Índice completo de contenidos pincha aquí.
Tabla de contenidos
Postfix
En esta entrada procederemos a la configuración del servicio de Postfix.
main.cf
Copiamos el archivo main.cf original:
cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
El contenido del archivo ya modificado /etc/postfix/main.cf. No entraremos en detalle de lo que significa cada apartado para no extender la entrada, aunque se detalla alguna explicación en las mismas líneas de configuración:
# 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 # TLS parameters smtpd_tls_cert_file=/etc/letsencrypt/live/email.tiraquelibras.com/fullchain.pem smtpd_tls_key_file=/etc/letsencrypt/live/email.tiraquelibras.com/privkey.pem smtpd_use_tls=yes smtpd_tls_auth_only = yes smtp_tls_security_level = may smtpd_tls_security_level = may smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous smtpd_tls_protocols=!SSLv2,!SSLv3 smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3 # Authentication smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for # information on enabling SSL in the smtp client. # Restrictions smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, check_helo_access hash:/etc/postfix/helo_access, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_sender_access hash:/etc/postfix/lista_blanca, check_sender_access hash:/etc/postfix/lista_negra, reject_non_fqdn_recipient, 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 # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for # information on enabling SSL in the smtp client. myhostname = email.tiraquelibras.com alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydomain = email.tiraquelibras.com myorigin = $mydomain mydestination = localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 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
En esta configuración se requiere autenticación válida con usuario y contraseña, se publican listas blancas y negras, IPs permitidas para el uso sin autenticación, rechazo por RBL, entre otras cosas.
bounce.cf
Ahora creamos el archivo con los mensajes de respuesta o rebote personalizados /etc/postfix/bounce.cf:
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
master.cf
Copiamos el archivo original:
cp /etc/postfix/master.cf /etc/postfix/master.cf.orig
Archivos MySQL
Creamos el archivo para que Postfix chequee si existen los dominios /etc/postfix/mysql-virtual-mailbox-domains.cf
user = mailuser password = supersecretpassword hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s' and active='1'
Ahora el archivo para que Postfix chequee si existen los buzones /etc/postfix/mysql-virtual-mailbox-maps.cf
user = mailuser password = supersecretpassword hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s' and active='1'
Y por último lo mismo para los alias /etc/postfix/mysql-virtual-alias-maps.cf
user = mailuser password = supersecretpassword hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s' and active='1'
Para finalizar creamos el siguiente archivo que también chequea el chequeo de Postfix para los alias /etc/postfix/mysql-virtual-email2email.cf
user = mailuser password = supersecretpassword hosts = 127.0.0.1 dbname = mailserver query = SELECT email FROM virtual_users WHERE email='%s' and active='1'
Reiniciamos Postfix
systemctl restart postfix
Confirmar buzón
Confirmamos la existencia del buzón creado en la entrada anterior, accede a esta pinchando aquí.
# postmap -q sbrodriguez@tiraquelibras.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf 1
Si el comando es correcto la respuesta será un 1, de lo contrario no devolverá nada.
Podríamos comprobar también los alias consultando el archivo mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Archivos varios
Ejemplo del contenido de archivos varios usados en los chequeos de Postfix anteriormente indicados:
helo_access
#yeloquehay.com REJECT Get lost - you're lying about who you are #correu.yeloquehay.com REJECT Get lost - you're lying about who you are #raspberrypi OK
lista_blanca
pi@raspberrypi.com OK 192.168.0.17 OK
lista_negra
address.to.reject@spam.com REJECT Sorry, you cannot write to this address.
header_checks
Aquí indicaremos que se escriban en el log todos los asuntos de los mensajes entrantes y salientes.
#/^(Subject: ***** SPAM )(.+)$/ DISCARD #/^From: .*postmaster\@yeloquehay.com/ OK #/^Subject: \*\*\*\*\* SPAM/ REJECT SPAM confirmed, contact to postmaster@yeloquehay.com /^subject:/ WARN #/^to:/ WARN #/^from:/ WARN #/^Subject:/ WARN #/^To:/ WARN #/^From:/ WARN
A todos estos archivos no son consultados por Postifx cirectamente, sino que tendremos que crear el archivo .db correspondiente para que Postfix los interprete, con el comando:
postmap nom_archivo
Y reiniciamos Postfix:
systemctl reload postfix
master.cf
Ahora editamos el archivo master.cf, en donde empieza y monitoriza todos los procesos de Postfix. Esta configuración lista todos los programas e información sobre como deberían de iniciarse.
Primero hacemos una copia del archivo:
cp /etc/postfix/master.cf /etc/postfix/master.cf.orig
Modificamos las siguientes líneas, dejando el resto como está:
# # 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 #smtpd pass - - y - - smtpd #dnsblog unix - - y - 0 dnsblog #tlsproxy unix - - y - 0 tlsproxy 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_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -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 smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -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
Ahora cambiamos los permisos al directorio /etc/postfix con el comando:
sudo chmod -R o-rwx /etc/postfix
Reiniciamos Postfix:
systemctl restart postfix
PostfixSRS
Instalamos el paquete:
apt-get install postsrsd
Configuramos Postfix editando el archivo /etc/postfix/main.cf con las siguientes líneas:
# PostSRSd settings. sender_canonical_maps = tcp:localhost:10001 sender_canonical_classes = envelope_sender recipient_canonical_maps = tcp:localhost:10002 recipient_canonical_classes= envelope_recipient,header_recipient
Habilitamos SRS con
systemctl enable postsrsd
Reiniciamos Postfix con el comando
systemctl postfix reload
Ahora cuando se realice un reenvío o forward se escribirá una cabecera similar a la siguiente:
Sep 2 17:07:44 h2847530 postfix/qmgr[4620]: C82BFD20376: from=
<SRS0=nKtb=W5=yeloquehay.com=sbrodriguez@correu2.yeloquehay.com>
, size=2703, nrcpt=1 (queue active)
Vemos como SRS modifica la dirección del From:
<SRS0=nKtb=W5=yeloquehay.com=sbrodriguez@correu2.yeloquehay.com>
Mirando las cabeceras del mensaje podemos ver el from real y la IP del servidor original que realiza el envío, y no el que realiza el reenvío o forward:
Índice general pincha aquí.