經過了上篇 安裝 Postfix 之後,相信很多讀者對於 Posetfix 設定上有很多疑惑,所以此篇特別整理了 Postfix 的基礎概念與設定技巧,加強讀者在管理 Postfix 時能夠更有效的管理維運。
Postfix 三十天就上手-Day 01 Postfix 是什麼
要學 Postfix 之前,當然是要先知道什麼是 Postfix ,本篇文章,會先對 Postfix 作間單的介紹讓大家知道 Postfix 是什麼,它有哪些功能,以及如何運用它。
Postfix 的用途是『郵件伺服器』,以前大家比較熟悉的可能是『 Sendmail 伺服器』,這個 Postfix 與 sendmail 是類似的東西,那就是『MTA』啦,既然都是 MTA ,這個 Postfix 最早之前的用途也是想要用來『取代 sendmail 』。
Postfix 是由 Wietse Zweitze Venema ( http://www.porcupine.org/wietse/ ) 所發展的。sendmail 雖然很好用,但是安全性卻不足,尤其效能上是最大的困擾。
Venema 博士就在 1998 年利用他老大在 IBM 公司第一個休假年進行一個計畫:『設計一個可以取代 sendmail 的軟體套件,可以提供網站管理員一個更快速、更安全、而且"完全相容"於 sendmail 的 mail server 軟體!』
Venema 博士也在 1998 年首次釋出這個自行發展的郵件伺服器,並定名為 VMailer。不過為了避免註冊的商標很類似,引起一些註冊上面的困擾。所以 Venema 博士就將名稱改為 Postfix !這個 Postfix 有『在什麼什麼之後修正』的意思(大改就是在 sendmail 之後修正所以這樣取名吧)。
Postfix 改善了 sendmail 安全性上面的問題,改良了 mail server 的工作效率,更由於其設定檔完全為 ASCII 碼,且設定內容都是『人類看的懂得語言!』因此,你可以輕易的由 sendmail 改良到 Postfix 上面!
Postfix 三十天就上手-Day 02 名詞解釋 MUA MTA MDA
MUA ( Mail User Agent ):顧名思義, MUA 就是『郵件使用者代理人』,
您如果需要收發郵件,除了現在流行的 webmail ,一般您會需要使用 mail 的收發軟體(也有人人喜歡叫他 mail client ) 這個幫您進行郵件收發工作的東西,就是MUA ( Mail User Agent ) Client 端的用戶都需要透過各個作業系統提供的 MUA 才能夠使用郵件系統。
舉個例子來說, Windows XP 裡面的 OutLook Express 或是 Microsoft Office裡的 Outlook,還有免費又好用的 Thunderbird ( http://www.mozilla.org/en-US/thunderbird/ )
都是 MUA 的一種!
MUA 主要的功能就是收受郵件主機的電子郵件,以及提供使用者瀏覽與編寫郵件的功能!
MTA ( Mail Transfer Agent ) : 顧名思義, MTA 就是『郵件傳送代理人』,它要負責幫使用者傳送郵件,當MUA要收送信件的時候,就需要先找 MTA 連絡一下。
MTA 的基本功能如下:
1.接收外部主機寄來的郵件
2.幫使用者傳送 ( 寄出 ) 郵件
3.提供使用者接收自己的郵信
通常我們所說的 Mail server ( 郵件伺服器 ) 就是指 MTA。
MDA ( Mail Delivery Agent ) : 顧名思義,MDA 就是『郵件遞送代理人』,主要的功能就是將 MTA 所收受的信件,依照信件的 Flow ( 送到哪裡去 ) 來將該信件進行放置到本機帳戶下的郵件信箱中 ( Mailbox ),或者是再經由 MTA 將這個信件送到下個
MTA 去。
今天您已大致了解郵件傳送中,常會用到的名詞,明天將會為您解是郵件是如何傳送。
Postfix 三十天就上手-Day 03 郵件如何傳送
該知道的名詞知道了之後,接下來我們就來看郵件如何傳送。
上一篇說明了 MUA、MTA 跟 MDA,知道了這些名詞之後,接下來想知道郵件傳送流程也就不困難了。
MUA 您就把它想成是要寫信的人。
MTA 您就把它想成是郵局吧。
MDA 您就把它想成是郵差吧。
平常如果要些封信給朋友,寫完通常要送給郵局,郵局會先送交給離目的地最近的郵局,最後再送給您的朋友。
以上幾句就說明郵件傳送奧義,對應到電子郵件傳送流程如下。
- 使用者利用 MUA 寄信到 MTA -->我們寄信到郵局去。
- MTA 轉送到目的帳號所屬的 MTA--> 郵局作業都是先送到離目的地最近的郵局(所以寫郵遞區號才會快),此段就像是 MTA 對 MTA 的郵件 relay。
- MTA 收到自己的信件,交由 MDA 發送到該帳號( 如果此信件的目的地屬於該郵局,則交給郵差發送到收件者的信箱)
Postfix 三十天就上手-Day 04 設定檔結構說明
在要進行 Postfix 設定之前,第一步當然就是先了解設定檔的結構,這樣您設定起來才會快速又正確。
以 CentOS 為例來說,Postfix 的設定檔預設位置在 /etc/postfix 裡面,主要的設定檔案如下:
/etc/postfix/main.cf
從這個檔名您大概就可以猜到,這個設定檔就是 postfix 最主要的內容,這個檔案本身基本上就是一個簡單的 postfix 說明文檔。
/etc/postfix/master.cf
此檔案規範了 postfix 中,process 運作的參數,從檔名您就知道他是老大囉,您就是透過它來告訴 process 做事方法囉!
/etc/postfix/access
當您需要對某些伺服器 ( Hostname or IP ) 作 relay 或者是 deny ,需要使用的檔案。不過這是預設的位置,複雜的郵件伺服器設定大多會配合管理者的習慣,在 main.cf 中指定檔案。
/etc/postfix/aliases
此檔案就是讓您設定別名,與 naccess 一樣這是預設的位置,複雜的郵件伺服器設定大多會配合管理者的習慣,在 main.cf 中指定檔案。
Postfix 三十天就上手-Day 05 佇列 (Queue)
了解Postfix 的佇列可以幫助您判斷郵件目前的狀態。
您可以由上一篇中介紹的 main.cf 檔案中,找到 queue_directory 的參數,此參數會指定佇列存放的目錄,預設值是設定在 /var/spool/postfix 。
每一個佇列都擁有一個子目錄,停留在該佇列的郵件都會存在該子目錄下,存在哪個佇列也就代表著目前該郵件的狀態。
佇列說明如下:
incoming
新進的郵件都會送進去 incoming 的佇列 ,postfix 會掃描 incoming 的佇列,並將郵件移往active的佇列。
maildrop
postfix允許沒有權限的 sendmail 程式將郵件放到 maildrop 的佇列中。就算 postfix 目前沒有運作您也可以直接將郵件放入,postfix 一啟動就會到 maildrop 進行檢查。
deferred
當有部分收件者無法收件,且可收件的人員都已送達時,就會將郵件放入 deferred 的佇列。
active
當郵件準備要傳送時,就會進入到 active 的佇列。
hold
放到 hold 的佇列的郵件,不會被週期性的傳送,並等待系統管理者來手動處理,如果郵件在停留在此佇列超過 maximal_queue_lifetime 參數所設定的時間,就會被退回給寄件者。
corrupt
如果有損回的佇列檔就會被放到 corrupt 的佇列,等待系統管理者處理。
以上了解了 postfix 的佇列之後,您就可以依照的佇列判斷目前郵件的狀態
Postfix 三十天就上手-Day 06 常用指令說明
利用Postfix 所以供的命令列指令,可以幫助您更輕鬆管理郵件伺服器的工作。
今天的介紹會將重點放在日常操作比較需要的地方,如果對該指令有需要更進一步了解,可以參考一下指令的使用說明,Postfix 所提供的命令列指令有一個共通點,就是全部都使用post開頭。
指令說明如下:
postfix
用來啟動、停止跟重新載入設定檔,使用上配合參數如下:
啟動
檢視原始檔複製到剪貼簿列印關於
postfix start
停止
檢視原始檔複製到剪貼簿列印關於
postfix stop
重新載入設定檔
檢視原始檔複製到剪貼簿列印關於
postfix reload
postmap
postmap主要是將文字檔的內容建立出索引對照檔,ex:將 /etc/postfix/virtual 轉為 /etc/postfix/virtual.db
postmap hash:/etc/postfix/virtual
另外它還有另外一個很重要的功用,用來 debug (執行 "postmap -q")。您可以利用 postmap 來檢查對照表中傳回的項目是否與您預期的一樣。
ex: 檢查 /etc/postfix/access_sender 中 key 為 funkent@ithome.com.tw 的 value
postmap -q funkent@ithome.com.tw hash:/etc/postfix/access_sender
postalias
功能類似 postmap,是將別名檔建立一個索引別名,postalias 必須在別名檔上使用。
postcat
postcat 用來顯示郵件內容,使用時須要提供郵件 ID 。
ex:查看郵件ID為 0E3569009C 的內容
postcat -q 0E3569009C
postlog
postfix 允許外部程式 (如 shell script ) 使用postlog,將訊息寫到 maillog 中。 ex: 將 This is a test 寫入 maillog
postlog This is a test
postqueue
postqueue 是 postfix 提供給 user 對上一篇介紹的佇列進行操作的使用者介面,參數使用如下:
重送所有佇列中的郵件
postqueue -f
列出佇列中內容
postqueue -p
PS:postqueue 需要在 postfix 啟動的情況下才能運作。
postsuper
postsuper 是提供管理者維護 postfi x佇列的工具,執行 postsuper 需要有 root 權限。
最常使用的就是刪除佇列中卡住的郵件, 下列範例會將郵件 ID 為 0E3569009C 的郵件從佇列中移除。
postsuper -d 0E3569009C
正所謂工欲善其事,必先利其器!以上了解了 postfix 提供的工具之後,您就可以更輕鬆的管理postfix。
Postfix 三十天就上手-Day 07 Mail Server 的 DNS
郵件伺服器要如要對外正常收送郵件,當然最先必要條件就是讓別人可以透過DNS找到你的伺服器。
要讓您的 Mail Server 正常在網際網路上運作,請先設定好 DNS,建議最少將下列3種 Type 的 Resource record 設定好。
A record
address record --一筆 A record 會對應到一個 ip address,您的 mail server 需要完全合法的的主機名稱,讓客戶端能夠找到您的主機。如:mail.ithome.com.tw
PTR record
pointer record--由 ip address 反解到主機名稱就需要使用 PTR record ,您的主機名稱應該要可以被反解,因為在這個垃圾郵件氾濫的時代,如果不能被反解是很容易被判斷成為垃圾郵件。
MX record
mail exchange record --用來說明那些伺服器負責該網域的郵件服務,您可以有多台郵件伺服器來為您的網域作郵件服務,透過 MX record 就能找到這些服務的伺服器的 ip address。
在設定 DNS 的時候,您可以將 MX record 指到 A record,另外為企業為了避免遇到郵件伺服器掛點害郵件無法正常運作,對外通常都會有超過一台的郵件伺服器,也就是會有多筆的 MX ,當由郵件送到該網域時,會依 MX 的順序來寄送,如果第一台 MX 紀錄的主機掛點,就會送到順序第二的伺服器。
在此順便分享一個小撇步,通常垃圾郵件伺服器都會將垃圾郵件送給最後一台 MX,且它不會重送,所以有一招避免垃圾郵件的方式是將最後的 MX 指到空的IP 。
不過現在垃圾郵件不斷進化,如何防垃圾郵件已經變成系統管理員最頭痛的問題了。
Postfix 三十天就上手-Day 08 郵件日誌 (maillog)
系統管理員最好的朋友就是 log了,想知道系統在搞什麼鬼,最好要知道 log 跟你說什麼?
當您要對您的 mail server作 debug 時,第一個要想到的就是郵件日誌 ( maillog ),postfix 使用syslog 紀錄 maillog,您可以在 /etc/syslog.conf 查看 maillog 的位置。
一般建議設定的設值如下:
mail.none 將不會把郵件訊息存在 /var/log/messages,避免大量郵件日誌搞亂你的系統訊息。
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
再將 mail 的 log 單獨寫到 /var/log/maillog 中。
# Log all the mail messages in one place.
mail.* -/var/log/maillog
在 maillog 中還有一個很重要可是卻可能被初學者忽略的問題,就是系統時間與時間戳記,正確的系統時間對 mail server 來說相當的重要,尤其遇到需要與其他 mail server 管理者進行 debug 時,非常需要一個精準的時戳來查核。
Postfix 三十天就上手-Day 09 信件代轉 (relay)
了解代轉避免您的伺服器變成垃圾發送者。
開放式代轉 ( Open relays ) 可能會讓您的郵件伺服器變成垃圾發送機,可以說是系統管理員的大噩夢。
所以 Postfix 在預設只會允許你的網域內的郵件代轉。
您可以透過 mynetworks_style 設定一般的待轉權限,設定如下:
mynetworks_style = class
將 mynetworks_style 設定為 class 時,postfix 將會把代轉範圍放寬到伺服器所設定的 IP 的 class 。
mynetworks_style = subnet
將 mynetworks_style 設定為 subnet 時,postfix 將會把代轉範圍限定在伺服器所屬的子網路。
mynetworks_style = host
將 mynetworks_style 設定為 hos 時,postfix 將會把只允許自己主機進行代轉。
另外您也可以透過設定 mynetworks 來設定獨立允許的代轉,設定方法如下:
mynetworks = 127.0.0.0/8, 192.168.1.0/24, 192.254.1.30
請以逗號作為分隔。
Postfix 三十天就上手-Day 10 建立別名 (Alias)
使用別名 ( Alias ) 可以讓大家更好記得您的 e-mail address。
一般系統開帳號,會使用比較像類似 m91001 這類的英文字搭配數字(如工號或學號),此時您的 e-mail address 可能就會長的像 m91001@ithome.com.tw 。
您會發現這樣別人很難從你的 e-mail address 聯想到你是誰。此時您就需要使用別名,假設您的名子是 Steve Jobs,您一定會希望您的 e-mail address長的像 steve.jobs@ithome.com.tw,讓別人個好記得你的 e-mail address (尤其業務人員更是需要)。
另外還有一個狀況,假設您跟另外兩個同事 ( m91002,m91003 )都需要收到 ithelp@ithome.com.tw的郵件時,ithelp@ithome.com.tw 就是像是一個郵件群組,希望大家有問題要問得時候都寄到這個郵件信箱中,此時一樣可以透過建立別名來達成。
第一步您需要先將這些別名對應到您的需要的系統帳號,您可以編輯 /etc/postfix/aliases,加入的項目如下:
#user
steve.jobs: m91001
#group
ithelp: m91001,m91002,m91003
編輯完畢後,您還需要執行 postalias hash:/etc/postfix/aliases 這樣才會更新你的 aliases.db 。
別名建立好之後,您就可以試著發送測試的郵件測試看看囉!
Postfix 三十天就上手-Day 11 利用 LDAP 建立別名 (Alias)
利用 LDAP 讓你的 postfix 更好用。
昨天已經跟大家介紹如何建立別名。相信您看完昨天的文章之後,可能會產生一個小小疑惑,那就是假設我有一千個以上的帳號,是不是會造成檔案很難維護,又如果說你要有多台postfix 那檔案不一致不是很麻煩嗎?
這個時候您就可以搭配 LDAP,小弟個人比較愛好使用 OpenLDAP,為了要讓您的 Postfix 使用LDAP 來當作查看的對照表( MAPS ),您需要先在 main.cf 先定義 LDAP 的 source,您需要編輯main.cf 並定義 alias_maps 如下範例:
alias_maps = hash:/etc/aliases, ldap:/etc/postfix/ldap-aliases.cf
另外您的 /etc/postfix/ldap-aliases.cf 範例如下:
server_host = ldap.ithome.com.tw
search_base = dc=ithome, dc=com, dc=tw
完成以上設定後,假設您的 Postfix 收到一封寄給 Steve.Jo s 的郵件,當它在 /etc/aliases 中找不到時,就會連線到 ldap.ithome.com.tw,由於我們沒有指定 ldap 使用的 port ,所以他會預設使用 port 389 ,另外我們也沒有指定 bind 的 user(password),所以他會 bind anonymously,然後搜尋dc=ithome, dc=com, dc=tw 這棵樹,找出 mailacceptinggeneralid 這個屬性( attribute )為 "Steve.Jos" 的項目( entry ),然後回傳此項目的 maildrop
利用這樣的方式,就算您有上千個帳號,就算您有多台 postfix,都可以簡單管理。
Postfix 三十天就上手-Day 12 利用 MySQL 建立別名 (Alias)
利用MySQL 讓你的postfix 更好用。
昨天已經跟大家介紹如何利用 LDAP 建立別名。相信您看完昨天的文章之後,可能也會除了LDAP 是否也能利用資料庫?
沒錯今天我們就接著來介紹利用 MySQL 建立別名( Alias ),跟 LDAP一樣您需要先告訴 postfix要去找 MySQL,一樣編輯 main.cf 並定義 alias_maps 如下範例:
alias_maps = mysql:/etc/postfix/mysql-aliases.cf
接著在 /etc/postfix/mysql-aliases.cf 您需要告訴 postfix 如何去參考資料庫,如下列範例:
# 設定要連入的主機
hosts = mysql.ithome.com.tw
# 設定要登入資料庫的帳號跟密碼
user = ithome_user
password = ithome_password
# 設定使用的資料庫名稱
dbname = mail_db
# 設定查詢條件
query = SELECT maildrop FROM mxaliases WHERE alias='%s' AND status='active'
PS:當您使用 MySQL 來查詢的時候,要記得考量到 postfix 的大量連線數,很多時候容易因為後方的執行效率導致前方的 postfix 變慢。
Postfix 三十天就上手-Day 13 main.cf
說明 main.cf 基本語法
在第四天的時候有說明過 Postfix 三十天就上手-Day 04 設定檔結構說明,相信大家看完之後對於 postfix 主要設定檔與作用有了一個大概的概念。
今天我們就針對 main.cf 說明一下此檔案設定語法,postfix 預設將 main.cf 放在 /etc/postfix 的目錄下,該檔案的 owner 預設為 root,所以您要編輯的時候,需要使用 root 進行編輯。
postfix 在 main.cf 中使用的參數設定方法,與 UNIX shell 的變數設定方式類似,您可以如下列範例將等號左邊的數值(設定值)設定給等號右邊的參數。ex:
parameter = value
除了直接設定設定值給參數,您也可以將某一參數設定為另外一個參數的設定值,就像變數使用的方法一樣,您只要在開頭使用錢字號 "$",如以下範例:ex:
other_parameter = $parameter
這裡要特別跟大家說明,postfix 與 UNIX shell 有兩點比較不一樣的地方,說明如下:
第一:Postfix 不使用雙引號
第二:就算在設定 $parameter 的設定值之前您一樣可以使用 $parameter
最後,當您變更了mail.cf 的設定值之後,請記得要在 root 的身分下執行下列指令,讓您的postfix ( running ) 重新載入設定檔。
postfix reload
Postfix 三十天就上手-Day 14 改寫郵件地址
利用Canonical address mapping 改寫郵件地址
在第10天的文章 Postfix 三十天就上手-Day 10 建立別名(Alias) 中有說明利用別名可以讓一個系統帳號有多個 e-mail address,當 user 在收信的時候,我們可以讓 postfix 幫忙將這些系統帳號的e-mail 在 postfix 把郵件地址改寫為您希望設定的 e-mail address,當然改寫的目的有很多,比如說把 "username" 轉到 "username@ithome.com.tw",或是 把 "username@hostname" 轉到 "username@hostname.ithome.com.tw 等等之類,其他目的我們就不多談,今天主要介紹利用Canonical address mapping 改寫郵件地址。
今天的範例假設使用者的 login name是 steve,但是我們希望把他換成全名 "steve.jobs"。
Canonical 預設是被停用的 ( disabled ),您需要在 main.c f中設定 canonical_maps 這個參數。
Step1.編輯 main.cf 設定 canonical_maps 參數如下:
canonical_maps = hash:/etc/postfix/canonical
Step2.編輯/etc/postfix/canonical內容如下:
steve steve.jobs
這樣就可以讓postfix幫您改寫郵件地址。
Postfix 三十天就上手-Day 15 利用 LDAP 改寫郵件地址
利用LDAP 當成你的 postfix 的 lookup table。
昨天已經跟大家介紹如何改寫郵件地址。如果您有讀過前幾天的文章,您也許會想說是否一樣可以利用 LDAP 作為 Canonical address mapping 的 lookup table,這樣就算您有一千個以上的帳號,也不會造成檔案很難維護,又如果說你要有多台 postfix 那檔案不會不一致。
為了要讓您的 Postfix 使用 LDAP 來當作查看的對照表 ( MAPS ),您需要先在 main.cf 先定義LDAP 的 source,您需要編輯 main.cf 並定義 canonical_maps 如下範例:
canonical_maps = hash:/etc/postfix/canonical,ldap:/etc/postfix/ldap-canonical.cf
當然如果您如果完全不想使用 local file ,只使用 LDAP 來當 lookup table,您可以改寫如下:
canonical_maps = ldap:/etc/postfix/ldap-canonical.cf
另外您的 /etc/postfix/ldap-canonical.cf 範例如下:
server_host = ldap.ithome.com.tw
search_base = dc=ithome, dc=com, dc=tw
query_filter = (&(mailacceptinggeneralid=%s)
result_attribute= mail
另外LDAP 的 Data假設內容節錄如下:
mail: Steve.Jobs@ithome.com.tw
uid: m91001
cn: ITHome Steve Joes
maildrop: m91001@ithome.com.tw
mailacceptinggeneralid:Steve@ithome.com.tw
完成以上設定後,假設您的 Postfix 收到一封寄給 Steve@ithome.com.tw 的郵件,就會連線到ldap.ithome.com.tw,然後搜尋 dc=ithome, dc=com, dc=tw 這棵樹,找出 mailacceptinggeneralid 這個屬性 ( attribute ) 為 "Steve.Jos" 的項目( entry ),然後回傳此項目的 mail,取得回傳的 mai l值之後,回拿這個回傳值來改寫郵件地址。
PS:如果你的 LDAP Query 結果回傳超過一筆資料,會讓你的郵件地址改寫機制失敗,您會在maillog 看到如下列的錯誤訊息:
Oct 11 07:51:42 mailsrv postfix/cleanup[25578]: warning: D6652F8D11: multi-valued canonical_maps entry for Steve@ithome.com.tw
為了避免發生邏輯上的設定錯誤,您可以對照 Postfix 三十天就上手-Day 06 常用指令 說明中的postmap 來檢查對照表中傳回的項目是否與您預期的一樣。
範例如下:
postmap -q Steve@ithome.com.tw ldap:/etc/postfix/ldap-canonical.cf
正確的話就會得到下列結果:
Steve.Jobs@ithome.com.tw
如果回傳多個值,那您就要看看您邏輯或是資料哪裡錯囉!
Postfix 三十天就上手-Day 16 利用 MySQL 改寫郵件地址
利用 MySQL 當成你的 postfix 的 lookup table。
昨天已經跟大家介紹如何何利用 LDAP 改寫郵件地址。如果您有讀過前幾天的文章,您也許會想說是否一樣可以利用 MySQL 作為 Canonical address mapping 的 lookup table,這樣就算您有一千個以上的帳號,也不會造成檔案很難維護,又如果說你要有多台 postfix 那檔案不會不一致。
為了要讓您的 Postfix 使用 MySQL 來當作查看的對照表 ( MAPS ),您需要先在 main.cf 先定義MySQL 的 source,您需要編輯 main.cf 並定義 canonical_maps 如下範例:
canonical_maps = mysql:/etc/postfix/mysql-canonical.cf
另外您的 /etc/postfix/mysql-canonical.cf 範例如下:
# 設定要連入的主機
hosts = mysql.ithome.com.tw
# 設定要登入資料庫的帳號跟密碼
user = ithome_user
password = ithome_password
# 設定使用的資料庫名稱
dbname = mail_db
# 設定查詢條件
query = SELECT mail FROM user WHERE mailacceptinggeneralid='%s' AND status='active' limit 1
這裡跟LDAP比較不一樣的作法是,我們可以限制指回傳一筆資料,拿回傳的第一筆去改寫郵件地址改。
Postfix 三十天就上手-Day 17 限制 Client 的連線頻率
調教您的Postfix 效能。
postfix 預設並不會對 Client 端的連線頻率設限,但是現在的網路實在是跟以前不一樣了,一個什麼防護都沒有的 postfix 放到網路上,我想可以活的天數不會太久。
所以今天就來跟大家講如何限制 Client 端的連線頻率,避免遇到惡意人士吃掉你的資源。
第一步、您需要告訴 postfix 要計算多久期間的的連線數,假設我們要現在每分鐘不能超過的連線數,所以您需要編輯 main.cf 並定義 client_connection_rate_time_unit 如下範例:
client_connection_rate_time_unit = 60s
第二步、設定在期間內允許單一 Client 的連線數,假設我們要設定允許的連線數為 30,所以您需要編輯 main.cf 並定義 smtpd_client_connection_rate_limit 如下範例:
smtpd_client_connection_rate_limit=30
設定完成之後記得要執行 postfix reload 。
Postfix 三十天就上手-Day 18 控制每個 Client 的同時連線數
調教您的Postfix 效能。
在 Postfix 三十天就上手-Day 17 限制 Client 的連線頻率 中已經知道如何限制連線頻率,當然在效能上還需要考慮到同一時間的連線數,所以今天就來跟大家說明如何控制每個 Client 的同時連線數。
postfix 預設每個 Client 是預設程序數的一半,這樣的設定可能會讓兩個惡意 Client 就吃光您允許的 smtpd process 數。
您可以透過 smtpd_client_connection_count_limit 來控制每個 Client 的同時連線數,假設我們要設定允許的連線數為20,所以您需要編輯 main.cf 並定義 smtpd_client_connection_count_limit 如下範例:
smtpd_client_connection_count_limit=20
PS:請注意,建議此數值不應大於 smtpd 與 default_process_limit 大,否則一個 Client 就把 process 吃光囉!
Exception
如果某些 Client 您希望他不要受到限制,您可以透過smtpd_client_connection_count_limit_exceptions 來設定,預設已經允許 mynetworks,您可以另外加上您需要設定的主機,如以下範例:
smtpd_client_connection_count_limit_exceptions=$mynetworks, .ithome.com.tw,192.168.45.0/24
設定完成之後記得要執行 postfix reload 。
Postfix 三十天就上手-Day 19 淺談 Lookup Table ( 對照表 )
說明Postfix的對照表。
postfix 使用 lookup tables 來查看需要的資訊,如前面幾篇所介紹的 Postfix 三十天就上手-Day 10 建立別名( Alias )、Postfix 三十天就上手-Day 14 改寫郵件地址,都是 postfix 使用 lookup table 的範例,
另外也有人叫它作 maps (從參數設定可以看出來),反正我們中文就翻成對照表吧!
這些對照表一個共通的特性,就是-- 左手值(Key) 對應 右手值(Value),如 Postfix 三十天就上手-Day 10 建立別名 ( Alias ) 範例中的 lookup table 如下:
steve.jobs: m91001
左手邊的部分為 Key ( steve.jobs ),右手邊的部分為 Value( m91001 ),postfix 依照對照表的 key找到它所對應的 value。
postfix 支援多種不同類型的對照表,您可以執行下列指令來查看您的 postfix 支援哪些類型的對照表:
postconf -m
另外當您編輯 main.cf 來設定 postfix 使用哪一個 lookup table 時,都會以 type:table 來開頭,其中type 就是指對照表類型,如下列設定中,type 就是 hash
alias_maps = hash:/etc/postfix/aliases
以下是幾個比較常支援的類型:
btree
cidr
environ
hash
ldap
nis
pcre
proxy
regexp
static
unix
Postfix 三十天就上手-Day 20 使用 LDAP 當 Lookup Table
說明 Postfix 使用 LDAP 作為對照表。
postfix 使用 lookup tables 來查看需要的資訊,先前就有說明如果使用檔案來維護,當你帳號多機器多的時候,可能就會讓你太費力,所以使用 LDAP 來當 Lookup Table 會是一個不錯的選擇,今天就來對他好好說明一下。
如同上一篇所提到對照表共通的特性,左手值(Key) 對應 右手值(Value),在 LDAP 中您需要定義 postfix 來查詢時的 Key的屬性,邏輯如下:
對照檔方式: Key Value
LDAP 查詢方式: Query_filter Result_attribute
如 Postfix 三十天就上手-Day 15 利用 LDAP 改寫郵件地址 範例中說明,使 query_filter 來定義查詢的 Key 屬性,並設定 result_attribute 回查詢後對映傳回的 Value。
範例節錄如下:
server_host = ldap.ithome.com.tw
search_base = dc=ithome, dc=com, dc=tw
query_filter = (&(mailacceptinggeneralid=%s)
result_attribute= mail
上列範例中您可以看到在對 LDAP 進行查詢時,常會使用倒置換的運算元,說明如下:
%s
完整的mail address (ex:m91001@ithome.com.tw)
%u
取得@先前的 uid (ex:m91001)
%d
取得@之後的 domain (ex:ithome.com.tw)
Postfix 三十天就上手-Day 21 請求主機名稱
對抗垃圾郵件招數一,請求主機名稱。
在現在的網際網路上,可以說好人不多見,隨時都有惡意人士上門拜訪,將您 postfix 設定嚴格一點,是管理人員的必要實務之一。
要避免惡意人士,第一步當然就是請他先自我介紹一下,所以我們可以設定當有郵件傳送到或是經過時,要有正確的自我介紹。
我們可以在 SMTP 的對話中,在 HELO/EHLO 中限制主機名稱,這樣可以要求對方送出合乎規定的主機名稱。
您可以透過 smtpd_helo_required 來進行設定,請編輯 main.c f並定義 smtpd_helo_required 如下範例:
smtpd_helo_required=yes
此預設值為 no,設定後記得要執行 postfix reload。
以下就是測試沒有 HELO 的反應結果:
502 Error: send HELO/EHLO first
Postfix 三十天就上手-Day 22 要求 FQDN
對抗垃圾郵件招數一,請求FQDN。
FQDN 對一台正規郵件伺服器來說是非常重要的,許多郵件伺服器都會檢查對方是否有提供FQDN,如果就會拒絕接收。
所謂的 FQDN(Fully Qualified Domain Name) 是由「主機名稱」與「網域名稱所組成」。
以 mail.ithome.com.tw 為例:
主機名稱就是 mail
網域名稱就是 ithome.com.tw
您可以透過下列指令查看是否您的主機有設定正確的 FQDN:
hostname -f
傳回結果範例如下:
mail.ithome.com.tw
很多垃圾郵件發送機,可能都不會提供 FQDN,透過要求提供 FQDN 可以過濾掉一些水準較低的垃圾郵件發送機。
您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.c f並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=
...
reject_non_fqdn_hostname
...
由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_non_fqdn_hostname,設定後 postfix 會拒絕任何來自未傳送 FQDN 的主機的郵件。
以下就是測試沒有 FQDN 的反應結果:
504 <Client>: Helo command rejected: need fully-qualified hostname
Postfix 三十天就上手-Day 23 要求寄件人包含 FQDN
對抗垃圾郵件招數一,要求寄件人包含 FQDN。
上一篇 Postfix 三十天就上手-Day 22 要求FQDN 說明 FQDN 以及要求主機需要提供 FQDN。
對付垃圾郵件的另外一招就是要求寄件人也需要包含 FQDN,一個完整的信件,寄件人應該要整的像是下列的樣子:
sender@ithome.com.tw
在網域的部分 (@之後) 需要包含 FQDN,如果像是下列範例,都是不合格:
sender
sender@ithome
您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=
...
reject_non_fqdn_sender
...
由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_non_fqdn_sender,設定後 postfix 會拒絕任何來自未傳送 FQDN 的主機的郵件。
以下就是測試沒有 FQDN 的反應結果 (假設 from 是 sender ):
504 <sender>: Sender address rejected: need fully-qualified address
Postfix 三十天就上手-Day 24 拒絕不合法的主機名稱
對抗垃圾郵件招數一,拒絕不合法的主機名稱。
主機名稱除了必須是 FQDN,您還可以要求需要遵守網域名稱 ( DNS ) 系統的需求。合法的一個網域名稱需要遵守下列幾點:
需要有一個最上層網域,top-level domain (TLD),如 [com]
需要一個網域名稱,如 [ithome]
一個區隔網域名稱與 TLD 的點 (.)
您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=
...
reject_invalid_hostname
...
由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_invalid_hostname,設定後 postfix 拒絕不合法的主機名稱。
另外如果您的 postfix 版本 >=2.3 您可以透過 smtpd_helo_restrictions 來進行設定,請編輯 main.cf並定義 smtpd_helo_restrictions 如下範例:
smtpd_helo_restrictions =
reject_invalid_helo_hostname
以下就是測試沒有合法主機名稱的反應結果(假設主機名稱為[.]):
501 <.>: Helo command rejected: Invalid name
Postfix 三十天就上手-Day 25 拒絕網域不存在的郵件
對抗垃圾郵件招數一,拒絕網域不存在的郵件。
垃圾郵件的寄送者會利用 不存在的網域( unknow domain ) 來隱藏他們的來源。建議不要讓您的郵件伺服器接收網域不存在的郵件,如果讓您的郵件伺服器接收,如果在傳送過程中發生錯誤(如找不到收件人),會讓您的伺服器退件找不到正確位址,最後可能就會擠爆郵件管理者的信箱囉!
您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=
...
reject_unknown_sender_domain
...
由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_unknown_sender_domain,設定後 postfix 會拒絕網域不存在的郵件。
以下就是測試結果,postfix會回傳 Error Code 450 :
450 <sender@unknow.domain>: Sender address rejected: Domain not found
Postfix 三十天就上手-Day 26 設定收件人限制
對抗垃圾郵件招數一,設定收件人限制。
抵抗垃圾郵件的瘋狂亂送,我們可以拒絕收件人中有不存在網域。這樣您可以避免您的伺服器收了一堆信件,處理半天後又忙著回覆說找不到,不小心還會被 user 誤會是伺服器有問題。
所以最好的方法就是一開始就拒絕帶有不存在網域的收件人郵件。
您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=
...
reject_unknown_recipient_domain
...
由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_unknown_recipient_domain,設定後 postfix 會拒絕收件人網域不存在的郵件。
以下就是測試結果,postfix會回傳 Error Code 450 :
450 <recipient@unknow.domain>: Recipient address rejected: Domain not found
Postfix 三十天就上手-Day 27 拒絕無 FQDN 的收件人
對抗垃圾郵件招數一,拒絕無FQDN的收件人。
如果送件的人沒有提供完整的收件人位址,您是可以拒絕接收的。當然提供正確的收件人位址是送件人的責任。您可以設定 postfix 拒絕那些非 FQDN 的收件人郵件。
您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=
...
reject_non_fqdn_recipient
...
由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_non_fqdn_recipient,設定後 postfix 會拒絕非 FQDN 收件人的郵件。
以下就是測試提供一個非 FQDN 收件人的測試結果,我們測試送信給 recipient,postfix 會回傳Error Code 504 :
450 <recipient>: Recipient address rejected: need fully-qualified address
Postfix 三十天就上手-Day 28 檢核寄件人
對抗垃圾郵件大絕招,檢核寄件人。
對抗垃圾郵件的大絕招,檢核寄件人,這是 postfix 對垃圾郵件非常重要的工具,當然相對的,跟你打 KOF(King of Fighters) 一樣,要使用大絕招通常都需要先集氣,在 postfix 中雖然不用集氣,但是使用這招是需要付出相對的代價,需要時間與相對的系統資源。使用此招數postfix 會檢查寄件人是否真的存在,如果不存在則會拒絕接收該郵件。
當 postfix 對郵件進行第一次寄件人檢核的時候,該郵件會有9秒的短暫延遲,如果檢核的程序超過 9秒,postfix 會回應 code 450,並拒絕來自客戶端的郵件,正常的郵件客戶端在延遲之後,都會重新連線,但是垃圾郵件伺服器就不會想要重複讓費力氣囉。
您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=
...
reject_unverified_sender
permit
特別要說明的是,由於這招是大絕招,所以建議放到最後,如範例中您會看到reject_unverified_sender 之後就是 permit 了,這樣如果前面的條件可以拒絕掉的郵件,就不用再浪費大力氣了。
Postfix 三十天就上手-Day 29 選擇性的檢核寄件人
對抗垃圾郵件中絕招,選擇性檢核寄件人。
昨天 Postfix 三十天就上手-Day 28 檢核寄件人 已經說明了對抗垃圾郵件的大絕招,但是我們也有說明使用這招是需要付出相對的代價,如果您的郵件伺服器平常負載已經很高,很可能使用這招就造成系統的瓶頸。
想要使用大絕招又不想浪費不必要的力氣,當然就跟打 KOF (King of Fighters) 一樣,要發大絕招的時候,當然是要在能一擊必中的情況下,有打過的都知道,最好把大絕讓在連續技的最後一著,保證對手大失血。
雖然 postfix 沒辦法使用連續技讓垃圾郵一擊必中,但是可您讓您選擇要使用的對象,我們可以針對特別幾個愛發垃圾郵件的網域作選擇性的檢核寄件人。
Step.1 準備對照表,如 Postfix 三十天就上手-Day 19 淺談 Lookup Table (對照表) 中所說明的,您需要準備一個對照表,用對照表來定義您對哪些網域進行檢核寄件人。
建立 /etc/postfix/spam_domain ,檔案範例如下:
yahoo.com.tw reject_unverified_sender
hotmail.com reject_unverified_sender
以上範例指定當信件的寄件人符合設定的 domain,就會執行 reject_unverified_sender 的動作。
Step.2 完成對照表之後,接著就是要告訴 postfix 要來參考對照表,您還需要先執行 postmap hash:/etc/postfix/spam_domain 轉換為 db 檔。然後您可以透過 smtpd_recipient_restrictions 來進行設定讓 postfix可以參考對照表,請編輯 main.cf並定義 smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=
...
check_sender_access hash:/etc/postfix/spam_domain
permit
完成以上步驟後,當信件的寄件人符合設定的 domain,就會執行 reject_unverified_sender,reject_unverified_sender 的動作您可以參考上一篇 Postfix 三十天就上手-Day 28 檢核寄件人
Postfix 三十天就上手-Day 30 定義您的 VIP
給 VIP 特別的待遇。
在介紹了這麼多對付垃圾郵件的招數之後,相信大家最後一定心中會有一個疑慮,那就是萬一這些厲害招數攔了不該攔的人,那管理者可就頭大了。
相信企業的郵件伺服器除了害怕遭到垃圾郵件攻擊,更是害怕攔掉了客戶來的郵件,現實狀況中,可能不是只要求不能誤攔,連慢一點可能就要被抓起來打了。
面對這樣的情況,當然要給客戶 VIP 的待遇,所以今天就來說明如何在這些攔截條件執行之前,開一條 VIP 的康莊大道給客戶走。
Step.1 準備對照表,如 Postfix 三十天就上手-Day 19 淺談 Lookup Table( 對照表) 中所說明的,您需要準備一個對照表,用對照表來定義您的 VIP 是哪些網域寄件人。
建立 /etc/postfix/sender_vip ,檔案範例如下:
ithome.com.tw OK
apple.com OK
有看財經新聞的都知道,只要企業打進頻果供應鏈,股價就要漲了,雖然現在可成引爆毒頻果事件,但是我相信 Apple 還是最大的客戶,所以一定要拿 apple.com 來當範例囉。當然跟apple.com 一樣紅的 ithome.com.tw 也不能錯攔。
Step.2 完成對照表之後,接著就是要告訴 postfix 要來參考對照表,您還需要先執行 postmap hash:/etc/postfix/sender_vip 轉換為 db 檔。然後您可以透過 smtpd_recipient_restrictions 來進行設定讓 postfix 可以參考對照表,請編輯 main.cf 並定義 smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=
check_sender_access hash:/etc/postfix/sender_vip
...
這邊您特別要注意的是您放的順序,請注意本範例將它放到第一條,也就是說當第一條符合的時候,會得到 OK,其它條件就不會在繼續檢查下去,當然他就不怕被其他條件攔掉,也不用浪費時間作其他的檢查。
PS:如果您害被有垃圾郵件假造是您的 VIP 剛好 bypass 掉你的檢查,可以考慮在 VIP 之前作比較基本的檢查,此時您只要調整順序即可。
參考資料:http://www.postfix.org/ iT邦幫忙
經過了上篇 安裝 Postfix 之後,相信很多讀者對於 Posetfix 設定上有很多疑惑,所以此篇特別整理了 Postfix 的基礎概念與設定技巧,加強讀者在管理 Postfix 時能夠更有效的管理維運。
回覆刪除Postfix 三十天就上手-Day 01 Postfix 是什麼
要學 Postfix 之前,當然是要先知道什麼是 Postfix ,本篇文章,會先對 Postfix 作間單的介紹讓大家知道 Postfix 是什麼,它有哪些功能,以及如何運用它。
Postfix 的用途是『郵件伺服器』,以前大家比較熟悉的可能是『 Sendmail 伺服器』,這個 Postfix 與 sendmail 是類似的東西,那就是『MTA』啦,既然都是 MTA ,這個 Postfix 最早之前的用途也是想要用來『取代 sendmail 』。
Postfix 是由 Wietse Zweitze Venema ( http://www.porcupine.org/wietse/ ) 所發展的。sendmail 雖然很好用,但是安全性卻不足,尤其效能上是最大的困擾。
Venema 博士就在 1998 年利用他老大在 IBM 公司第一個休假年進行一個計畫:『設計一個可以取代 sendmail 的軟體套件,可以提供網站管理員一個更快速、更安全、而且"完全相容"於 sendmail 的 mail server 軟體!』