2012年12月18日 星期二

[轉貼]Postfix設定檔中文說明及 [分享] postfix 過濾垃圾郵件徹底研究-新版

010913[分享] postfix 過濾垃圾郵件徹底研究-新版
取自[分享] postfix 過濾垃圾郵件徹底研究-新版

###########################################
# ★ 3. 垃圾郵件 過濾機制 規則 設定 #
###########################################
# 說明:
# 1.過濾規則有順序性,請合理安排先後順序,以便達到最佳效能。
# 2.一旦規則命中,就不會繼續往下比對。
# 3.當每行的第一個字為空白(tab或空白鍵)的文字列皆被視為上一列的延續。
# 4.同一個項目的設定,不可斷行,隔行會被視為結束。
# 5.FQDN (Fully Qualified Domain Name) 是指主機+網域名稱,比如:mail.xxx.com。
#
####################
# 可用的通用規則 #
####################
#
# 允許:
# permit_mynetworks ←允許來自 $mynetworks 的「寄信人」。(預設值)
# permit_sasl_authenticated ←允許經本機 SASL 驗證過的「寄信人」。(預設值)
#
# 拒絕(本機快速比對部份,較快):
# reject_unauth_destination ←拒絕「收件人」不在Postfix 所轄的網域(預設值)
# (所轄的網域由 $mydestination 定義)。
# reject_non_fqdn_hostname ←拒絕 HOLO 信號沒有 FQDN。
# reject_non_fqdn_sender ←拒絕「寄信人」沒有 FQDN。
# reject_non_fqdn_recipient ←拒絕「收信人」沒有 FQDN。
# reject_invalid_hostname ←拒絕「寄信人」「收信人」FQDN 不合網域名稱規則。
#
# 拒絕(需要連網查資料的比對部份,較慢):
# reject_unknown_sender_domain ←拒絕「寄信人」網域不存在。
# reject_unknown_recipient_domain ←拒絕「收件人」網域不存在。
#
#
# ★ reject_rbl_client [線上的黑名單資料庫] ★
# 使用指令 dig [黑名單資料庫] 測試網站是否還存活,存活才加進去。
#
# ★ check_sender_access hash:/etc/postfix/sender_vip.txt ★
# 允許「 VIP 寄信人」的網域直接通過,不做任何過濾。
# 「VIP 寄信人」網域清單,編輯在 sender_vip 這個檔案。
# 此規則請放在適當位置,才有優先效果。
#
# ★ check_sender_access hash:/etc/postfix/spam_domain.txt ★
# 僅對 spam_domain 清單檔案內的網域,進行 reject_unverified_sender 進階確認
# 「寄信人」進階確認可識破偽裝的網域,但需要花費 9秒以上時間
# 比如垃圾郵件「寄件人」用 gmial.com、yahoo.com 等偽裝,但實際上並不從那些主機寄出。
# 如常收到偽裝的垃圾郵件,可加入此項過濾。
# 此過濾需要花費大量時間,此規則建議放置末尾,黑名單前面,以利優化過濾速度。
#
# ★★ 外掛 postgrey 曙光 郵件過濾軟體 ★★
# 具體請參考「鳥哥私房菜」 postfix 一章教學。
# 此外掛過濾軟體會導致郵件晚幾秒或幾分鐘收到,但可有效過濾「單發型垃圾郵件」。
# 正常的郵件伺服器若第一次無法送達會重寄,而大部分的垃圾郵件發信機只發一次就不理。
# 若無安裝此 postgrey 軟體,以下此行請註解,否則 postfix 運作會出錯!
# check_policy_service unix:/var/spool/postfix/postgrey/socket


###############################################
# ★ 要求 MUA 發出 HELO 信號 #
###############################################
# 說明:
# 預設值:no
# 正常的 MUA 軟體在寄信時會發出 HELO 信號表明主機網域身份,
# 有些垃圾郵件軟體會忽略這個步驟,這可阻擋一部分垃圾郵件。

smtpd_helo_required = yes


###############################################
# ★ recipient 收信 過濾規則 #
# (防止收到垃圾信) #
###############################################

smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
reject_non_fqdn_hostname
reject_non_fqdn_sender
reject_non_fqdn_recipient
check_sender_access hash:/etc/postfix/sender_vip.txt
reject_invalid_hostname
reject_unknown_sender_domain
reject_unknown_recipient_domain
reject_rbl_client cbl.abuseat.org
reject_rbl_client bl.spamcop.net
reject_rbl_client cblless.anti-spam.org.cn
reject_rbl_client sbl-xbl.spamhaus.org
check_policy_service unix:/var/spool/postfix/postgrey/socket


###############################################
# sender 寄信/轉遞 過濾規則 #
# (防止內部電腦中病毒,亂寄垃圾信) #
###############################################
# 說明:
# 一般不需要開啟。開啟會影響寄信/轉遞效率,或甚至信寄不出去。
# 有時內部電腦中病毒亂轉遞垃圾信,會導致被 ISP 封鎖 SMTP。
# 使用此項過濾,可大致過濾掉收件人不存在的垃圾信被亂寄出。
# 這個只有在允許內部網路不必 SASL 驗證即可轉遞的情況下,才需要開啟。
# 若轉遞只允許 localhost,也不需要開啟。

#smtpd_sender_restrictions =
# reject_non_fqdn_recipient
# reject_non_fqdn_sender
# reject_invalid_hostname
# reject_unknown_recipient_domain


###############################################
# client(MUA)發信端 過濾規則 #
# (進階用途過濾) #
###############################################
# 說明:
# 一般不會用到,除非想要非常嚴格的過濾。
# 通用規則在此項不適用,僅有幾個特別的規則是給此項專用。
#
# check_client_access [允許轉遞的清單檔案]
# 僅用於 smtpd_client_restrictions(MUA)發信端 過濾規則
# 範例:check_client_access hash:/etc/postfix/access
# "只有"列在清單檔案上的 IP、網段、主機名稱,才能與 postfix 連線。
# 此規則是用在 postfix 是組織內部聯絡專用主機的情況。
# 若 postfix 接收外面網路任何主機的郵件,此規則不可加入。
#
# reject_unknown_client
# 僅用於 smtpd_client_restrictions(MUA)發信端 過濾規則
# 當 MUA 連線時,若無法查詢該用戶端之 PTR(DSN 反解),則拒絕連線。
# 反解需要連網查詢,會花一些時間。
# 此規則不建議使用,因為很多私人或小公司架設的伺服器都沒有 PTR 反解。


#smtpd_client_restrictions =
# check_client_access hash:/etc/postfix/access
# reject_unknown_client


###############################################
# ★ 限制 Client (MUA) 的連線頻率 #
###############################################
#
# 說明:
# 1.此項設定用來防護 DoS 阻斷式洪水攻擊。
# 2.此處的 client (MUA) 是指來自某位的 clinet 的連線,
# 非 postfix 整體處理數。

# postfix 計算 client (MUA) 連線數以多久時間為一「週期單位」
client_connection_rate_time_unit = 60s

# 在上面那個「週期單位」內,允許每個 client (MUA) 的最大連線數
smtpd_client_connection_rate_limit = 30

# 限制每個 clinet (MUA) 同一時間的最大連線數
smtpd_client_connection_count_limit = 20

# 在上面那個限制同一時間最大連線數,要允許例外的主機
# 預設已經允許 $mynetworks 不受限制
# 可設多組,多組以逗號隔開
#
# 參考可用的變數:
# $mydestination(通常是 $myhostname + $mydomain)
# $myhostname
# $mydomain

#smtpd_client_connection_count_limit_exceptions = $mynetworks,


因為論壇不支援 code 排版的關係,上面擷取的部份比較亂

完整版本的 main.cf 下載:(有排版)
註解中文程度約 80%,大部分關鍵的設定都有中文化
http://www.box.com/s/2gmtps3fod4ly7gfphvh

-----------------------------------------------------------

說明:

1. 關於主要的過濾三個段落解析

smtpd_recipient_restrictions = 收信 限制(input 防火牆)
smtpd_sender_restrictions = 寄信 限制(output 防火牆)
smtpd_client_restrictions = client(MUA)限制

recipient 英文收信的意思
restrictions 限制的意思

sender 英文是寄信者的意思,但這邊是指寄信


這三段限制,可以看作防火牆的三個鏈,這樣會比較容易理解

在過濾垃圾郵件的時候
其實只有 smtpd_recipient_restrictions (input)需要用到

因為我們過濾垃圾郵件,是不想「收到」垃圾郵件
是要在 input 那邊做過濾

在「寄信」(output)那邊進行過濾,就顯得不合理
「寄信」是指內部的人透過 postfix 轉遞把信寄出去時過濾

那麼為什麼要去過濾自己寄出的信?
胡亂過濾一通,反而還導致郵件寄不出去!
除非一種情況:內部有電腦中病毒,亂發垃圾郵件

而 client 限制,是專門針對 MUA端電腦主機 進行過濾。

client 端,可以是遠端不認識的人,也可以是自己內部的人。凡是要與 postfix 主機連線的,都是 client 端。

client 端的限制屬於比較特殊,能用的規則不多,通用規則在那邊並不適用,通常都是針對 IP 或主機名稱過濾,大部分只會用到一個過濾規則,即 PTR(DNS 反解)。


2.防火牆的過濾規則,有優先順序

從最前面開始,一條一條規則往下比對,一旦命中,就會做出相應的處理(放行 或 丟棄),而停止繼續往下比對。若所有規則都沒命中,最後的預設處理原則是放行。

所以這些規則在排列順序的時候,必須考慮到「優化」,讓過濾的速度更快些。

比方說:

一開始該放行的,先放行,來自內部網路自己人的郵件,直接放行,不再往下過濾。

檢查 HOLO 信號,和檢查 FQDN 完整性的,這是在本機直接檢查,比較快,就要放前面。

檢查 domain 網域名稱是否正確(即是和 DNS 伺服器查詢正解,判斷那台網域主機是否存在),這個需要連網查詢,比較慢,應該放後面。

而檢查 rbl 黑名單的,需要先去黑名單主機下載黑名單,然後還要進行比對,這個很慢,應該放最後面。

有另外安裝額外的過濾軟體,比如:曙光垃圾郵件過濾軟體,這個最慢,因為該軟體會先扣押來信數秒,若對方有重寄,才放行,用來防止單發型的垃圾郵件,因為最終絕招,也是最慢,所以要放最後面。


3.另外還有一個 "限制連線頻率" 的設定

這個和過濾垃圾郵件無關,主要是保護 postfix 主機免受 DoS 阻斷服務式洪水攻擊。

有些惡意的人可能寄來正確格式的郵件,因為是正確格式,垃圾郵件過濾規則,過濾不了。但是他可能一秒寄上萬封,postfix 處理不暇,導致 cpu 和 網路頻寬 負載太高,服務就會被阻斷。

考慮到這種情況的可能性,所以連線頻率也必須加以限制。

---------------------------------------------------

其它心得:

關於「SASL 認證」是否必要的迷思:

dovecot(套件:dovecot)是負責 POP3、POP3s、IMAP、IMAPs 等協定的支援

saslauthd(套件:cyrus-sasl)是負責 SASL 認證支援

SASL 認證,主要用於 postfix 「轉遞」郵件時的認證保護
白話的說,就是想利用 postfix 寄信的時候,需要帳號密碼登入


寄信是指:postfix 主機,自己 localhost 直接寄出信件

轉遞(relay)是指:postfix 以外的任何地方主機,欲透過 postfix 主機寄出信件,這個行為叫做轉遞。

之所以「轉遞」要做「SASL認證」(要登入驗證身份才給轉遞)
是因為不希望阿貓阿狗不認識的人,都來偷轉遞寄信


但是,假如 postfix 主機本身就有架設 web mail(比如:Roundcube),且所有使用者都是透過瀏覽器上 web mail 來收發信。

因為 web mail 軟體就裝在 postfix 那台主機,收發信都是直接 localhost 連線的。

這個情況下,其實 cyrus-sasl(SASL 認證) 不用裝,也不用開啟。只要在 postfix 的設定中,設定成只允許 localhost 127.0.0.1 轉遞,那麼 postfix 就"不會接受" localhost 以外的位址進行轉遞。

既然不會接受 localhost 以外的位址進行轉遞,那麼當然也就沒必要去驗證轉遞者的身份了。因為根本就不會轉遞了,轉遞功能已經被關閉了。

不過 dovecot 仍要裝和開啟,因為 web mail 軟體是使用 IMAP 或 IMAPs 協定與 postfix 連線的。


-----------------------------------------------------------

參考的網路資料:

Postfix 三十天就上手-Day 22 ~ 30
---------------------------------------------
http://ithelp.ithome.com.tw/question/10078139
http://ithelp.ithome.com.tw/question/10078302
http://ithelp.ithome.com.tw/question/10078506
http://ithelp.ithome.com.tw/question/10078814
http://ithelp.ithome.com.tw/question/10079113
http://ithelp.ithome.com.tw/question/10079349
http://ithelp.ithome.com.tw/question/10079659
http://ithelp.ithome.com.tw/question/10079923
http://ithelp.ithome.com.tw/question/10080091

121812[轉貼]Postfix設定檔中文說明
取自[轉貼]Postfix設定檔中文說明@ 胖虎的祕密基地:: 痞客邦P

=====================================
(下面是我使用的main.cf檔案,包含多數我會用到的設定,
有些進階的使用方式,會慢慢試著更新它...時間不明...)

# Postfix 主要的組態檔,刪除了多數說明文字,
# 並且嘗試依照最常用的郵件主機設定來依序設定與說明,
# 許多不常用的設定並未列出。
### 0. 幾個 Postfix 主要的設置參數,一般狀況下不需要更改。
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
##
# 一、設定郵件主機的識別身份(重要)
# myhostname 主機名稱:如果系統設置得當,應該不用設置,系統會以gethostname()取得
# mydomain 網域名稱:預設會以myhostname第一個點之後的作為domain名稱
# myorigin 補齊缺少的資訊:自動補齊資訊所用的,通常使用網域名稱
# mydestination 本地網域:指Postfix應該視為「本地網域」的所有網域名稱
# (本地網域的部份會後續在設定)
#myhostname = host.domain.tld
#mydomain = domain.tld
myorigin = $mydomain
##
# 二、設定 Postfix 能使用的網路介面(重要)
# (如果是對外服務的郵件主機,就必須要設定為all,預設為localhost)
inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
##
# 三、先設定簡易的代轉(Relay)管控
# 3.1 mynetworks_style 提供三種簡易設定型態
# class =>與伺服器位於同一級IP網路的主機都可以使用代轉服務
# subnet =>所在網域的任一個IP都可以使用代轉服務
# host =>僅開放localhost為信任‧可代轉的主機
#mynetworks_style = class
#mynetworks_style = subnet
#mynetworks_style = host
# 3.2 mynetworks 明確設定可使用relay的主機範圍
# (優先於mynetworks_style,建議採用此種設定法)
mynetworks = 192.168.0.0/24, 192.168.1.0/24, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
##
# 四、設定Postfix會收下信件的網域
# Postfix會收下四種特定網域的信件,除了main.cf中的設定外,
# 也應該被正確的設置在DNS中的MX紀錄中。
# (1)本地網域(local domain)=>由mydestination參數設定
# (2)代轉網域(relay domains)=>由relay_domains參數設定
# (3)虛擬網域(virtual domains)之虛擬別名(virtual aliases)
# =>由 virtual_alias_domains參數設定
# (4)虛擬網域之虛擬信箱(virtual mailboxes)
# =>由 virtual_mailbox_domains參數設定
# (上列四種設定不應重複,網域已設為本地網域,就不應該出現在代轉網域)
# 4.1 設定本地網域
#mydestination = $myhostname, localhost.$mydomain
mydestination = $myhostname, localhost.$mydomain, $mydomain
#mydestination = $myhostname, localhost.$mydomain, $mydomain,
# mail.$mydomain, www.$mydomainftp.$mydomain
# 4.2 設定代轉網域
# Postfix 預設會提供代轉服務的設置:
# (代轉服務=該網域並非由本Postfix MTA所管控,但可以代轉發)
# - 從信任的客戶端(指ip符合$mynetworks)寄出到任何目的地
# - 從非信任的客戶端寄出到符合$relay_domains或其下次網域的目的地
# 若信件終點站是relay_domains參數中的網址,被視為外地郵件,
# 由 relay MDA來執行投遞作業。
# relay_domains 預設值= $mydestination.(主機名稱)
#
# 4.3 設定虛擬別名‧網域
#
# 4.4 設定虛擬信箱‧網域
#
##
# 五、改寫位址格式
# 5.1 Postfix預設會以$myorigin或mydomain附加到不完整的電郵位址。
# 5.2 正式位址
# 另外提供了一種正式位址代換的機制 canonical map(正格表)
# (1)修改 /etc/postfix/canonical
# (2)再執行 postmap /etc/postfix/canonical
# (3)記得要重新載入 postfix reload
# 正格表的撰寫方式:
eric@example.com eric.wu@example.com
eric@example.com eric@oreilly.com
#
# canonical_maps = hash:/etc/postfix/canonical
#
# Postfix也提供額外的參數設置特定的位址
# sender_canonical_maps 僅修改發信者位址
# recipient_canonical_maps 僅修改收件者位址
# (適用順序為:sender->recipient->canonical)
#
# 5.3 偽裝主機名稱
# 用於隱藏內部主機名稱
# masquerade_domains = example.com
#
# 5.4 改變投遞位址
# 拒收某人或某網域信件,並回覆一封告知
# relocated_maps = hash:/etc/postfix/relocated
# relocated 撰寫範例:
kdent@ora.com kdent@oreilly.com
# @example.com oreilly.com
#
# 5.5 不明使用者
# 拒絕不存在的本地帳戶/「不明使用者」(unknown user)
#unknown_local_recipient_reject_code = 550
unknown_local_recipient_reject_code = 450
# 如果收信地址的人名部份,在任何對照表、別名表、系統帳戶都查不出來,
# 這個人會被視為「不明使用者」(unknown user),系統會拒收。
# 如果希望蒐集這類信件,使用下列設定,並指定集中收集的信箱
# local_recipient_maps =
# luser_relay = someuser
# (上列第一個參數維持空白,第二個參數指定一個別名或實際帳戶)
# 5.6 chroot
# 最安全的設置方式是使用改變根目錄(chroot),但非常複雜;
# postfix安裝時預設並未使用 chroot,記得去檢查 master.cf檔案,
# 建議先取消 chroot,除非您真的很厲害。
##
# 六、一些針對郵件限制的特殊設定
# 限制一封信最多可以有幾位收信者,預設值是1000
# smtpd_recipient_limit = 1000
# 限制單封信件的體積上限,預設值為 10 MB(改為20MB)
message_size_limit = 20480000
##
# 七、別名檔資料庫設定(aliases)
# 使用default_database_type參數決定資料庫格式,預設為 hash
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
# (安裝時隨附的別名檔範本,已經預設了一組慣例別名,最後都指向root,
# 僅需要設置 root 別名,指向一個平常會收取信件的帳戶信箱即可)
##
# 八、本地信件與信箱設置
# 預設使用的信箱格式是mbox,下列的參數設置,如果結尾沒有"/",
# 就表示是使用mbox;如果結尾跟著"/",就是使用 maildir格式。
# (建議還是使用最通用的mbox,與其他程式的相容性最高)
#
# 所有本地收件人的名稱,都必須列在local_recipient_maps參數所指的表,
# 預設值是指向Unix系統的密碼檔與別名表,通常不需要修改它。
# local_recipient_maps = proxy:unix:passwd.byname $aliase_maps
#
# 信箱投遞作業
#mail_spool_directory = /var/mail
#mail_spool_directory = /var/spool/mail
#
# 可以要求 Postfix 將信件放在使用者的主目錄下
home_mailbox = Mailbox
#home_mailbox = Maildir/
#
# 用於將郵件投遞到信箱的外部命令(通常用來過濾防堵郵件)
#mailbox_command = /usr/bin/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
# 用於執行信箱投遞作業的傳輸服務
#mailbox_transport = lmtp:unix:/file/name
#mailbox_transport = cyrus
#
##
# 八、啟用 SASL 驗證(服務於遠端、外部網域使用的認證機制)
# 決定 Postfix SMTP server 是否要支援 SASL 驗證
# smtpd_sasl_auth_enable = yes
# 設定信件收件的限制規則
# smtpd_recipient_restrictions = permit_mynetworks,
# permit_sasl_authenticated, reject_unauth_destination
# 確認已經通過認證的網域(這條有點疑問...)
# smtpd_sasl_local_domain =
# 限制某些登入的方式(拒絕匿名登入)
# smtpd_sasl_security_options = noanonymous
##
# 九、郵件代轉設定(交換站、入境、出境閘道)
# (下列程序示範如何設定 gw.abc.com,讓它將郵件交給正確的內部伺服器)
# (1)hr.abc.com, sales.abc.com的DNS MX均指向 gw.abc.com
# (2)編輯gw的main.cf檔,將子網域列入 relay_domains 參數
# relay_domains = hr.abc.com, sales.abc.com
# (3)設定正確的傳輸表(transport map)
# transport_maps = hash:/etc/postfix/transport
# (4)編輯傳輸表(編完記得postmap一下)
# hr.abc.com relay:[m1.abc.com]
# sales.abc.com relay:[m2.abc.com]
# (5)彙整m1,m2的合法信箱名單成一個受理名單,放在gw上
# relay_recipient_maps = hash:/etc/postfix/relay_recipients
# (怎麼收集、更新,是個大問題)
# (6)postfix reload
#
# 設定出境郵件閘道(將外地郵件交給閘道系統代為遞送)
# relayhost = $mydomain
# relayhost = gateway.my.domain
# relayhost = uucphost
# relayhost = [an.ip.add.ress]
#
# 拒絕不知名用戶的代轉 REJECTING UNKNOWN RELAY USERS
# (其實是將所有合法使用者放入一個名單中)
#relay_recipient_maps = hash:/etc/postfix/relay_recipients
##
# 十、設定 Open Relay Data Base
# smtpd_client_restrictions = hash:/etc/postfix/access,
# reject_rbl_client relays.ordb.org,
# reject_rhsbl_client dsn.rfc-ignorant.org
##
# 除錯管理
debug_peer_level = 2
#debug_peer_list = 127.0.0.1
#debug_peer_list = some.domain
# debugger_command =
# PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
# xxgdb $daemon_directory/$process_name $process_id & sleep 5
# 如果並未安裝X-windows可以改用下列:
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont;
echo where) gdb $daemon_directory/$process_name $process_id2>&1
>$config_directory/$process_name.$process_id.log & sleep 5
##
# 其他、安裝時的一些設置資訊
#
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.0.16/samples
readme_directory = /usr/share/doc/postfix-2.0.16/README_FILES
##

沒有留言: