參考地址:http://guailele.blog.51cto.com/1156442/780223
1、打開 smtp 的認證模塊
在/etc/postfix/main.cf文件最后加上:
smtpd_sasl_auth_enable = yes
smtpd_delay_reject=yes
smtpd_recipient_restrictions = permit_mynetworkspermit_sasl_authenticated permit_auth_destination reject
smtpd_client_restrictions = permit_sasl_authenticated
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
這樣用戶的postfix就支持smtp認證了
#1、postfix配置說明(強烈建議參看“postfix權威指南 第十一章 反垃圾郵件”)
#fqdn格式:完全限定域名格式,即用點分隔開的包括域名和主機名的主機全名
# smtpd related config
smtpd_recipient_restrictions =
permit_mynetworks, #檢測客戶端是否來自mynetworks或者mynetworks_style的網絡,是的話返回OK,否則返回DUNNO狀態碼。
permit_sasl_authenticated, #檢測用戶認證是否通過的,認證通過的返回狀態OK,否則返回DUNNO狀態碼。
reject_non_fqdn_hostname, #HELO/EHLO時:客戶端提供的主機名不是RFC要求的完整形式(FQND),返回REJECT,否則返回DUNNO狀態碼。
reject_non_fqdn_sender, #MAIL FROM時:客戶端提供的主機名不是RFC要求的完整形式(FQND),返回REJECT,否則返回DUNNO狀態碼。
reject_non_fqdn_recipient, #RCPT TO時:客戶端提供的主機名不是RFC要求的完整形式(FQND),返回REJECT,否則返回DUNNO狀態碼。
reject_unauth_destination, #RCPT TO時:收件人不在postfix管轄的區域(由mydestination定義),返回REJECT,否則返回DUNNO狀態碼。
reject_unauth_pipelining, #禁止非授權客戶端使用pipelining
reject_invalid_hostname #HELO/EHLO時:客戶端提供的主機名不是有效的主機名時,返回REJECT,否則返回DUNNO狀態碼。
# SMTP sender login matching config
smtpd_sender_restrictions =
permit_mynetworks, #檢測客戶端是否來自mynetworks或者mynetworks_style的網絡,是的話返回OK,否則返回DUNNO狀態碼。
reject_sender_login_mismatch, #拒絕發送者在$smtpd_sender_owner_maps中所匹配的用戶名和sasl登錄名不一致的連接。
reject_authenticated_sender_login_mismatch, #拒絕認證成功的發送者在$smtpd_sender_owner_maps中所匹配的用戶名和sasl登錄名不一致的連接。
reject_unauthenticated_sender_login_mismatch #拒絕認證失敗的發送者在$smtpd_sender_owner_maps中所匹配的用戶名和sasl登錄名不一致的連接。
smtpd_sender_login_maps =
mysql:/etc/postfix/mysql_virtual_sender_maps.cf,
mysql:/etc/postfix/mysql_virtual_alias_maps.cf
#2、smtp會話過程的各個限制條件參數:詳看圖片“stmp對話過程以及各個階段對於的限制條件.png”,共分為7個順序過程的參數限制:
1、smtpd_client_restrictions
2、smtpd_helo_restrictions
3、smtpd_sender_restrictions
4、smtpd_recipient_restrictions
5、smtpd_data_restrictions
6、header_checks
7、body_checks
#3、會話過程對比:
#---------------------------------------------------------------------------
root@mail:/etc/postfix# telnet mail.jmail.com 25
Trying 192.168.0.234...
Connected to mail.jmail.com.
Escape character is '^]'.
220 ESMTP #smtpd_client_restrictions
#---------------------------------------------------------------------------
ehlo mail.zmail.com #smtpd_helo_restrictions
250-mail.jmail.com
250-PIPELINING
250-SIZE 5242880
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
#---------------------------------------------------------------------------
MAIL FROM:<zyq@zmail.com> #smtpd_sender_restrictions
250 2.1.0 Ok
#---------------------------------------------------------------------------
RCPT TO:<jj@extmail.org> #smtpd_recipient_restrictions
250 2.1.5 Ok
#---------------------------------------------------------------------------
DATA #smtpd_data_restrictions
354 End data with <CR><LF>.<CR><LF>
#---------------------------------------------------------------------------
Client: To: jingjing<jj@extmail.org> #header_checks
From:<zyq@zmail.com>
Subject:SMTP Test!
#---------------------------------------------------------------------------
this is a test message body! #body_checks
.
250 2.0.0 Ok: queued as 959FDE03CA
#---------------------------------------------------------------------------
#4、限制條件與對應的受檢信息
限制條件 客戶端提供的受檢信息
#RBL:實時黑名單
reject_rbl_client 客戶端提供的IP地址或則主機名稱 #smtpd_client_restrictions
reject_rhsbl_client
reject_unknown_client
check_client_access type:mapname helo提供的主機名稱 #smtpd_helo_restrictions
permit_naked_ip_address
reject_invalid_hostname
reject_non_fqdn_hosname
reject_unknown_hosname
check_helo_access type:mapname MAIL FROM提供的寄件人郵件地址 #smtpd_sender_restrictions
reject_non_fqdn_sender
reject_rhsbl_sender
reject_unknown_sender_domain
check_sender_access type:mapname RCPT TO提供的收件人的地址 #smtpd_recipient_restrictions
permit_auth_destination
permit_mx_backup
reject_non_fqdn_recipient
reject_unauth_destination
reject_unkownn_recipient_domain
check_recipient_access type:mapname
reject_unauth_pipeling DATA命令
permint 無條件批准
reject 無條件拒絕
defer 無條件延遲
warn_if_reject 將原本的REJECT動作改為WARN(eg:warn_if_reject reject_unauth_destination 注意此命令必須放在其他條件之前,不能單獨調用)
reject_unauth_pipelining 禁止非授權客戶端使用pipelining
#參數詳細說明
reject_rbl_client #拒絕來自屬於rbl和rhsbl列表中的地址進行連接。通過檢查一個ip地址或域名是否存在於domain.tld的rbl或rhsbl中,可以判斷該客戶端是否被列入了domain.tld的實時黑名單,從而決定是否接受連接。
reject_rhsbl_client #拒絕來自屬於rbl和rhsbl列表中的地址進行連接。通過檢查一個ip地址或域名是否存在於domain.tld的rbl或rhsbl中,可以判斷該客戶端是否被列入了domain.tld的實時黑名單,從而決定是否接受連接。
reject_unknown_client #拒絕客戶的地址沒有對應的dns的a記錄或ptr記錄的連接。通常有些機器,尤其是個人撥號用戶的機器沒有對應的a記錄或ptr記錄,所以要注意漫游用戶的使用(漫游用戶是指不在$mynetworks中,比如在別的isp撥號上網的用戶。通常用smtp認證來解決這個問題)。
check_client_access type:mapname
permit_naked_ip_address #允許直接使用ip地址的連接。通常在helo/ehlo中使用主機名而不是ip地址。
reject_invalid_hostname #拒絕無效格式的主機名的連接。
reject_non_fqdn_hosname #HELO/EHLO時:客戶端提供的主機名不是RFC要求的完整形式(FQND),返回REJECT,否則返回DUNNO狀態碼。
reject_unknown_hosname #HELO/EHLO時:客戶端提供的主機名未知時,返回REJECT,否則返回DUNNO狀態碼。
check_helo_access type:mapname
reject_non_fqdn_sender #MAIL FROM時:客戶端提供的服務器主機名不是RFC要求的完整形式(FQND),返回REJECT,否則返回DUNNO狀態碼。
reject_rhsbl_sender #MAIL FROM時:拒絕來自實時黑名單的用戶主機
reject_unknown_sender_domain #MAIL FROM時:提供的網域無效時(DNS查詢),返回REJECT,否則返回DUNNO狀態碼。
check_sender_access type:mapname
permit_auth_destination #RCPT TO時:
#允許發往默認轉發和默認接收的連接。
#postfix默認轉發以下的郵件:
#來自$mynetworks中地址發送的郵件
#發往$relay_domains中的域或其子域的郵件。但是不能包含郵件路由(如user@elsewhere@domain.tld)。
#postfix默認接收最終投遞目標符合如下條件的郵件:
#目標在$inet_interfaces
#目標在$mydestinations
#目標在$virtual_alias_domains
#目標在$virtual_mailbox_domains
permit_mx_backup #RCPT TO時:允許接收本地主機是郵件投遞目標的mx地址的郵件。但是不能包含郵件路由(如user@elsewhere@domain.tld)
reject_non_fqdn_recipient #RCPT TO時:客戶端提供的服務器主機名不是RFC要求的完整形式(FQND),返回REJECT,否則返回DUNNO狀態碼。
reject_unauth_destination #RCPT TO時:拒絕不是發往默認轉發和默認接收的連接。(防止成為垃圾郵件服務器)。
reject_unkownn_recipient_domain #RCPT TO時:拒絕發往未知域名的連接。
check_recipient_access type:mapname
reject_unauth_pipeling #DATA命令
permint #無條件批准
reject #無條件拒絕
defer #無條件延遲
warn_if_reject #將原本的REJECT動作改為WARN(eg:warn_if_reject reject_unauth_destination 注意此命令必須放在其他條件之前,不能單獨調用)
reject_unauth_pipelining #禁止非授權客戶端使用pipelining