Hi-Fi優質I.T網:技術文章...
您尚未登入...
帳號:
密碼:

忘記密碼 
 
  訂閱電子報

取消   訂閱
 
2005/4/6-10:39:49
 郵件系統postfix安裝與配置(一)│作者:│分數:-3

 

郵件系統postfix安裝與配置

一、 postfix概述

  postfix是Wietse Venema在IBM的GPL協議之下開發的MTA(郵件傳輸
代理)軟體。下面一段話摘自postfix的官方站點(http://www.postfix.org)︰
“postfix是Wietse Venema想要為使用最廣泛的sendmail提供替代品的一個嘗試。在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.5 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訊息;為將位址重寫成標準的user@fully.qualified.domain格式進行排列;重信頭中抽出收件人的位址;將郵件投入incoming隊列中,並請求郵件隊列管理進程處理該郵件;請求trivial-rewrite進程將位址轉換成標準的user@fully.qualified.domain格式。

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:

[root@mail /root]# rpm -qa |grep sendmail
sendmail-doc-8.9.3-15
sendmail-8.9.3-15
sendmail-cf-8.9.3-15

4. 用以下命令強行卸載sendmail︰

[root@mail /root]# rpm -e sendmail sendmail-cf sendmail-doc --nodeps

5. 用以下命令殺死營運中的sendmail進程︰

[root@mail /root]# killall sendmail

6. 安裝postfix︰

[root@mail /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
[root@mail /root]#

7. 啟動postfix

[root@mail /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的配置文件︰

[root@mail 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命令。

4.2 postfix的基本配置

  postfix大約有100個配置參數,這些參數都可以透過main.cf 指定。配置的格式是這樣的,用等號連接參數和參數的值。如︰

myhostname = mail.mydomain.com

  等號的左邊是參數的名稱,等號的右邊是參數的值; 當然,我們也可以在參數的前面加上$來引用該參數,如︰

myorigin = $myhostname

  雖然postfix有100個左右的參數,但是postfix為大多數的參數都設置了缺省值,所以在讓postfix正常為你服務之前,你只需要配置為數不多的幾個參數。下面我們一起來看一看這些基本的postfix參數。需要注意的是,一旦你更改了main.cf文件的內容,則必須營運postfix reload命令使其生效。

1. myorigin

  myorigin參數指明發件人所在的域名。如果你的用戶的郵件位址為user@domain.com,則該參數指定@后面的域名。缺省地,postfix使用本地主機名作為myorigin,但是建議你最好使用你的域名,因為這樣更具有可讀性。比如︰安裝postfix的主機為mail.domain.com則我們可以這樣指定myorigin:

myorigin = domain.com

  當然我們也可以引用其他參數,如︰

myorigin = $mydomain 

2. mydestination

  mydestination參數指定postfix接收郵件時收件人的域名,換句話說,也就是你的postfix系統要接收什麼樣的郵件。比如︰你的用戶的郵件位址為user@domain.com, 也就是你的域為domain.com, 則你就需要接收所有收件人為user_name@domain.com的郵件。與myorigin一樣,缺省地,postfix使用本地主機名作為mydestination。如︰

mydestination = $mydomain
mydestination = domain.com

3. notify_classes

  在postfix系統中,必須指定一個postfix系統管理員的別名指向一個用戶,
只有這樣,在用戶遇到問題時才有報告的對象,postfix也才能將系統的問題報告給管理員。notify_classes參數就是用來指定向postfix管理員報告錯誤時的訊息級別。共有以下幾種級別︰

bounce︰將不可以投遞的郵件的拷貝發送給postfix管理員。出于個人隱私的緣故,該郵件的拷貝不包含信頭。

2bounce︰將兩次不可投遞的郵件拷貝發送給postfix管理員。

delay︰將郵件的投遞延遲訊息發送給管理員,僅僅包含信頭。

policy︰將由於UCE規則限制而被拒絕的用戶請求發送給postfix管理員,包含整個SMTP會話的內容。

protocol︰將協議的錯誤訊息或用戶企圖執行不支持的命令的記錄發送給postfix管理員。同樣包含整個SMTP會話的內容。

resource︰將由於資源錯誤而不可投遞的錯誤訊息發送給postfix管理員,比如︰隊列文件寫錯誤等等。

software︰將由於軟體錯誤而導致不可投遞的錯誤訊息發送給postfix管理員。

缺省值為︰

notify_classes = resource, software

4.myhostname

  myhostname 參數指定營運postfix郵件系統的主機的主機名。缺省地,該值被設定為本地機器名。你也可以指定該值,需要注意的是,要指定完整的主機名。如︰

myhostname = mail.domain.com

5.mydomain

  mydomain參數指定你的域名,缺省地,postfix將myhostname的第一部分刪除而作為mydomain的值。你也可以自己指定該值,如︰

mydomain = domain.com

6.mynetworks

  mynetworks 參數指定你所在的網路的網路位址,postfix系統根據其值來區別用戶是遠程的還是本地的,如果是本地網路用戶則允許其訪問。你可以用標準的A、B、C類網路位址,也可以用CIDR(無類域間路由)位址來表示,如︰

192.168.1.0/24
192.168.1.0/26

7.inet_interfaces

  inet_interfaces 參數指定postfix系統監聽的網路界面。缺省地,postfix監聽所有的網路界面。如果你的postfix營運在一個虛擬的ip位址上,則必須指定其監聽的位址。如︰

inet_interfaces = all
inet_interface = 192.168.1.1

4.3 postfix的UCE(unsolicited commercial email)控制

  所謂UCE控制就是指控制postfix接收或轉發來自于什麼地方的郵件。

  缺省地,postfix轉發符合以下條件的郵件︰

* 來自客戶端ip位址符合$mynetworks的郵件。
* 來自客戶端主機名符合$relay_domains及其子域的郵件。
* 到達站為$relay_domains及其子域的郵件。

  缺省地,postfix接受符合以下條件的郵件︰

* 到達站為$inet_interfaces的郵件。
* 到達站為$mydestination的郵件。
* 到達站為$virtual_maps的郵件。

  但是我們也可以透過下面的規則來實現更強大的控制功能。

1. 信頭過濾

  透過header_checks參數限制接收郵件的信頭的格式,如果符合指定的格式,則拒絕接收該郵件。可以指定一個或多個查詢列表,如果新郵件的信頭符合列表中的某一項則拒絕該接收郵件。如︰

header_checks = regexp:/etc/postfix/header_checks 
header_checks = pcre:/etc/postfix/header_checks

  缺省地,postfix不進行信頭過濾。

2.客戶端主機名/位址限制

  透過smtpd_client_restrictions參數限制可以向postfix發起SMTP 連接的客戶端的主機名或ip位址。可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規則有︰

reject_unknown_client︰如果客戶端的ip位址在DNS中沒有PTR記錄則拒絕轉發該客戶端的連接請求。可以用unknown_client_reject_code參數指定返回給客戶機的錯誤代碼(缺省為450)。如果你有用戶沒有作DNS記錄則不要啟用該選項。

permit_mynetworks︰如果客戶端的ip位址符合$mynetworks參數定義的範圍則接受該客戶端的連接請求,並轉發該郵件。

check_client_access maptype:mapname︰根據客戶端的主機名、父域名、ip位址或屬于的網路搜索access數據庫。如果搜索的結果為REJECT 或者 '[45]XX text' 則拒絕該客戶端的連接請求;如果搜索的結果為OK、RELAY 或數字則接受該客戶端的連接請求,並轉發該郵件。。可以用access_map_reject_code參數指定返回給客戶機的錯誤代碼(缺省為554)。

reject_maps_rbl︰如果客戶端的網路位址符合$maps_rbl_domains參數的值則拒絕該客戶端的連接請求。可以用maps_rbl_reject_code參數指定返回給客戶機的錯誤代碼(缺省為554)。

  示例︰

smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl 
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client

  該參數的缺省值為︰

smtpd_client_restrictions =

  也即接收來自任何客戶端的SMTP連接。

3. 是否請求HELO命令

  可以透過smtpd_helo_required參數指定客戶端在SMTP會話的開始是否發送一個HELO命令。你可以指定該參數的值為yes或no。缺省值為︰

smtpd_helo_required = no

4. HELO主機名限制

  可以透過smtpd_helo_restrictions參數指定客戶端在執行HELO命令時發送給postfix的主機名。缺省地,postfix接收客戶端發送的任意形式的主機名。可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規則有︰

reject_invalid_hostname︰如果HELO命令所帶的主機名參數不符合語法規範則拒絕客戶機的連接請求。可以用invalid_hostname_reject_code參數指定返回給客戶機的錯誤代碼(缺省為501)。

permit_naked_ip_address︰RFC要求客戶端的HELO命令包含的ip位址放在方括號內,你可以用permit_naked_ip_address參數取消該限制。因為有的mail客戶端不遵守該RFC的規定。

reject_unknown_hostname︰如果客戶端執行HELO命令時的主機名在DNS中沒有相應的A 或 MX 記錄則拒絕該客戶端的連接請求。可以用invalid_hostname_reject_code參數指定返回給客戶機的錯誤代碼(缺省為450)。

reject_non_fqdn_hostname︰如果客戶端執行HELO命令時的主機名不是RFC規定的完整的域名則拒絕客戶端的連接請求。可以用invalid_hostname_reject_code參數指定返回給客戶機的錯誤代碼(缺省為504)。

check_helo_access maptype:mapname︰根據客戶端HELO的主機名、父域名搜索access數據庫。如果搜索的結果為REJECT 或者 '[45]XX text' 則拒絕該客戶端的連接請求;如果搜索的結果為OK、RELAY 或數字則接受該客戶端的連接請求。可以用access_map_reject_code參數指定返回給客戶機的錯誤代碼(缺省為554)。

  示例︰

smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname

5. RFC 821信頭限制

  RFC 821對郵件的信頭做了嚴格的規定,但是廣泛使用的sendmail並不支
持該規定,所以對于該參數我們只能說不,即︰

strict_rfc821_envelopes = no

6. 透過發件人位址進行限制

  可以用smtpd_sender_restrictions參數透過發件人在執行MAIL FROM命令時提供的位址進行限制。可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規則有︰

reject_unknown_sender_domain︰如果MAIL FROM命令提供的主機名在DNS中沒有相應的A 或 MX 記錄則拒絕該客戶端的連接請求。可以用unknown_address_reject_code參數指定返回給客戶機的錯誤代碼(缺省為450)。

check_sender_access maptype:mapname︰根據MAIL FROM命令提供的主機名、父域搜索access數據庫。如果搜索的結果為REJECT 或者 '[45]XX text' 則拒絕該客戶端的連接請求;如果搜索的結果為OK、RELAY 或數字則接受該客戶端的連接請求。可以用access_map_reject_code參數指定返回給客戶機的錯誤代碼(缺省為554)。可以透過該參數過濾來自某些不受歡迎的發件人的郵件。

reject_non_fqdn_sender︰如果MAIL FROM命令提供的主機名不是RFC規定的完整的域名則拒絕客戶端的連接請求。可以用non_fqdn_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為504)。
缺省地,postfix接受來自任何發件人的郵件。

  示例︰

smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain

7. 透過收件人位址進行過濾

  可以用smtpd_recipient_restrictions參數透過發件人在執行RCPT TO命令時提供的位址進行限制。缺省值為︰

smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains

  可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規則有︰

check_relay_domains︰如果符合以下的條件,則接受SMTP連接請求,否則拒絕該連接,可以用relay_domains_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為504)。

* 客戶端主機名符合$relay_domains及其子域
* 到達站為$inet_interfaces、$mydestination或$virtual_maps

permit_auth_destination︰不管客戶端的主機名,只要符合以下的條件,就
接受SMTP連接請求︰

* 解析后的目標位址符合$relay_domains及其子域
* 解析后的目標位址符合$inet_interfaces、$mydestination或$virtual_maps

reject_unauth_destination︰不管客戶端的主機名,只要符合以下的條件,就拒絕該客戶端SMTP連接請求︰

* 解析后的目標位址符合$relay_domains及其子域
* 解析后的目標位址符合$inet_interfaces、$mydestination或$virtual_maps

check_recipient_access︰根據解析后的目標位址、父域搜索access數據庫。如果搜索的結果為REJECT 或者 '[45]XX text' 則拒絕該客戶端的連接請求;如果搜索的結果為OK、RELAY 或數字則接受該客戶端的連接請求。可以用access_map_reject_code參數指定返回給客戶機的錯誤代碼(缺省為554)。

reject_unknown_recipient_domain︰如果收件人的郵件位址在DNS中沒有相應的A 或 MX 記錄則拒絕該客戶端的連接請求。可以用unknown_address_reject_code參數指定返回給客戶機的錯誤代碼(缺省為450)。

reject_non_fqdn_recipient︰如果發件人在執行RCPT TO命令時提供的位址
不是完整的域名則拒絕其SMTP連接請求。可以用The non_fqdn_reject_code參數指定返回給客戶機的錯誤代碼(缺省為504)。

4.4 posftfix的性能控制

  之所以對postfix的性能進行控制,是為了在遇到郵件風暴時保證postfix可以正常營運。通常,我們可以透過對下列postfix參數的配置來調節postfix的性能,這些參數都是透過mail.cf配置文件進行配置的,修改以後不要忘了營運postfix reload命令來使配置生效。

1. 進程數限制

  可以透過default_process_limit 參數來控制postfix系統同時可以營運的最大進程數目。缺省值是50個。

2. 對同一目標主機的並發連接限制

  當向同一目標主機發出SMTP連接時,postfix初始化發出兩個SMTP連接,如果投遞成功則增加並發的SMTP連接數目,遇到擁塞時又減少並發連接的數目。postfix中透過以下的參數對同一目標主機的並發連接進行控制︰

* initial_destination_concurrency︰控制對同一目標主機的初始化並發連接數目。缺省值為2。
* default_destination_concurrency_limit︰控制初始化連接后對同一目標主機的最大並發連接數目。缺省值為10。
* local_destination_concurrency_limit︰控制對同一本地收件人的最大同時投遞的郵件數目。缺省值為2,因為對本地同一收件人投遞郵件時投遞工作只能一個接一個的進行,所以設得在大也沒用。

3. 對同一封郵件的收件人數目限制

  透過default_destination_recipient_limit參數來控制postfix的投遞代理(如
smtp進程)可以將同一封郵件發送給多少個收件人。缺省值為50。也可以用明確指出該投遞代理的參數來覆蓋該缺省值。如用smtpd_recipient_limit來指定smtp投遞代理可以將同一封郵件發送給多少個收件人,該參數的缺省值為1000。

4. 延遲投遞控制

  透過defer_transports參數,我們可以延遲投遞該參數指定的郵件直到postfix明確的提出投遞要求。下面我們看一個例子︰

  有一個小型的局域網,用戶都將郵件發送給局域網內部的一台postfix郵件伺服器,然后透過在該伺服器上撥號將郵件發送出去。這時我們可以這樣指定該參數的值︰

defer_transports = smtp

  該語句表示postfix延遲投遞所有的郵件直到執行sendmail -q命令,這樣我們就可以在ppp的腳本中加上sendmail -q,以便在撥號成功后讓postfix開始投遞郵件。


請評分: -3 -2 -1 +1 +2 +3
  
   

Hi-Fi優質I.T網”站內所有文章、圖片除特別加註外均屬本站所有,如有任何問題請來信告知
請支持言論自由,討論區所發表之言論不代表本站立場
Hi-Fi優質I.T網”版權所有2004©
---最佳顯示效果1024*768---