2015年7月28日 星期二

Postfix SMTP傳入限制設定

client階段
建議設定:
smtpd_client_restrictions = 
        permit_mynetworks                        #受管理者信任的網段不檢查
        permit_sasl_authenticated              #已通過SASL(SMTP AUTH)授權的client端允許連接,後續不再檢查
        check_client_access hash:/etc/postfix/client_access  #使用檢查表/etc/postfix/client_access來決定是否允許連線
        reject_rbl_client bl.spamcop.net                         #使用cbl.abuseat.org提供的黑名單比對,在名單上的拒絕連線
        reject_rbl_client dnsbl.sorbs.net                        #reject_rbl_client可設置多筆,但會影響效能(會擋gmail信箱)
        reject_rhsbl_client rhsbl.sorbs.net

/etc/postfix/client_access內容大致如下:
192.168.3          REJECT
192.168.3.254   OK
192.168.4          REJECT
mail.abc.com     OK
這樣的內容設定,mail server會拒絕192.168.3與192.168.4網段(整個C class),但允許192.168.3.254連線;也會允許mail.abc.com連線。若有某網域被列在垃圾郵件黑名單上,但想收取它的信件時,可將該網預設定在這。另外只設定檔是hash格式,需要使用postmap編譯後才可以使用,因此文字檔/etc/postfix/client_access內的各列前後順序不會影響設定結果,也不計較大小寫的差別。

helo階段
建議設定:
要求smtp client端送出MAIL FROM 或 ETRN之前,必須先用EHLO/HELO打招呼,介紹自己支援smtp的服務程度。某些較舊的MUA軟體可能不符合這個標準!所以postfix預設值是關閉的!
smtpd_helo_required = yes     #要求client一定要先送出EHLO/HELO命令,否則拒絕連線          
#helo階段的限制條件                       
smtpd_helo_restrictions =
        permit_mynetworks                         #受管理者信任的網段不檢查
        reject_invalid_helo_hostname         #client端送出"EHLO主機名稱"時,若"主機名稱"不是有效的主機名稱,拒絕連線 
        reject_non_fqdn_helo_hostname    #EHLO後接應的主機名稱必須是完整的主機網域名稱(FQDN),否則拒絕連線
        reject_unknown_helo_hostname    #EHLO後接應的主機名稱在DNS上必須有一筆A記錄或MX記錄,否則拒絕連線
        check_helo_access hash:/etc/postfix/check_helo #使用設定的主機檢查表/etc/postfix/check_helo判斷是否為允許的名稱或IP,如此可避免自己的主機名稱或IP遭冒用
   #(Mail Server不可能自己跟自己說Hello)
/etc/postfix/check_helo檢查表內容大致如下:
mail.demo.com         REJECT
192.168.11.250         REJECT
檢查表設定好後需要編譯對照表(postmap)。
PS:reject_non_fqdn_helo_hostname 與reject_unknown_helo_hostname設定後,若是用收信軟體,如windows live mail或outlook寄信時,mail server會要求寄信端(user使用的PC)有完整的FQDN並且在DNS上有A或MX紀錄,只要缺少任何一個,mail server都會拒絕收信!若不確定使用者是否會用這一類的軟體收發信,建議這兩個選項別使用!!

sender階段
建議設定:
smtpd_sender_restrictions =
        permit_mynetworks                         #受管理者信任的網段不檢查
        reject_non_fqdn_sender                  #若MAIL FROM後接的寄件人位址內沒有完整的網域名稱,拒絕連線
        reject_unknown_sender_domain    #若MAIL FROM後接的寄件人位址,網域名稱在DNS內不存在,拒絕連線
        check_sender_access hash:/etc/postfix/check_sender           #使用設定的主機檢查表/etc/postfix/check_sender,判斷MAIL FROM後接的寄件者位址網域名稱是否拒絕連線
        check_sender_mx_access cidr:/etc/postfix/check_bad_mx  #使用設定的主機檢查表/etc/postfix/check_bad_mx ,判斷MAIL FROM後接的寄件者位址,其MX主機是否在禁用黑名單內,若是則拒絕連線

/etc/postfix/check_sender檢查表內容大致如下:
mail2.demo.com         REJECT
check_sender設定後需要用postmap編譯。

對照表/etc/postfix/check_bad_mx內容大致如下:
192.168.2.0/24     550 Bad mx
check_bad_mx使用cidr格式,設定好可以直接使用。

recipient階段
這個階段(RCPT TO)的檢查點有兩種限制列表的名稱,首先是smtpd_relay_restrictions,接著是smtpd_recipient_restrictions;smtpd_relay_restrictions是Postfix 2.10後才新增的,在2.10之前只能使用smtpd_recipient_restrictions。Postfix為了避免被當成垃圾郵件的轉寄跳板,預設就限制了郵件的轉遞範圍,這個限制設定在smtpd_relay_restrictions,預設值如下:
smtpd_relay_restrictions = 
        permit_mynetworks 
        permit_sasl_authenticated
        defer_unauth_destination
另外,在Postfix2.10以後的版本,smtpd_relay_restrictions是必須要設定的,但因為它已經有了預設值,所以在main.cf內你可能看不到它的蹤影。而smtpd_recipient_restrictions在2.10以前是"必要",但在2.10以後是"選用"。另外Postfix要求在smtpd_relay_restrictions或smtpd_recipient_restrictions的限制條件中,至少要存在下列條件中的一個,否則Postfix會拒收郵件:
reject, reject_unauth_destination, defer, defer_if_permit, defer_unauth_destination

建議設定:
smtpd_recipient_restrictions =
        permit_mynetworks                    #受管理者信任的網段不檢查
        permit_sasl_authenticated          #已通過SASL(SMTP AUTH)授權的client端允許連接,後續不再檢查
        reject_unknown_recipient_domain  #client若未經授權,拒絕轉發郵件到任意位址,除非收件者位址是本機或relay_domains定義的網域
        reject_unauth_destination                 #若收件者的domain name在DNS中不存在(沒有A記錄或MX記錄),拒絕連接

data和end_of_data階段
smtpd_data_restrictions =
        reject_unauth_pipelining             #拒絕client過早回應,不遵守SMTP session的對話規則
        reject_multi_recipient_bounce    #若寄件者位址是"<>"(空值),而收件者位址是多個不同位址,拒絕連線。這可避免client假借MAILER-DAEMON名義寄大量垃圾信