ฉันมีการตั้งค่า postfix เช่นนี้:

     __________                     +-----+     |F|        +-----+
  __(          )____               /     /|     |I|       /     /|
 (___  (         ___)             /     / |     |R|      /     / |
    _(  Internet )     <=====>   +-----+  |  <==|E|==>  +-----+  |
   (___,     )   _)              |  M  |  |     |W|     |  H  |  |
       (_________)               |  A  |  +     |A|     |  O  |  +
                                 |  I  | /      |L|     |  S  | /
                                 |  L  |/       |L|     |  T  |/
                                 +--+--+        | |     +-----+

ฉันมีการกำหนดค่าต่างๆ ในตอนนี้เพื่อส่งต่ออีเมลจากmailไปยังhost. นี่คือผลลัพธ์ของpostconf -non mail:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
inet_interfaces = all
inet_protocols = ipv4
mailbox_size_limit = 0
message_size_limit = 41943040
mydestination =
myhostname = example.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 203.0.113.190
readme_directory = no
recipient_delimiter = +
relay_domains = host.example.com, example.com, example.org,
relayhost = [host.example.com]:587
smtp_tls_CApath = /etc/ssl/certs
smtp_tls_loglevel = 1
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination,
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination,
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = smtpd
smtpd_sasl_security_options = noanonymous, noplaintext,
smtpd_sasl_tls_security_options = noanonymous,
smtpd_sasl_type = cyrus
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_loglevel = 1
smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5,
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3,
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
tls_preempt_cipherlist = yes

นี้ทำงานได้อย่างสมบูรณ์แบบ - ฉันสามารถส่งอีเมลจาก Gmail และผู้ให้บริการอื่น ๆ hostและพวกเขาต้องจบออกมาในกล่องจดหมายของฉันใน

แต่เมื่อฉันพยายามที่จะส่งอีเมลจากhostผมค่อนข้างมั่นใจว่ามันพยายามที่จะถ่ายทอดอีเมลกลับมาจากไปmail hostฉันเห็นสิ่งนี้ในhostบันทึก:

Dec 28 16:44:28 host postfix/submission/smtpd[29743]: warning: hostname mail2.example.com does not resolve to address 203.0.113.14: Name or service not known
Dec 28 16:44:28 host postfix/submission/smtpd[29743]: connect from unknown[203.0.113.14]
Dec 28 16:44:28 host postfix/submission/smtpd[29743]: Anonymous TLS connection established from unknown[203.0.113.14]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Dec 28 16:44:28 host postfix/submission/smtpd[29743]: NOQUEUE: reject: RCPT from unknown[203.0.113.14]: 454 4.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<example.com>
Dec 28 16:44:28 host postfix/submission/smtpd[29743]: disconnect from unknown[203.0.113.14]

จากนั้นmailฉันได้รับบันทึกเหล่านี้:

Dec 28 16:54:27 mail postfix/smtp[17899]: Untrusted TLS connection established to host.example.com[203.0.113.190]:587: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Dec 28 16:54:28 mail postfix/smtp[17899]: 7B6A620FFB: to=<[email protected]>, relay=host.example.com[203.0.113.190]:587, delay=1064, delays=1063/0.01/0.71/0.08, dsn=4.7.1, status=deferred (host host.example.com[203.0.113.190] said: 454 4.7.1 <[email protected]>: Relay access denied (in reply to RCPT TO command))

บนhostนี่คือpostconf -nผลลัพธ์ของฉัน:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
inet_interfaces = all
inet_protocols = ipv4
mailbox_size_limit = 0
message_size_limit = 41943040
mydestination = host, host.example.com, example.com
myhostname = host.example.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
readme_directory = no
recipient_delimiter = +
relay_domains = $mydestination
relayhost = example.com:587
smtp_tls_CApath = /etc/ssl/certs
smtp_tls_loglevel = 1
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination,
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination,
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = smtpd
smtpd_sasl_security_options = noanonymous, noplaintext,
smtpd_sasl_tls_security_options = noanonymous,
smtpd_sasl_type = cyrus
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_loglevel = 1
smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5,
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3,
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
tls_preempt_cipherlist = yes
postconf: warning: /etc/postfix/main.cf: unused parameter: compatibility_level=2

โดยทั่วไปสิ่งที่ฉันต้องการ:

บนhostหรือmail:

  • ถ้าอีเมลถูกส่งไปยัง[email protected], [email protected], [email protected], [email protected], [email protected]ฉันต้องการให้ส่งไปยังผู้ใช้ในเครื่องบน `host
  • ถ้าอีเมลที่ถูกส่งไปยังที่ใด - [email protected], [email protected], [email protected]หรือที่ใดก็ตามที่มันจะเกิดขึ้น - ฉันต้องการhostที่จะถ่ายทอดผ่านmailและฉันต้องการmailที่จะส่งอีเมล์ไปยังเซิร์ฟเวอร์ของสิ่งที่มันควรจะส่งไปยัง

ฉันจะกำหนดค่า postfix ให้ทำเช่นนี้ได้อย่างไร

answer

ปรากฎว่าวิธีนี้ง่ายกว่าที่ฉันคาดไว้ พบเบาะแสในเอกสารประกอบสำหรับrelay_transport :

In order of decreasing precedence, the nexthop destination is taken from $relay_transport, $sender_dependent_relayhost_maps, $relayhost, or from the recipient domain. This information can be overruled with the transport(5) table

(เน้นของฉัน)

ฉันต้องการพลิกสิ่งนั้น - ฉันต้องการให้โดเมนผู้รับมาก่อนแล้วจึงโฮสต์รีเลย์ เนื่องจากเอกสารบอกว่าฉันสามารถดูตารางการขนส่ง(5) นั่นคือสิ่งที่ฉันทำ และฉันพบอาหารอันโอชะนี้:

local_transport (default: local:$myhostname)
          This is the default for final delivery to  domains  listed  with
          mydestination,  and  for  [ipaddress]  destinations  that  match
          $inet_interfaces or $proxy_interfaces. The default nexthop  des-
          tination is the MTA hostname.

ที่ดูมีแนวโน้ม หากฉันเข้าใจถูกต้อง แสดงว่าฉันสามารถใช้smtp:host.example.com:587เป็น my local_transportและ use mydestinationแทนrelay_domains. และคาดเดาอะไร? มันได้ผล!

ดังนั้นแทนที่จะ:

mydestination =
relay_domains = host.example.com, example.com, example.org,
relayhost = [host.example.com]:587

ฉันเพิ่งมี

mydestination = host.example.com, example.com, example.org,
local_transport = smtp:[host.example.com]:587

และทำงานได้ตรงตามที่ต้องการ สำเร็จ!