天天看點

郵件系統postfix安裝與配置(含配制詳解)

郵件 系統postfix 安裝與配置

一、 postfix概述

postfix是Wietse Venema在IBM的GPL協定之下開發的MTA(郵件傳輸

代理)軟體。下面一段話摘自postfix的官方站點(http://www.postfix.org):

“postfix是Wietse Venema想要為使用最廣泛的send mail提供替代品的一個嘗試。在Internet世界中,大部分的電子郵件都是通過sendmail來投遞的,大約有100萬 使用者使用sendmail,每天投遞上億封郵件。這真實一個讓人吃驚的數字。 Postfix試圖更快、更容易管理、更安全,同時還與sendmail保持足夠的相容性。”

1.1 postfix的特點

1. postfix是免費的:

postfix想要作用的範圍是廣大的Internet使用者,試圖影響大多數的Internet上的電子郵件系統,是以它是免費的。

2. 更快:

postfix在性能上大約比sendmail快三倍。一部運作postfix的台式PC每天可以收發上百萬封郵件。

3. 相容性好:

postfix是sendmail相容的,進而使sendmail使用者可以很友善地遷移到postfix。Postfix支援/var[/spool]/mail、/etc/aliases、 NIS、和 ~/. forward 檔案。

4. 更健壯:

postfix被設計成在重負荷之下仍然可以正常工作。當系統運作超出了可用的記憶體或磁盤空間時,postfix會自動減少運作程序的數目。當處理的郵件數目增長時,postfix運作的程序不會跟着增加。

5. 更靈活:

postfix是由超過一打的小程式組成的,每個程式完成特定的 功能。你可以

通過配置檔案設定每個程式的運作參數。

6. 安全性

postfix具有多層防禦結構,可以有效地抵禦惡意入侵者。如大多數的postfix程式可以運作在較低的權限之下,不可以通過網絡通路安全性相關的本地投遞程式等等。

1.2 postfix的總體結構

postfix由十幾個具有不同功能的半駐留程序組成,并且在這些程序中并無特定的程序間父子關系。某一個特定的程序可以為其他程序提供特定的服務。

大多數的postfix程序由一個程序統一進行管理,該程序負責在需要的時候調用其他程序,這個管理程序就是master程序。該程序也是一個背景程式。

這些postfix程序是可以配置的,我們可以配置每個程序運作的數目,可重用的次數,生存的時間等等。通過靈活的配置特性可以使整個系統的運作成本大大降低。

1.2.1 postfix的郵件隊列(mail queues)

postfix有四種不同的郵件隊列,并且由隊列管理程序統一進行管理:

1. maildrop:本地郵件放置在maildrop中,同時也被拷貝到incoming中。

2. incoming:放置正在到達或隊列管理程序尚未發現的郵件。

3. active:放置隊列管理程序已經打開了并正準備投遞的郵件,該隊列有

長度的限制。

4. deferred:放置不能被投遞的郵件。

隊列管理程序僅僅在記憶體中保留active隊列,并且對該隊列的長度進行限

制,這樣做的目的是為了避免程序運作記憶體超過系統的可用記憶體。

1.2.2 postfix對郵件風暴的處理

當有新的郵件到達時,postfix進行初始化,初始化時postfix同時隻接受兩個并發的連接配接請求。當郵件投遞成功後,可以同時接受的并發連接配接的數目 就會緩慢地增長至一個可以配置的值。當然,如果這時系統的消耗已到達系統不能承受的負載就會停止增長。還有一種情況時,如果postfix在處理郵件過程 中遇到了問題,則該值會開始降低。

當接收到的新郵件的數量超過postfix的投遞能力時,postfix會暫時停止投遞deferred隊列中的郵件而去處理新接收到的郵件。這是因為處理新郵件的延遲要小于處理deferred隊列中的郵件。Postfix會在空閑時處理deferred中的郵件。

1.2.3 postfix對無法投遞的郵件的處理

當一封郵件第一次不能成功投遞時,postfix會給該郵件貼上一個将來的時間郵票。郵件隊列管理程式會忽略貼有将來時間郵票的郵件。時間郵票到期 時,postfix會嘗試再對該郵件進行一次投遞,如果這次投遞再次失敗,postfix就給該郵件貼上一個兩倍于上次時間郵票的時間郵票,等時間郵票到 期時再次進行投遞,依此類推。當然,經過一定次數的嘗試之後,postfix會放棄對該郵件的投遞,傳回一個錯誤資訊給該郵件的 發件人。

1.2.4 postfix對不可到達的目的地郵件的處理

postfix會在記憶體中儲存一個有長度限制的目前不可到達的 位址清單。這樣就避免了對那些目的地為目前不可到達位址的郵件的投遞嘗試。進而大大提高了系統的性能。

1.2.2 postfix的安全性

postfix通過一系列的措施來提高系統的安全性,這些措施包括:

1. 動态配置設定記憶體,進而防止系統緩沖區溢出;

2. 把大郵件分割成幾塊進行處理,投遞時再重組;

3. Postfix的各種程序不在其他使用者程序的控制之下運作,而是運作在駐留

主程序master的控制之下,與其他使用者程序無父子關系,所有有很好的

絕緣性。

4. Postfix的隊列檔案有其特殊的格式,隻能被postfix本身識别;

二、 postfix對郵件的處理過程

2.1 接收郵件的過程

圖二、postfix對接收郵件的處理

當postfix接收到一封新郵件時,新郵件首選在incoming隊列處停留,然後針對不同的情況進行不同的處理:

1.對于來自于本地的郵件:sendmail程序負責接收來自本地的郵件放在maildrop隊列中,然後pickup程序對maildrop中的郵件進行完整性檢測。maildrop目錄的權限必須設定為某一使用者不能删除其他使用者的郵件。

2.對于來自于網絡的郵件:smtpd程序負責接收來自于網絡的郵件,并且進行安全性檢測。可以通過UCE(unsolicited commercial email)控制smtpd的行為。

3.由postfix程序産生的郵件:這是為了将不可投遞的資訊傳回給發件人。這些郵件是由bounce背景程式産生的。

5. 由postfix自己産生的郵件: 提示postmaster(也即postfix管理者)postfix

運作過程中出現的問題。(如SMTP協定問題,違反UCE規則的記錄等等。)

關于cleanup背景程式的說明:cleanup是對新郵件進行處理的最後一道工序

它對新郵件進行以下的處理:添加信頭中丢失的Form資訊;為将位址重寫成标準的[email protected]格式進行排列;重信頭中抽出 收件人的位址;将郵件投入incoming隊列中,并請求郵件隊列管理程序處理該郵件;請求trivial-rewrite程序将位址轉換成标準的[email protected]格式。

2.2 投遞郵件的過程

新郵件一旦到達incoming隊列,下一步就是開始投遞郵件,postfix投遞郵件時的處理過程如圖三所示。相關的說明如下:

郵件隊列管理程序是整個postfix郵件系統的心髒。它和local、smtp、pipe等投遞代理相聯系,将包含有隊列檔案路徑資訊、郵件發件人地 址、郵件收件人位址的投遞請求發送給投遞代理。隊列管理程序維護着一個deferred隊列,那些無法投遞的郵件被投遞到該隊列中。除此之外,隊列管理進 程還維護着一個active隊列,該隊列中的郵件數目是有限制的,這是為了防止在負載太大時記憶體溢出。郵件隊列管理程式還負責将收件人位址在 relocated表中列出的郵件傳回給發件人,該表包含無效的收件人位址。

如果郵件隊列管理程序請求,rewrite背景程式對收件人位址進行 解析。但是預設地,rewrite隻對郵件收件人是本地的還是遠端的進行差別。

如果郵件對你管理程序請求,bounce背景程式可以生成一個郵件不可投遞的報告。

本地投遞代理local程序可以了解類似UNIX風格的郵箱,sendmail風格的系統别名資料庫和sendmail風格的.forward檔案。可以 同時運作多個local程序,但是對同一個使用者的并發投遞程序數目是有限制的。你可以配置local将郵件投遞到使用者的宿主目錄,也可以配置local将 郵件發送給一個外部指令,如流行的本地投遞代理procmail。在流行的linux發行版本RedHat中,我們就使用procmail作為最終的本地 投遞代理。

遠端投遞代理SMTP程序根據收件人位址 查詢一個SMTP 伺服器清單,按照順序連接配接每一個SMTP伺服器,根據性能對該表進行排序。在系統負載太大時,可以有數個并發的SMTP程序同時運作。

pipe是用于UUCP協定的投遞代理。

三、 postfix的 安裝過程

3.1源代碼包的 安裝

1. 擷取postfix的源代碼包

從postfix官方站點www.postfix.org取得postfix的源代碼包postfix-19991231-pl08.tar.gz。将其拷貝到/tmp

2.解開源代碼包,将生成/tmp/ postfix-19991231-pl08目錄。

tar xvzf postfix-19991231-pl08.tar.gz

3.編譯源代碼包

cd /tmp/ postfix-19991231-pl08

make

4.建立一個新使用者“postfix”,該使用者必須具有唯一的使用者id群組id号,同時應該讓該使用者不能 登入到系統,也即不為該使用者指定可執行的登入外殼程式和可用的使用者宿主目錄。我們可以先用adduser postfix 添加使用者再編輯/etc/passwd檔案中的相關條目如下所示:

postfix:*:12345:12345:postfix:/no/where:/no/shell

5.确定/etc/aliases檔案中包含如下的條目:

postfix: root

6. 以root使用者登入,在/tmp/ postfix-19991231-pl08目錄下執行指令:

./INSTALL.sh

7. 啟動postfix

# postfix start

8.關于maildrop目錄權限的說明:

postfix可以使用一個所有使用者都可寫的(也即目錄權限為1773)的maildrop

目錄來讓本地使用者送出郵件。這種方法避免了使用set-uid 或 set-gid 軟體,并且在郵件系統不可用時,使用者仍然可以送出郵件。其他使用者沒有通路該目錄中的隊列檔案的權限。接收來自網絡的郵件時postfix不使用 maildrop目錄。但是,由于該目錄的權限是733,其他使用者可以建立一個硬連接配接到該目錄中的檔案進而導緻該郵件被投遞多次或無法删除,也就是說這将 導緻安全性問題。如果你想要使用這種方式來讓使用者送出郵件,就要在INSTALL.sh 腳本問你是否需要set-gid 時回答no。

如果你的系統有多個使用者的話,最好取消以上的方式而采用利用set-gid 用

戶權限送出郵件的方式。這時,我們首先需要建立一個組id唯一的組"maildrop" 并且确定該組中沒有使用者成員。然後在INSTALL.sh 問你是否需要set-gid 時指定"maildrop"。

提示:在 安裝postfix之前,請删除已經 安裝的sendmail。

3.2 rpm包的 安裝

1. 擷取postfix的rpm軟體包。

我們可以從http://www.alltrading.es/postfix/RPMS/i386/ 獲得postfix的rpm軟體包。目前的最 新版本是postfix-20000531-2.i386.rpm。

2. 備份你的/etc/aliases和/etc/aliases.db,因為postfix要使用該别名資料庫。

3. 用以下指令檢視系統是否 安裝了sendmail:

[[email protected] /root]# rpm -qa │grep sendmail

sendmail-doc-8.9.3-15

sendmail-8.9.3-15

sendmail-cf-8.9.3-15

4. 用以下指令強行解除安裝sendmail:

[[email protected] /root]# rpm -e sendmail sendmail-cf sendmail-doc --nodeps

5. 用以下指令殺死運作中的sendmail程序:

[[email protected] /root]# killall sendmail

6. 安裝postfix:

[[email protected] /root]# rpm -Uvh postfix-20000531-2.i386.rpm

postfix ##################################################

postfix-script: warning: creating missing Postfix pid directory

postfix-script: warning: creating missing Postfix incoming directory

postfix-script: warning: creating missing Postfix active directory

postfix-script: warning: creating missing Postfix bounce directory

postfix-script: warning: creating missing Postfix defer directory

postfix-script: warning: creating missing Postfix deferred directory

postfix-script: warning: creating missing Postfix saved directory

postfix-script: warning: creating missing Postfix corrupt directory

postfix-script: warning: creating missing Postfix public directory

postfix-script: warning: creating missing Postfix private directory

[[email protected] /root]#

7. 啟動postfix

[[email protected] /root]# /etc/rc.d/init.d/postfix start

3.3 配置系統每次啟動時自動啟動postfix

1.如果你 安裝的是postfix的源代碼包,可以在/etc/rc.d/rc.local檔案中加入如下的語句讓系統每次啟動時自動啟動postfix:

if [ -f /usr/libexec/postfix ]; then

/usr/libexec/postfix start

fi

2.如果你 安裝的是postfix的rpm包,可以通過setup指令來設定在系統啟動時啟動postfix。

四、 postfix的配置詳解

4.1 postfix的配置檔案結構

postfix的配置檔案位于/etc/postfix下, 安裝完postfix以後,我們可以通過ls指令檢視postfix的配置檔案:

[[email protected] postfix]# ls

install.cf main.cf master.cf postfix-script

這四個檔案就是postfix最基本的配置檔案,它們的差別在于:

mail.cf:是postfix主要的配置檔案。

Install.cf:包含 安裝過程中 安裝程式産生的postfix初始化設定。

master.cf:是postfix的master程序的配置檔案,該檔案中的每一行都是用來配置postfix的元件程序的運作方式。

postfix-script:包裝了一些postfix指令,以便我們在linux環境中安全地執行這些postfix指令。

轉載于:https://www.cnblogs.com/jing8100/archive/2010/01/24/1655042.html