要更改的設置以允許 PostFix 接受來自經過身份驗證的使用者的傳出郵件
我有一個郵件伺服器,可以為 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 條目,並將第一個欄位從
smtp
to587
或您要偵聽的任何埠更改。如果要使用埠 465,請取消註釋該smtps
條目。我不建議在此埠上使用未加密的 smtp,因為它可能只會引起郵件客戶端的混亂和問題(因為 465 被指定為 ssl 埠)。您尋找啟用身份驗證的選項是
smtpd_sasl_auth_enable=yes
和smtpd_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 手冊頁,以便您在實施它們之前了解它們在做什麼。