Estoy migrando nuestros servidores de Debian 8 a Debian 10. En este momento, estoy intentando configurar nuestro servidor de correo (postfix-dovecot-mysql). Si bien pude configurar mysql (MariaDB 10.3) como tal y Dovecot sin ningún problema significativo, sigo teniendo el mismo problema con postfix (3.4.14):
Se rechaza todo el correo que llega desde servidores de correo externos a través de SMTP:554 Acceso de retransmisión denegado
master.cf (para servicio smtp):
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
# ==========================================================================
smtp inet n - y - - smtpd -v
-o smtpd_sasl_auth_enable=no
Mis reglas de permiso/rechazo en main.cf son:
#1 client
smtpd_client_restrictions = permit_mynetworks
permit_sasl_authenticated
reject_unknown_client_hostname
#2 helo
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks
reject_invalid_helo_hostname
reject_non_fqdn_helo_hostname
reject_unknown_helo_hostname
#3 sender
smtpd_sender_restrictions = permit_mynetworks
permit_sasl_authenticated
reject_non_fqdn_sender
reject_sender_login_mismatch
#4 relay
smtpd_relay_restrictions = reject_non_fqdn_recipient
permit_mynetworks
permit_sasl_authenticated
permit_auth_destination
reject_unauth_destination
#5 recipient
smtpd_recipient_restrictions = check_recipient_access proxy:mysql:/etc/postfix/mysql/recipient_access.cf
#6 data
smtpd_data_restrictions = reject_unauth_pipelining
Además, puseMi destinovaciar para garantizar el transporte virtual
mydestination =
He confirmado que elrechazar_unauth_destinationactiva el rechazo estableciendo diferentes códigos de estado:
relay_domains_reject_code = 564
access_map_reject_code = 574
maps_rbl_reject_code = 584
El código de estado ahora es siempre564y según el manual de postfix elcódigo_rechazado_dominios_retransmisiónes despedido si elrechazar_unauth_destinationla regla entró en vigor.
La parte que no entiendo (incluso después de muchas horas de prueba y error, así como de investigación en Internet) es que postfix parece ignorar mis mapas virtuales basados en MySQL, ya que el registro de MySQL muestra que no se ejecuta ninguna consulta. La única consulta que puedo ver es la desmtpd_recipient_restrictionsque devuelve OK.
Elregistro electrónicomuestra lo siguiente: (Acabo de hacer que las direcciones de correo electrónico sean anónimas y enmascaré las direcciones IP):
postfix/smtpd[6963]: >>> START Recipient address RESTRICTIONS <<<
postfix/smtpd[6963]: generic_checks: name=reject_non_fqdn_recipient
postfix/smtpd[6963]: reject_non_fqdn_address: [email protected]
postfix/smtpd[6963]: generic_checks: name=reject_non_fqdn_recipient status=0
postfix/smtpd[6963]: generic_checks: name=permit_mynetworks
postfix/smtpd[6963]: generic_checks: name=permit_mynetworks status=0
postfix/smtpd[6963]: generic_checks: name=permit_sasl_authenticated
postfix/smtpd[6963]: generic_checks: name=permit_sasl_authenticated status=0
postfix/smtpd[6963]: generic_checks: name=permit_auth_destination
postfix/smtpd[6963]: permit_auth_destination: [email protected]
postfix/smtpd[6963]: ctable_locate: leave existing entry key [email protected][email protected]
postfix/smtpd[6963]: generic_checks: name=permit_auth_destination status=0
postfix/smtpd[6963]: generic_checks: name=reject_unauth_destination
postfix/smtpd[6963]: reject_unauth_destination: [email protected]
postfix/smtpd[6963]: permit_auth_destination: [email protected]
postfix/smtpd[6963]: ctable_locate: leave existing entry key [email protected][email protected]
postfix/smtpd[6963]: NOQUEUE: reject: RCPT from x.x.x.x[y.y.y.y]: 564 5.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=SMTP helo=<z.z.z.z>
postfix/smtpd[6963]: generic_checks: name=reject_unauth_destination status=2
postfix/smtpd[6963]: >>> END Recipient address RESTRICTIONS <<<
Elpermiso_auth_destinationLa verificación no se activa, aunque debería hacerlo, ya que (según el manual de Postfix) se activa si la dirección del destinatario aparece en cualquiera de los dosdominios_alias_virtualesodominios_buzón_virtual. He confirmado que ambos son ciertos en mi caso ejecutando:
[19:00:39][me@server:~]# postmap -q [email protected] proxy:mysql:/etc/postfix/mysql/virtual_alias_domains.cf
recipient.com
[19:00:39][me@server:~]# postmap -q [email protected] proxy:mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
recipient.com
Justo después delpermiso_auth_destinationsin entrar en acción, elrechazar_unauth_destinationse activa, aunque no debería hacerlo, por la misma razón.
Como se mencionó anteriormente, puedo ver en los registros de MySQL que Postfix no ejecuta ninguna consulta en este momento. No tengo idea de cómo Postfix toma la decisión de no activarpermiso_auth_destinationpero para desencadenarrechazar_unauth_destination.
¿Qué podría estar causando este comportamiento?
Este es el main.cf completo:
###########
# Network #
###########
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
#mydomain =
myhostname = mail.server.com
mydestination =
inet_interfaces = all
inet_protocols = ipv4, ipv6
smtp_address_preference = ipv4
smtpd_banner = $myhostname ESMTP $mail_name
#########
# Local #
#########
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
###########
# Virtual #
###########
proxy_read_maps = proxy:mysql:/etc/postfix/mysql/virtual_alias_maps.cf
proxy:mysql:/etc/postfix/mysql/virtual_alias_domains.cf
proxy:mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf
proxy:mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
proxy:mysql:/etc/postfix/mysql/recipient_access.cf
virtual_mailbox_base = /home/vmail/mailboxes
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/virtual_alias_maps.cf
virtual_alias_domains = proxy:mysql:/etc/postfix/mysql/virtual_alias_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000
local_recipient_maps = $virtual_mailbox_maps
################
# TLS settings #
################
tls_ssl_options = NO_COMPRESSION
################
# TLS outbound #
################
smtp_dns_support_level = dnssec
smtp_tls_security_level = may
proxy:mysql:/etc/postfix/msql/smtp_tls_policy_maps.cf
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_protocols = !SSLv3, TLSv1.3
smtp_tls_ciphers = high
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
###############
# TLS inbound #
###############
smtpd_use_tls = yes
smtpd_tls_security_level = may
smtpd_tls_protocols = !SSLv3, TLSv1.3
smtpd_tls_ciphers = high
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_cert_file = /etc/letsencrypt/getssl-certs/mail.server.com/chain.pem
smtpd_tls_key_file = /etc/letsencrypt/getssl-certs/mail.server.com/key.pem
###################################
# Local mail delivery via Dovecot #
###################################
virtual_transport = lmtp:unix:private/dovecot-lmtp
#############
# SASL auth #
#############
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
#########
# Relay #
#########
#1 client
smtpd_client_restrictions = permit_mynetworks
permit_sasl_authenticated
reject_unknown_client_hostname
#2 helo
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks
reject_invalid_helo_hostname
reject_non_fqdn_helo_hostname
reject_unknown_helo_hostname
#3 sender
smtpd_sender_restrictions = permit_mynetworks
permit_sasl_authenticated
reject_non_fqdn_sender
reject_sender_login_mismatch
#4 relay
smtpd_relay_restrictions = reject_non_fqdn_recipient
permit_mynetworks
permit_sasl_authenticated
permit_auth_destination
reject_unauth_destination
#5 recipient
smtpd_recipient_restrictions = check_recipient_access proxy:mysql:/etc/postfix/mysql/recipient_access.cf
#6 data
smtpd_data_restrictions = reject_unauth_pipelining
#7 end-of-data
relay_domains_reject_code = 564
access_map_reject_code = 574
maps_rbl_reject_code = 584
#################
# Miscellaneous #
#################
mail_owner = postfix
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 2
ACTUALIZAR
Si cambio midominios_buzón_virtualconfigurando desde la búsqueda proxy:mysql a un valor estático (el dominio del destinatario), todo funciona como se esperaba:
virtual_mailbox_domains = static:recipient.com
Parece que la búsqueda específica a través de MySQL es el problema. Esto es particularmente extraño, ya que el problema parece existir para elsmtpd_relay_restriccionessolamente (no se ejecutó ninguna consulta mysql). Funciona bien (se ejecuta la consulta MySQL) para elsmtpd_recipient_restrictions
Respuesta1
Finalmente pude solucionar este problema mirando los registros detallados de proxymap.
La clave que se entrega a la consulta MySQL es en realidad sólo el dominio del destinatario, no la dirección de correo electrónico completa:
postfix/proxymap[23555]: master_notify: status 0
postfix/proxymap[23555]: proxymap socket: wanted attribute: request
postfix/proxymap[23555]: input attribute name: request
postfix/proxymap[23555]: input attribute value: lookup
postfix/proxymap[23555]: proxymap socket: wanted attribute: table
postfix/proxymap[23555]: input attribute name: table
postfix/proxymap[23555]: input attribute value: mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
postfix/proxymap[23555]: proxymap socket: wanted attribute: flags
postfix/proxymap[23555]: input attribute name: flags
postfix/proxymap[23555]: input attribute value: 524352
postfix/proxymap[23555]: proxymap socket: wanted attribute: key
postfix/proxymap[23555]: input attribute name: key
postfix/proxymap[23555]: input attribute value: recipient.com
postfix/proxymap[23555]: proxymap socket: wanted attribute: (list terminator)
postfix/proxymap[23555]: input attribute name: (end)
postfix/proxymap[23555]: proxy_map_find: mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf:
postfix/proxymap[23555]: send attr status = 1
postfix/proxymap[23555]: send attr value =
postfix/proxymap[23555]: master_notify: status 1
En este caso parece que el%dEl parámetro (que en realidad debería llevar el nombre de dominio) no se puede utilizar para la consulta MySQL. Usando%s(que lleva la clave de entrada original) finalmente funcionó.
De hecho me di cuenta de que%destá vacío al ejecutarmapa postalsolo con el dominio y sin obtener resultado:
[me@server:~]# postmap -q [email protected] proxy:mysql:/etc/postfix/mysql/virtual_alias_domains.cf
recipient.com
[me@server:~]# postmap -q recipient.com proxy:mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
[me@server:~]#