저는 서버를 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:~]#