Postfix 3.4는 항상 accept_unauth_destination을 사용하여 들어오는 메일을 거부합니다 - 가상 지도 무시

Postfix 3.4는 항상 accept_unauth_destination을 사용하여 들어오는 메일을 거부합니다 - 가상 지도 무시

저는 서버를 Debian 8에서 Debian 10으로 마이그레이션하고 있습니다. 지금은 메일 서버(postfix-dovecot-mysql)를 설정하려고 합니다. 큰 문제 없이 mysql(MariaDB 10.3)과 Dovecot을 설정할 수 있었지만 postfix(3.4.14)에서 동일한 문제가 계속 발생합니다.

SMTP를 통해 외부 메일 서버에서 들어오는 모든 메일은 거부됩니다.554 릴레이 액세스가 거부되었습니다.

master.cf(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

main.cf의 허용/거부 규칙은 다음과 같습니다.

#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

또한, 내가 설정한나의 목적지가상 운송을 보장하기 위해 비우기

mydestination = 

나는 다음을 확인했다.거부_unauth_destination다양한 상태 코드를 설정하여 거부를 트리거합니다.

relay_domains_reject_code = 564
access_map_reject_code    = 574
maps_rbl_reject_code      = 584

이제 상태 코드는 항상564그리고 postfix 매뉴얼에 따르면Relay_domains_reject_code다음과 같은 경우 해고됩니다.거부_unauth_destination규칙이 시작되었습니다.

내가 이해하지 못하는 부분은 (수시간의 시행착오와 인터넷 조사 후에도) mysql 로깅에 쿼리가 실행되지 않는다는 것을 보여주기 때문에 postfix가 mysql 기반 가상 맵을 무시하는 것 같다는 것입니다. 내가 볼 수 있는 유일한 쿼리는smtpd_recipient_restrictionsOK를 반환합니다.

그만큼메일.로그다음을 보여줍니다: (방금 이메일 주소를 익명으로 만들고 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 <<<

그만큼허가_인증_목적지검사가 시작되지 않습니다 - 그래야 하지만 (postfix 매뉴얼에 따르면) 수신자 주소가 둘 중 하나에 나열되어 있으면 시작됩니다.virtual_alias_domains또는virtual_mailbox_domains. 내 경우에는 다음을 실행하여 두 가지 모두 사실임을 확인했습니다.

[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

직후허가_인증_목적지시작하지 않고,거부_unauth_destination시작됩니다 - 같은 이유로 그렇게 해서는 안 되지만.

앞서 언급했듯이, mysql 로그를 보면 현재 postfix에 의해 쿼리가 실행되지 않는다는 것을 알 수 있습니다. postfix가 어떻게 욕망을 트리거하지 않게 만드는지 모르겠습니다.허가_인증_목적지하지만 트리거하려면거부_unauth_destination.

이 동작의 원인은 무엇입니까?

이것은 전체 main.cf입니다:

###########
# 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

업데이트

내 것을 바꾸면virtual_mailbox_domainsProxy:mysql 조회에서 정적 값(수신자의 도메인)으로 설정하면 모든 것이 예상대로 작동합니다.

virtual_mailbox_domains = static:recipient.com

mysql을 통한 특정 조회가 문제인 것 같습니다. 문제가 존재하는 것 같기 때문에 이것은 특히 이상합니다.smtpd_relay_restrictions(mysql 쿼리가 실행되지 않음) 잘 작동합니다 (mysql 쿼리가 실행됨).smtpd_recipient_restrictions

답변1

마침내 Proxymap의 자세한 로그를 보고 이 문제를 정리할 수 있었습니다.

mysql 쿼리에 전달되는 키는 실제로 전체 이메일 주소가 아닌 수신자의 도메인입니다.

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

이 경우에는 다음과 같습니다.%디매개변수(실제로 도메인 이름을 전달해야 함)는 mysql 쿼리에 사용할 수 없습니다. 사용%에스(원래 입력 키를 전달하는) 마침내 작동했습니다.

나는 실제로 그것을 깨달았다.%디실행하면 비어 있습니다우편 지도도메인만 있고 결과가 없습니다.

[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:~]# 

관련 정보