Email

要更改的設置以允許 PostFix 接受來自經過身份驗證的使用者的傳出郵件

  • February 27, 2012

我有一個郵件伺服器,可以為 MySQL 數據庫中的使用者接收郵件,並讓他們通過 POP3 下載這些郵件。這一切都很好。我的 PostFix 版本是 2.7.0,在 Ubuntu Server 10.04 上。

問題是發送郵件。有幾個問題:

1.伺服器監聽埠 25,但 ISP 阻止了 25,所以我需要添加一個監聽埠。這應該是 465 還是 587?或兩者?如何為安全 SMTP 添加額外埠?

我需要接受 25 上的所有連接而無需身份驗證,但只接受系統上有效收件人/域的郵件並阻止中繼。這目前正在工作。

埠 587 或 465 應允許中繼到任何地址/域,但僅適用於經過身份驗證的有效使用者。

我的 master.cf 文件的頂部是:

smtp      inet  n       -       -       -       -       smtpd
#submission inet n       -       -       -       -       smtpd
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#smtps     inet  n       -       -       -       -       smtpd
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

我猜我可以取消註釋其中一行,但我不知道要取消註釋哪一行或哪些選項。

另外,為什麼 SMTP 沒有拒絕限制?是不是因為它總是接受埠 25 上的所有內容,然後決定以後是否保留它們?從埠 25 進入但此處沒有有效域的消息會去哪裡?我對我們服務的領域有一個概括性的看法。他們會反彈嗎?我讀到彈跳很糟糕,因為它會讓你看起來像一個垃圾郵件發送者。

2.我的使用者已經在一個接收郵件的 MySQL 數據庫中,我想使用這個相同的數據庫來允許傳出郵件。

main.cf 看起來像:

smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no    
readme_directory = no

# TLS parameters
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/ssl/certs/mail.crt
smtpd_tls_key_file = /etc/ssl/private/mail.key.insecure 

myhostname = mysite.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination =
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-forwards.cf, mysql:/etc/postfix/mysql-email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_can$

我要進行哪些更改以使其對來自現有使用者數據庫的發件人進行身份驗證?

3.目前,由 PHP 的 mail() 命令創建的來自該伺服器的郵件僅發送給有效使用者的 mysql 數據庫中的使用者。我需要 PHP 能夠向任何地方的任何使用者發送郵件。我應該設置 PHP 在它工作後通過 SMTP 進行身份驗證嗎?

更新:

我已將我的 master.cf 更改為如下所示,並在防火牆中打開了 587。

smtp      inet  n       -       -       -       -       smtpd
submission inet n       -       -       -       -       smtpd
 -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject

現在我無法在 587 上遠端登錄:

telnet xxx.xxx.xxx.xx 587
Trying xxx.xxx.xxx.xx...
Connected to xxx.xxx.xxx.xx.
Escape character is '^]'.
220 mydomain.com ESMTP Postfix
EHLO you
250-mydomain.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: <me@example.com>
530 5.7.0 Must issue a STARTTLS command first
STARTTLS
220 2.0.0 Ready to start TLS

好的,所以我必須使用很好的 TLS,但是一旦 TLS 執行,我不知道如何進一步測試?

當我在埠 25 上進行 EHLO 時,我得到:

250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN

我不希望使用者能夠發送明文密碼,我可以禁用普通登錄嗎?

更新 2:

我原來的 /etc/postfix/sasl/smtpd.conf :

pwcheck_method: saslauthd
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mailusr
sql_passwd: secret
sql_database: mail
sql_select: select password from users where email = '%u'

以上在嘗試進行身份驗證時執行此操作:

Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: < c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: dGVzdEBhcsEZ2Vdci1jb20=
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: xsasl_cyrus_server_next: decoded response: test@mydomain.com
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: xsasl_cyrus_server_auth_response: uncoded server challenge: Password:
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: > c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: 334 UGFzc3dvcmQ6
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: < c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: dGVzdGluZw==
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: xsasl_cyrus_server_next: decoded response: testing
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: warning: c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: SASL LOGIN authentication failed: authentication failure
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: > c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: 535 5.7.8 Error: authentication failed: authentication failure

我還嘗試根據建議的教程將文件更改為以下內容:

pwcheck_method: authdaemond
mech_list: PLAIN LOGIN
authdaemond_path: courier-authdaemon-socket

但我無法在指南的最後一步創建硬連結:

ln /var/run/courier/authdaemon/socket courier-authdaemon-socket

因為 /var/run 在單獨的分區上。我創建了一個軟連結,但身份驗證仍然失敗。我認為 MySQL 的第一個範例似乎更正確。

1)

要讓 smtpd 在備用埠上偵聽,您修改 master.cf 複製現有的 smtpd 條目,並將第一個欄位從smtpto587或您要偵聽的任何埠更改。如果要使用埠 465,請取消註釋該smtps條目。我不建議在此埠上使用未加密的 smtp,因為它可能只會引起郵件客戶端的混亂和問題(因為 465 被指定為 ssl 埠)。

您尋找啟用身份驗證的選項是smtpd_sasl_auth_enable=yessmtpd_recipient_restrictions=permit_sasl_authenticated(你已經擁有了,所以你只需要配置它)。由於您在 main.cf 中有這些設置,因此它們已為所有埠啟用。沒有理由只允許它們在 25 以外的埠上。如果郵件未經身份驗證通過,則僅接受本地遞送。如果它通過身份驗證,它可以去任何地方。

我不確定您所說的“為什麼 SMTP 沒有拒絕限制?”是什麼意思。

2)

您必須使用 SASL 進行身份驗證。因此身份驗證由 postfix 與之對話的外部服務提供。您仍然可以使用現有的 MySQL 數據庫,只需配置 SASL 服務即可使用它。Cyrus SASL 是 postfix 中的預設提供程序。更多內容可以在這裡閱讀。

3)

你已經有了smtpd_recipient_restrictions = permit_mynetworks, 和mynetworks = 127.0.0.0/8, 所以來自 localhost 的任何東西都會被接受,包括 PHP。

注意 我建議查看所有可用的選項smtpd_recipient_restrictions。只需將其設置為此處提供的值,其他任何事情都不會導致不良行為。我已經閱讀了我提到的所有設置的postconf 手冊頁,以便您在實施它們之前了解它們在做什麼。

引用自:https://serverfault.com/questions/363882