亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 76400 | 回復(fù): 19
打印 上一主題 下一主題

[Mail] 郵件系統(tǒng)postfix安裝與配置(zt) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2003-06-21 12:11 |只看該作者 |倒序?yàn)g覽
郵件系統(tǒng)postfix安裝與配置(一)



郵件系統(tǒng)postfix安裝與配置
一、 postfix概述
postfix是Wietse Venema在IBM的GPL協(xié)議之下開發(fā)的MTA(郵件傳輸
代理)軟件。下面一段話摘自postfix的官方站點(diǎn)(http://www.postfix.org):
“postfix是Wietse Venema想要為使用最廣泛的sendmail提供替代品的一個(gè)嘗試。在Internet世界中,大部分的電子郵件都是通過sendmail來投遞的,大約有100萬用戶使用sendmail,每天投遞上億封郵件。這真實(shí)一個(gè)讓人吃驚的數(shù)字。Postfix試圖更快、更容易管理、更安全,同時(shí)還與sendmail保持足夠的兼容性!

1.1 postfix的特點(diǎn)
1. postfix是免費(fèi)的:
    postfix想要作用的范圍是廣大的Internet用戶,試圖影響大多數(shù)的Internet上的電子郵件系統(tǒng),因此它是免費(fèi)的。
2. 更快:
    postfix在性能上大約比sendmail快三倍。一部運(yùn)行postfix的臺(tái)式PC每天可以收發(fā)上百萬封郵件。
3. 兼容性好:
    postfix是sendmail兼容的,從而使sendmail用戶可以很方便地遷移到postfix。Postfix支持/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 文件。
   4. 更健壯:
postfix被設(shè)計(jì)成在重負(fù)荷之下仍然可以正常工作。當(dāng)系統(tǒng)運(yùn)行超出了可用的內(nèi)存或磁盤空間時(shí),postfix會(huì)自動(dòng)減少運(yùn)行進(jìn)程的數(shù)目。當(dāng)處理的郵件數(shù)目增長時(shí),postfix運(yùn)行的進(jìn)程不會(huì)跟著增加。
5. 更靈活:
postfix是由超過一打的小程序組成的,每個(gè)程序完成特定的功能。你可以
通過配置文件設(shè)置每個(gè)程序的運(yùn)行參數(shù)。
   6. 安全性
postfix具有多層防御結(jié)構(gòu),可以有效地抵御惡意入侵者。如大多數(shù)的postfix程序可以運(yùn)行在較低的權(quán)限之下,不可以通過網(wǎng)絡(luò)訪問安全性相關(guān)的本地投遞程序等等。

1.2 postfix的總體結(jié)構(gòu)
postfix由十幾個(gè)具有不同功能的半駐留進(jìn)程組成,并且在這些進(jìn)程中并無特定的進(jìn)程間父子關(guān)系。某一個(gè)特定的進(jìn)程可以為其他進(jìn)程提供特定的服務(wù)。
大多數(shù)的postfix進(jìn)程由一個(gè)進(jìn)程統(tǒng)一進(jìn)行管理,該進(jìn)程負(fù)責(zé)在需要的時(shí)候調(diào)用其他進(jìn)程,這個(gè)管理進(jìn)程就是master進(jìn)程。該進(jìn)程也是一個(gè)后臺(tái)程序。
這些postfix進(jìn)程是可以配置的,我們可以配置每個(gè)進(jìn)程運(yùn)行的數(shù)目,可重用的次數(shù),生存的時(shí)間等等。通過靈活的配置特性可以使整個(gè)系統(tǒng)的運(yùn)行成本大大降低。


1.2.1 postfix的郵件隊(duì)列(mail queues)
postfix有四種不同的郵件隊(duì)列,并且由隊(duì)列管理進(jìn)程統(tǒng)一進(jìn)行管理:
1. maildrop:本地郵件放置在maildrop中,同時(shí)也被拷貝到incoming中。
2. incoming:放置正在到達(dá)或隊(duì)列管理進(jìn)程尚未發(fā)現(xiàn)的郵件。
3. active:放置隊(duì)列管理進(jìn)程已經(jīng)打開了并正準(zhǔn)備投遞的郵件,該隊(duì)列有
             長度的限制。
4. deferred:放置不能被投遞的郵件。
隊(duì)列管理進(jìn)程僅僅在內(nèi)存中保留active隊(duì)列,并且對(duì)該隊(duì)列的長度進(jìn)行限
制,這樣做的目的是為了避免進(jìn)程運(yùn)行內(nèi)存超過系統(tǒng)的可用內(nèi)存。
   
1.2.2 postfix對(duì)郵件風(fēng)暴的處理
當(dāng)有新的郵件到達(dá)時(shí),postfix進(jìn)行初始化,初始化時(shí)postfix同時(shí)只接受兩個(gè)并發(fā)的連接請(qǐng)求。當(dāng)郵件投遞成功后,可以同時(shí)接受的并發(fā)連接的數(shù)目就會(huì)緩慢地增長至一個(gè)可以配置的值。當(dāng)然,如果這時(shí)系統(tǒng)的消耗已到達(dá)系統(tǒng)不能承受的負(fù)載就會(huì)停止增長。還有一種情況時(shí),如果postfix在處理郵件過程中遇到了問題,則該值會(huì)開始降低。
當(dāng)接收到的新郵件的數(shù)量超過postfix的投遞能力時(shí),postfix會(huì)暫時(shí)停止投遞deferred隊(duì)列中的郵件而去處理新接收到的郵件。這是因?yàn)樘幚硇锣]件的延遲要小于處理deferred隊(duì)列中的郵件。Postfix會(huì)在空閑時(shí)處理deferred中的郵件。

1.2.3 postfix對(duì)無法投遞的郵件的處理
當(dāng)一封郵件第一次不能成功投遞時(shí),postfix會(huì)給該郵件貼上一個(gè)將來的時(shí)間郵票。郵件隊(duì)列管理程序會(huì)忽略貼有將來時(shí)間郵票的郵件。時(shí)間郵票到期時(shí),postfix會(huì)嘗試再對(duì)該郵件進(jìn)行一次投遞,如果這次投遞再次失敗,postfix就給該郵件貼上一個(gè)兩倍于上次時(shí)間郵票的時(shí)間郵票,等時(shí)間郵票到期時(shí)再次進(jìn)行投遞,依此類推。當(dāng)然,經(jīng)過一定次數(shù)的嘗試之后,postfix會(huì)放棄對(duì)該郵件的投遞,返回一個(gè)錯(cuò)誤信息給該郵件的發(fā)件人。

1.2.4 postfix對(duì)不可到達(dá)的目的地郵件的處理
postfix會(huì)在內(nèi)存中保存一個(gè)有長度限制的當(dāng)前不可到達(dá)的地址列表。這樣就避免了對(duì)那些目的地為當(dāng)前不可到達(dá)地址的郵件的投遞嘗試。從而大大提高了系統(tǒng)的性能。

1.2.2 postfix的安全性
postfix通過一系列的措施來提高系統(tǒng)的安全性,這些措施包括:
1. 動(dòng)態(tài)分配內(nèi)存,從而防止系統(tǒng)緩沖區(qū)溢出;
2. 把大郵件分割成幾塊進(jìn)行處理,投遞時(shí)再重組;
3. Postfix的各種進(jìn)程不在其他用戶進(jìn)程的控制之下運(yùn)行,而是運(yùn)行在駐留
   主進(jìn)程master的控制之下,與其他用戶進(jìn)程無父子關(guān)系,所有有很好的
   絕緣性。
4. Postfix的隊(duì)列文件有其特殊的格式,只能被postfix本身識(shí)別;

二、 postfix對(duì)郵件的處理過程
2.1 接收郵件的過程

圖二、postfix對(duì)接收郵件的處理

當(dāng)postfix接收到一封新郵件時(shí),新郵件首選在incoming隊(duì)列處停留,然后針對(duì)不同的情況進(jìn)行不同的處理:
1.對(duì)于來自于本地的郵件:sendmail進(jìn)程負(fù)責(zé)接收來自本地的郵件放在maildrop隊(duì)列中,然后pickup進(jìn)程對(duì)maildrop中的郵件進(jìn)行完整性檢測(cè)。maildrop目錄的權(quán)限必須設(shè)置為某一用戶不能刪除其他用戶的郵件。
2.對(duì)于來自于網(wǎng)絡(luò)的郵件:smtpd進(jìn)程負(fù)責(zé)接收來自于網(wǎng)絡(luò)的郵件,并且進(jìn)行安全性檢測(cè)?梢酝ㄟ^UCE(unsolicited commercial email)控制smtpd的行為。
3.由postfix進(jìn)程產(chǎn)生的郵件:這是為了將不可投遞的信息返回給發(fā)件人。這些郵件是由bounce后臺(tái)程序產(chǎn)生的。
5. 由postfix自己產(chǎn)生的郵件:提示postmaster(也即postfix管理員)postfix
運(yùn)行過程中出現(xiàn)的問題。(如SMTP協(xié)議問題,違反UCE規(guī)則的記錄等等。)

關(guān)于cleanup后臺(tái)程序的說明:cleanup是對(duì)新郵件進(jìn)行處理的最后一道工序
它對(duì)新郵件進(jìn)行以下的處理:添加信頭中丟失的Form信息;為將地址重寫成標(biāo)準(zhǔn)的user@fully.qualified.domain格式進(jìn)行排列;重信頭中抽出收件人的地址;將郵件投入incoming隊(duì)列中,并請(qǐng)求郵件隊(duì)列管理進(jìn)程處理該郵件;請(qǐng)求trivial-rewrite進(jìn)程將地址轉(zhuǎn)換成標(biāo)準(zhǔn)的user@fully.qualified.domain格式。

2.2 投遞郵件的過程
    新郵件一旦到達(dá)incoming隊(duì)列,下一步就是開始投遞郵件,postfix投遞郵件時(shí)的處理過程如圖三所示。相關(guān)的說明如下:
    郵件隊(duì)列管理進(jìn)程是整個(gè)postfix郵件系統(tǒng)的心臟。它和local、smtp、pipe等投遞代理相聯(lián)系,將包含有隊(duì)列文件路徑信息、郵件發(fā)件人地址、郵件收件人地址的投遞請(qǐng)求發(fā)送給投遞代理。隊(duì)列管理進(jìn)程維護(hù)著一個(gè)deferred隊(duì)列,那些無法投遞的郵件被投遞到該隊(duì)列中。除此之外,隊(duì)列管理進(jìn)程還維護(hù)著一個(gè)active隊(duì)列,該隊(duì)列中的郵件數(shù)目是有限制的,這是為了防止在負(fù)載太大時(shí)內(nèi)存溢出。郵件隊(duì)列管理程序還負(fù)責(zé)將收件人地址在relocated表中列出的郵件返回給發(fā)件人,該表包含無效的收件人地址。


如果郵件隊(duì)列管理進(jìn)程請(qǐng)求,rewrite后臺(tái)程序?qū)κ占说刂愤M(jìn)行解析。但是缺省地,rewrite只對(duì)郵件收件人是本地的還是遠(yuǎn)程的進(jìn)行區(qū)別。
如果郵件對(duì)你管理進(jìn)程請(qǐng)求,bounce后臺(tái)程序可以生成一個(gè)郵件不可投遞的報(bào)告。
本地投遞代理local進(jìn)程可以理解類似UNIX風(fēng)格的郵箱,sendmail風(fēng)格的系統(tǒng)別名數(shù)據(jù)庫和sendmail風(fēng)格的.forward文件?梢酝瑫r(shí)運(yùn)行多個(gè)local進(jìn)程,但是對(duì)同一個(gè)用戶的并發(fā)投遞進(jìn)程數(shù)目是有限制的。你可以配置local將郵件投遞到用戶的宿主目錄,也可以配置local將郵件發(fā)送給一個(gè)外部命令,如流行的本地投遞代理procmail。在流行的linux發(fā)行版本RedHat中,我們就使用procmail作為最終的本地投遞代理。
遠(yuǎn)程投遞代理SMTP進(jìn)程根據(jù)收件人地址查詢一個(gè)SMTP服務(wù)器列表,按照順序連接每一個(gè)SMTP服務(wù)器,根據(jù)性能對(duì)該表進(jìn)行排序。在系統(tǒng)負(fù)載太大時(shí),可以有數(shù)個(gè)并發(fā)的SMTP進(jìn)程同時(shí)運(yùn)行。
pipe是用于UUCP協(xié)議的投遞代理。

三、 postfix的安裝過程
3.1源代碼包的安裝
1. 獲取postfix的源代碼包
   從postfix官方站點(diǎn)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.建立一個(gè)新用戶“postfix”,該用戶必須具有唯一的用戶id和組id號(hào),同時(shí)應(yīng)該讓該用戶不能登錄到系統(tǒng),也即不為該用戶指定可執(zhí)行的登錄外殼程序和可用的用戶宿主目錄。我們可以先用adduser postfix 添加用戶再編輯/etc/passwd文件中的相關(guān)條目如下所示:         
      postfix:*:12345:12345:postfix:/no/where:/no/shell
5.確定/etc/aliases文件中包含如下的條目:
      postfix: root
6. 以root用戶登錄,在/tmp/ postfix-19991231-pl08目錄下執(zhí)行命令:
./INSTALL.sh
7. 啟動(dòng)postfix
# postfix start
8.關(guān)于maildrop目錄權(quán)限的說明:
   postfix可以使用一個(gè)所有用戶都可寫的(也即目錄權(quán)限為1773)的maildrop
目錄來讓本地用戶提交郵件。這種方法避免了使用set-uid 或 set-gid 軟件,并且在郵件系統(tǒng)不可用時(shí),用戶仍然可以提交郵件。其他用戶沒有訪問該目錄中的隊(duì)列文件的權(quán)限。接收來自網(wǎng)絡(luò)的郵件時(shí)postfix不使用maildrop目錄。但是,由于該目錄的權(quán)限是733,其他用戶可以建立一個(gè)硬連接到該目錄中的文件從而導(dǎo)致該郵件被投遞多次或無法刪除,也就是說這將導(dǎo)致安全性問題。如果你想要使用這種方式來讓用戶提交郵件,就要在INSTALL.sh 腳本問你是否需要set-gid 時(shí)回答no。
如果你的系統(tǒng)有多個(gè)用戶的話,最好取消以上的方式而采用利用set-gid 用
戶權(quán)限提交郵件的方式。這時(shí),我們首先需要建立一個(gè)組id唯一的組"maildrop" 并且確定該組中沒有用戶成員。然后在INSTALL.sh 問你是否需要set-gid 時(shí)指定"maildrop"。
    提示:在安裝postfix之前,請(qǐng)刪除已經(jīng)安裝的sendmail。

3.2 rpm包的安裝
1. 獲取postfix的rpm軟件包。
   我們可以從http://www.alltrading.es/postfix/RPMS/i386/ 獲得postfix的rpm軟件包。當(dāng)前的最新版本是postfix-20000531-2.i386.rpm。
2. 備份你的/etc/aliases和/etc/aliases.db,因?yàn)閜ostfix要使用該別名數(shù)據(jù)庫。
3. 用以下命令查看系統(tǒng)是否安裝了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. 用以下命令強(qiáng)行卸載sendmail:
   [root@mail /root]# rpm -e sendmail sendmail-cf sendmail-doc --nodeps
5. 用以下命令殺死運(yùn)行中的sendmail進(jìn)程:
[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. 啟動(dòng)postfix
      [root@mail /root]# /etc/rc.d/init.d/postfix start

3.3 配置系統(tǒng)每次啟動(dòng)時(shí)自動(dòng)啟動(dòng)postfix
1.如果你安裝的是postfix的源代碼包,可以在/etc/rc.d/rc.local文件中加入如下的語句讓系統(tǒng)每次啟動(dòng)時(shí)自動(dòng)啟動(dòng)postfix:
if  [ -f  /usr/libexec/postfix ]; then
/usr/libexec/postfix start
fi
2.如果你安裝的是postfix的rpm包,可以通過setup命令來設(shè)置在系統(tǒng)啟動(dòng)時(shí)啟動(dòng)postfix。
四、 postfix的配置詳解
4.1 postfix的配置文件結(jié)構(gòu)
    postfix的配置文件位于/etc/postfix下,安裝完postfix以后,我們可以通過ls命令查看postfix的配置文件:
    [root@mail postfix]# ls
install.cf main.cf master.cf postfix-script

    這四個(gè)文件就是postfix最基本的配置文件,它們的區(qū)別在于:
    mail.cf:是postfix主要的配置文件。
    Install.cf:包含安裝過程中安裝程序產(chǎn)生的postfix初始化設(shè)置。
master.cf:是postfix的master進(jìn)程的配置文件,該文件中的每一行都是用來配置postfix的組件進(jìn)程的運(yùn)行方式。
postfix-script:包裝了一些postfix命令,以便我們?cè)趌inux環(huán)境中安全地執(zhí)行這些postfix命令。

4.2 postfix的基本配置
postfix大約有100個(gè)配置參數(shù),這些參數(shù)都可以通過main.cf 指定。配置的格式是這樣的,用等號(hào)連接參數(shù)和參數(shù)的值。如:
myhostname = mail.mydomain.com
等號(hào)的左邊是參數(shù)的名稱,等號(hào)的右邊是參數(shù)的值; 當(dāng)然,我們也可以在參數(shù)的前面加上$來引用該參數(shù),如:
myorigin = $myhostname
雖然postfix有100個(gè)左右的參數(shù),但是postfix為大多數(shù)的參數(shù)都設(shè)置了缺省值,所以在讓postfix正常為你服務(wù)之前,你只需要配置為數(shù)不多的幾個(gè)參數(shù)。下面我們一起來看一看這些基本的postfix參數(shù)。需要注意的是,一旦你更改了main.cf文件的內(nèi)容,則必須運(yùn)行postfix reload命令使其生效。

1. myorigin
myorigin參數(shù)指明發(fā)件人所在的域名。如果你的用戶的郵件地址為user@domain.com,則該參數(shù)指定@后面的域名。缺省地,postfix使用本地主機(jī)名作為myorigin,但是建議你最好使用你的域名,因?yàn)檫@樣更具有可讀性。比如:安裝postfix的主機(jī)為mail.domain.com則我們可以這樣指定myorigin:
myorigin = domain.com
當(dāng)然我們也可以引用其他參數(shù),如:
    myorigin = $mydomain
   
2. mydestination
mydestination參數(shù)指定postfix接收郵件時(shí)收件人的域名,換句話說,也就
是你的postfix系統(tǒng)要接收什么樣的郵件。比如:你的用戶的郵件地址為user@domain.com, 也就是你的域?yàn)閐omain.com, 則你就需要接收所有收件人為user_name@domain.com的郵件。與myorigin一樣,缺省地,postfix使用本地主機(jī)名作為mydestination。如:
      mydestination = $mydomain
      mydestination = domain.com
   
3. notify_classes
在postfix系統(tǒng)中,必須指定一個(gè)postfix系統(tǒng)管理員的別名指向一個(gè)用戶,
只有這樣,在用戶遇到問題時(shí)才有報(bào)告的對(duì)象,postfix也才能將系統(tǒng)的問題報(bào)告給管理員。notify_classes參數(shù)就是用來指定向postfix管理員報(bào)告錯(cuò)誤時(shí)的信息級(jí)別。共有以下幾種級(jí)別:

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

2bounce:將兩次不可投遞的郵件拷貝發(fā)送給postfix管理員。

delay:將郵件的投遞延遲信息發(fā)送給管理員,僅僅包含信頭。

policy:將由于UCE規(guī)則限制而被拒絕的用戶請(qǐng)求發(fā)送給postfix管理員,包含整個(gè)SMTP會(huì)話的內(nèi)容。

protocol:將協(xié)議的錯(cuò)誤信息或用戶企圖執(zhí)行不支持的命令的記錄發(fā)送給postfix管理員。同樣包含整個(gè)SMTP會(huì)話的內(nèi)容。

resource:將由于資源錯(cuò)誤而不可投遞的錯(cuò)誤信息發(fā)送給postfix管理員,比如:隊(duì)列文件寫錯(cuò)誤等等。

software:將由于軟件錯(cuò)誤而導(dǎo)致不可投遞的錯(cuò)誤信息發(fā)送給postfix管理員。

缺省值為:
notify_classes = resource, software

    4.myhostname
myhostname 參數(shù)指定運(yùn)行postfix郵件系統(tǒng)的主機(jī)的主機(jī)名。缺省地,該值被設(shè)定為本地機(jī)器名。你也可以指定該值,需要注意的是,要指定完整的主機(jī)名。如:
    myhostname = mail.domain.com

    5.mydomain
mydomain參數(shù)指定你的域名,缺省地,postfix將myhostname的第一部分刪除而作為mydomain的值。你也可以自己指定該值,如:
mydomain = domain.com

6.mynetworks
mynetworks 參數(shù)指定你所在的網(wǎng)絡(luò)的網(wǎng)絡(luò)地址,postfix系統(tǒng)根據(jù)其值來區(qū)別用戶是遠(yuǎn)程的還是本地的,如果是本地網(wǎng)絡(luò)用戶則允許其訪問。你可以用標(biāo)準(zhǔn)的A、B、C類網(wǎng)絡(luò)地址,也可以用CIDR(無類域間路由)地址來表示,如:
192.168.1.0/24
192.168.1.0/26

7.inet_interfaces
inet_interfaces 參數(shù)指定postfix系統(tǒng)監(jiān)聽的網(wǎng)絡(luò)接口。缺省地,postfix監(jiān)聽
所有的網(wǎng)絡(luò)接口。如果你的postfix運(yùn)行在一個(gè)虛擬的ip地址上,則必須指定其監(jiān)聽的地址。如:
   inet_interfaces = all
   inet_interface = 192.168.1.1

4.3 postfix的UCE(unsolicited commercial email)控制
所謂UCE控制就是指控制postfix接收或轉(zhuǎn)發(fā)來自于什么地方的郵件。

缺省地,postfix轉(zhuǎn)發(fā)符合以下條件的郵件:
* 來自客戶端ip地址符合$mynetworks的郵件。
* 來自客戶端主機(jī)名符合$relay_domains及其子域的郵件。
* 目的地為$relay_domains及其子域的郵件。

缺省地,postfix接受符合以下條件的郵件:
* 目的地為$inet_interfaces的郵件。
* 目的地為$mydestination的郵件。
* 目的地為$virtual_maps的郵件。
但是我們也可以通過下面的規(guī)則來實(shí)現(xiàn)更強(qiáng)大的控制功能。

1. 信頭過濾
通過header_checks參數(shù)限制接收郵件的信頭的格式,如果符合指定的格式,則拒絕接收該郵件?梢灾付ㄒ粋(gè)或多個(gè)查詢列表,如果新郵件的信頭符合列表中的某一項(xiàng)則拒絕該接收郵件。如:
header_checks = regexp:/etc/postfix/header_checks
header_checks = pcre:/etc/postfix/header_checks
缺省地,postfix不進(jìn)行信頭過濾。

2.客戶端主機(jī)名/地址限制
通過smtpd_client_restrictions參數(shù)限制可以向postfix發(fā)起SMTP 連接的客戶端的主機(jī)名或ip地址。可以指定一個(gè)或多個(gè)參數(shù)值,中間用逗號(hào)隔開。限制規(guī)則是按照查詢的順序進(jìn)行的,第一條符合條件的規(guī)則被執(zhí)行?捎玫囊(guī)則有:

reject_unknown_client:如果客戶端的ip地址在DNS中沒有PTR記錄則拒絕轉(zhuǎn)發(fā)該客戶端的連接請(qǐng)求。可以用unknown_client_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為450)。如果你有用戶沒有作DNS記錄則不要啟用該選項(xiàng)。

permit_mynetworks:如果客戶端的ip地址符合$mynetworks參數(shù)定義的范圍則接受該客戶端的連接請(qǐng)求,并轉(zhuǎn)發(fā)該郵件。

check_client_access  maptype:mapname:根據(jù)客戶端的主機(jī)名、父域名、ip地址或?qū)儆诘木W(wǎng)絡(luò)搜索access數(shù)據(jù)庫。如果搜索的結(jié)果為REJECT 或者 "[45]XX text" 則拒絕該客戶端的連接請(qǐng)求;如果搜索的結(jié)果為OK、RELAY 或數(shù)字則接受該客戶端的連接請(qǐng)求,并轉(zhuǎn)發(fā)該郵件。?梢杂胊ccess_map_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為554)。

reject_maps_rbl:如果客戶端的網(wǎng)絡(luò)地址符合$maps_rbl_domains參數(shù)的值則拒絕該客戶端的連接請(qǐng)求?梢杂胢aps_rbl_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為554)。

示例:
    smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl
        smtpd_client_restrictions = permit_mynetworks, reject_unknown_client
   該參數(shù)的缺省值為:
   smtpd_client_restrictions =
   也即接收來自任何客戶端的SMTP連接。

3. 是否請(qǐng)求HELO命令
可以通過smtpd_helo_required參數(shù)指定客戶端在SMTP會(huì)話的開始是否發(fā)
送一個(gè)HELO命令。你可以指定該參數(shù)的值為yes或no。缺省值為:
    smtpd_helo_required = no
   
4. HELO主機(jī)名限制
可以通過smtpd_helo_restrictions參數(shù)指定客戶端在執(zhí)行HELO命令時(shí)發(fā)送
給postfix的主機(jī)名。缺省地,postfix接收客戶端發(fā)送的任意形式的主機(jī)名?梢灾付ㄒ粋(gè)或多個(gè)參數(shù)值,中間用逗號(hào)隔開。限制規(guī)則是按照查詢的順序進(jìn)行的,第一條符合條件的規(guī)則被執(zhí)行?捎玫囊(guī)則有:
reject_invalid_hostname:如果HELO命令所帶的主機(jī)名參數(shù)不符合語法規(guī)范則拒絕客戶機(jī)的連接請(qǐng)求?梢杂胕nvalid_hostname_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為501)。

permit_naked_ip_address:RFC要求客戶端的HELO命令包含的ip地址放在方括號(hào)內(nèi),你可以用permit_naked_ip_address參數(shù)取消該限制。因?yàn)橛械膍ail客戶端不遵守該RFC的規(guī)定。

reject_unknown_hostname:如果客戶端執(zhí)行HELO命令時(shí)的主機(jī)名在DNS中沒有相應(yīng)的A 或 MX 記錄則拒絕該客戶端的連接請(qǐng)求?梢杂胕nvalid_hostname_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為450)。

reject_non_fqdn_hostname:如果客戶端執(zhí)行HELO命令時(shí)的主機(jī)名不是RFC規(guī)定的完整的域名則拒絕客戶端的連接請(qǐng)求?梢杂胕nvalid_hostname_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為504)。

check_helo_access  maptype:mapname:根據(jù)客戶端HELO的主機(jī)名、父域名搜索access數(shù)據(jù)庫。如果搜索的結(jié)果為REJECT 或者 "[45]XX text" 則拒絕該客戶端的連接請(qǐng)求;如果搜索的結(jié)果為OK、RELAY 或數(shù)字則接受該客戶端的連接請(qǐng)求?梢杂胊ccess_map_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為554)。

示例:
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname

5. RFC 821信頭限制
RFC 821對(duì)郵件的信頭做了嚴(yán)格的規(guī)定,但是廣泛使用的sendmail并不支
持該規(guī)定,所以對(duì)于該參數(shù)我們只能說不,即:
    strict_rfc821_envelopes = no

6. 通過發(fā)件人地址進(jìn)行限制
可以用smtpd_sender_restrictions參數(shù)通過發(fā)件人在執(zhí)行MAIL FROM命令時(shí)提供的地址進(jìn)行限制。可以指定一個(gè)或多個(gè)參數(shù)值,中間用逗號(hào)隔開。限制規(guī)則是按照查詢的順序進(jìn)行的,第一條符合條件的規(guī)則被執(zhí)行?捎玫囊(guī)則有:

reject_unknown_sender_domain:如果MAIL FROM命令提供的主機(jī)名在DNS中沒有相應(yīng)的A 或 MX 記錄則拒絕該客戶端的連接請(qǐng)求?梢杂胾nknown_address_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為450)。

check_sender_access maptype:mapname:根據(jù)MAIL FROM命令提供的主機(jī)名、父域搜索access數(shù)據(jù)庫。如果搜索的結(jié)果為REJECT 或者 "[45]XX text" 則拒絕該客戶端的連接請(qǐng)求;如果搜索的結(jié)果為OK、RELAY 或數(shù)字則接受該客戶端的連接請(qǐng)求?梢杂胊ccess_map_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為554)。可以通過該參數(shù)過濾來自某些不受歡迎的發(fā)件人的郵件。

reject_non_fqdn_sender:如果MAIL FROM命令提供的主機(jī)名不是RFC規(guī)定的完整的域名則拒絕客戶端的連接請(qǐng)求?梢杂胣on_fqdn_reject_code 參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為504)。
缺省地,postfix接受來自任何發(fā)件人的郵件。
示例:
smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain

7. 通過收件人地址進(jìn)行過濾
可以用smtpd_recipient_restrictions參數(shù)通過發(fā)件人在執(zhí)行RCPT TO命令
時(shí)提供的地址進(jìn)行限制。缺省值為:
smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains
   可以指定一個(gè)或多個(gè)參數(shù)值,中間用逗號(hào)隔開。限制規(guī)則是按照查詢的順序
進(jìn)行的,第一條符合條件的規(guī)則被執(zhí)行?捎玫囊(guī)則有:

check_relay_domains:如果符合以下的條件,則接受SMTP連接請(qǐng)求,否則拒絕該連接,可以用relay_domains_reject_code 參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為504)。
* 客戶端主機(jī)名符合$relay_domains及其子域
* 目的地為$inet_interfaces、$mydestination或$virtual_maps

permit_auth_destination:不管客戶端的主機(jī)名,只要符合以下的條件,就
接受SMTP連接請(qǐng)求:
* 解析后的目標(biāo)地址符合$relay_domains及其子域
* 解析后的目標(biāo)地址符合$inet_interfaces、$mydestination或$virtual_maps

reject_unauth_destination:不管客戶端的主機(jī)名,只要符合以下的條件,
就拒絕該客戶端SMTP連接請(qǐng)求:
* 解析后的目標(biāo)地址符合$relay_domains及其子域
* 解析后的目標(biāo)地址符合$inet_interfaces、$mydestination或$virtual_maps

check_recipient_access:根據(jù)解析后的目標(biāo)地址、父域搜索access數(shù)據(jù)庫。如果搜索的結(jié)果為REJECT 或者 "[45]XX text" 則拒絕該客戶端的連接請(qǐng)求;如果搜索的結(jié)果為OK、RELAY 或數(shù)字則接受該客戶端的連接請(qǐng)求?梢杂胊ccess_map_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為554)。
   
reject_unknown_recipient_domain:如果收件人的郵件地址在DNS中沒有相應(yīng)的A 或 MX 記錄則拒絕該客戶端的連接請(qǐng)求?梢杂胾nknown_address_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為450)。

reject_non_fqdn_recipient:如果發(fā)件人在執(zhí)行RCPT TO命令時(shí)提供的地址
不是完整的域名則拒絕其SMTP連接請(qǐng)求?梢杂肨he non_fqdn_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為504)。

4.4 posftfix的性能控制
之所以對(duì)postfix的性能進(jìn)行控制,是為了在遇到郵件風(fēng)暴時(shí)保證postfix可以正常運(yùn)行。通常,我們可以通過對(duì)下列postfix參數(shù)的配置來調(diào)節(jié)postfix的性能,這些參數(shù)都是通過mail.cf配置文件進(jìn)行配置的,修改以后不要忘了運(yùn)行postfix reload命令來使配置生效。

1. 進(jìn)程數(shù)限制
可以通過default_process_limit 參數(shù)來控制postfix系統(tǒng)同時(shí)可以運(yùn)行的最
大進(jìn)程數(shù)目。缺省值是50個(gè)。

2. 對(duì)同一目標(biāo)主機(jī)的并發(fā)連接限制
當(dāng)向同一目標(biāo)主機(jī)發(fā)出SMTP連接時(shí),postfix初始化發(fā)出兩個(gè)SMTP連接,
如果投遞成功則增加并發(fā)的SMTP連接數(shù)目,遇到擁塞時(shí)又減少并發(fā)連接的數(shù)目。postfix中通過以下的參數(shù)對(duì)同一目標(biāo)主機(jī)的并發(fā)連接進(jìn)行控制:
* initial_destination_concurrency:控制對(duì)同一目標(biāo)主機(jī)的初始化并發(fā)連接數(shù)目。缺省值為2。
* default_destination_concurrency_limit:控制初始化連接后對(duì)同一目標(biāo)主機(jī)的最大并發(fā)連接數(shù)目。缺省值為10。
* local_destination_concurrency_limit:控制對(duì)同一本地收件人的最大同時(shí)投遞的郵件數(shù)目。缺省值為2,因?yàn)閷?duì)本地同一收件人投遞郵件時(shí)投遞工作只能一個(gè)接一個(gè)的進(jìn)行,所以設(shè)得在大也沒用。

3. 對(duì)同一封郵件的收件人數(shù)目限制
通過default_destination_recipient_limit參數(shù)來控制postfix的投遞代理(如
smtp進(jìn)程)可以將同一封郵件發(fā)送給多少個(gè)收件人。缺省值為50。也可以用明確指出該投遞代理的參數(shù)來覆蓋該缺省值。如用smtpd_recipient_limit來指定smtp投遞代理可以將同一封郵件發(fā)送給多少個(gè)收件人,該參數(shù)的缺省值為1000。
   
4. 推遲投遞控制
通過defer_transports參數(shù),我們可以推遲投遞該參數(shù)指定的郵件直到postfix明確的提出投遞要求。下面我們看一個(gè)例子:
有一個(gè)小型的局域網(wǎng),用戶都將郵件發(fā)送給局域網(wǎng)內(nèi)部的一臺(tái)postfix
郵件服務(wù)器,然后通過在該服務(wù)器上撥號(hào)將郵件發(fā)送出去。這時(shí)我們可以這樣指定該參數(shù)的值:
   defer_transports = smtp
該語句表示postfix推遲投遞所有的郵件直到執(zhí)行sendmail -q命令,這樣
我們就可以在ppp的腳本中加上sendmail -q,以便在撥號(hào)成功后讓postfix開始投遞郵件。

郵件系統(tǒng)postfix安裝與配置(二)

http://LinuxAid.com.cn 01-01-12 11:26 318p bye2000
--------------------------------------------------------------------------------


5. 關(guān)于延遲郵件的再投遞控制
可以通過以下的幾個(gè)參數(shù)實(shí)現(xiàn)對(duì)延遲郵件的再投遞控制:
queue_run_delay:設(shè)置隊(duì)列管理進(jìn)行掃描deferred郵件隊(duì)列的頻率,缺省值為1000秒。
maximal_queue_lifetime:設(shè)置postfix在放棄投遞而返回不可投遞信息前,被延遲郵件再deferred郵件隊(duì)列中的生存時(shí)間。
minimal_backoff_time:當(dāng)一封郵件投遞失敗后,郵件隊(duì)列將在一段時(shí)間內(nèi)忽視該郵件的存在,也就是我們前面講的時(shí)間郵票。該參數(shù)就是用來設(shè)置最小的時(shí)間郵票。缺省值為1000秒。
maximal_backoff_time:設(shè)置最大的時(shí)間郵票。

6. 對(duì)拒絕服務(wù)攻擊的處理
postfix對(duì)每一個(gè)SMTP會(huì)話都設(shè)置一個(gè)錯(cuò)誤計(jì)數(shù)器,當(dāng)該客戶端的請(qǐng)求未
被接受或違反那UCE規(guī)則時(shí),該計(jì)數(shù)器就增1。隨著計(jì)數(shù)器的增加,postfix將采取不同的措施來防止惡意用戶的拒絕服務(wù)攻擊。
smtpd_error_sleep_time:當(dāng)該錯(cuò)誤計(jì)數(shù)器的值還很小時(shí),postfix將暫停
smtpd_error_sleep_time指定的時(shí)間,然后向客戶端報(bào)告一個(gè)錯(cuò)誤。該參數(shù)的缺省值為5秒。
    smtpd_soft_error_limit:當(dāng)錯(cuò)誤計(jì)數(shù)器的值超過該參數(shù)指定的值時(shí),postfix在響應(yīng)該客戶端請(qǐng)求前將沉睡一段時(shí)間。缺省值為10。
smtpd_hard_error_limit:當(dāng)錯(cuò)誤計(jì)數(shù)器的值超過該參數(shù)指定的值時(shí),postfix
中斷同該客戶端的連接。缺省值為100。

4.5 postfix對(duì)使用資源的控制
通過特定的postfix配置參數(shù),我們可以實(shí)現(xiàn)postfix運(yùn)行時(shí)對(duì)所消耗的資源的靈活控制?梢酝ㄟ^以下幾個(gè)方面來控制postfix消耗的資源:

1. 限制內(nèi)存中的對(duì)象的大小
要控制對(duì)內(nèi)存資源的消耗,必須控制內(nèi)存中對(duì)象的大小?梢杂靡韵碌膮(shù)來進(jìn)行對(duì)象大小的控制:
line_length_limit:控制讀入數(shù)據(jù)時(shí)每一行的大小,如果太長則強(qiáng)行將其分割成更短的行,太長的行在投遞時(shí)再重組。缺省值為2048 bytes。
header_size_limit:限制信頭長度。缺省值為102400bytes。
message_size_limit:限制postfix隊(duì)列文件的大小。缺省值為10240000 bytes。
queue_minfree:郵件隊(duì)列中可用的空間大小。缺省為無限制。建議該值最好時(shí)message_size_limit的數(shù)倍以便于處理大郵件。
bounce_size_limit:限制某一郵件不可投遞時(shí),返回給發(fā)件人不可投遞報(bào)告的大小,缺省值為50000 bytes。

2. 限制內(nèi)存中對(duì)象的數(shù)目
qmgr_message_recipient_limit:設(shè)置內(nèi)存中收件人地址的最大數(shù)目。缺省值為10000。
qmgr_message_active_limit:設(shè)置active郵件隊(duì)列中郵件數(shù)目的最大值。缺省值為1000。
duplicate_filter_limit:設(shè)置需要local和cleanup后臺(tái)程序記住的收件人地址的最大數(shù)目。缺省值為1000。

    3.限制等待一個(gè)外部命令完成的時(shí)間
command_time_limit:設(shè)置local程序等待一個(gè)外部命令完成的時(shí)間。缺省值為1000秒。

4. 限制文件鎖定的操作時(shí)間
   deliver_lock_attempts:設(shè)置鎖定一個(gè)文件的最大嘗試次數(shù)。缺省值為5次。
   deliver_lock_delay:設(shè)置如果鎖定一個(gè)文件失敗后再次嘗試的等待時(shí)間,缺省值為1秒。
   
5. 控制錯(cuò)誤恢復(fù)
在某些情況下(如高負(fù)載),postfix的某個(gè)進(jìn)程可能會(huì)死掉,這時(shí)master進(jìn)
程會(huì)試圖重新啟動(dòng)該進(jìn)程,我們可以通過下面的參數(shù)來控制這種行為:
fork_attempts:試圖重啟動(dòng)一個(gè)進(jìn)程的最大嘗試次數(shù)。缺省值為5次。
fork_delay:每兩次嘗試之間的等待時(shí)間,缺省值為1秒。
transport_retry_time:隊(duì)列管理進(jìn)程每兩次嘗試連接一個(gè)不正常的投遞代理進(jìn)程之間的等待時(shí)間。缺省為60秒。

4.6 postfix中的地址操作

1. 將地址改寫為標(biāo)準(zhǔn)格式
在cleanup進(jìn)程進(jìn)行表查詢之前,它首選請(qǐng)求trivial-rewrite進(jìn)程將新
郵件地址改寫成標(biāo)準(zhǔn)的user@fully.qualified.domain格式。改寫的目的是為了減少查詢表中的條目,從而提供查詢的效率。trivial-rewrite進(jìn)程可以實(shí)現(xiàn)以下的地址改寫:
* 將包含源路由信息的地址如@hosta,@hostb:user@site寫成user@site,因?yàn)閜ostfix不支持包含源路由信息的地址格式。
* 將形如user%domain的地址改寫成user@domain的形式。該特性可通過allow_percent_hack參數(shù)進(jìn)行控制,其缺省值為yes。
* 將只包含user的地址改寫成user@$myorigin。該特性可通過append_at_myorigin參數(shù)進(jìn)行控制,其缺省值為yes。最好不要改動(dòng)其缺省值,因?yàn)榇蠖鄶?shù)的postfix進(jìn)程更擅長處理地址形如user@$myorigin的郵件。
* 將形如user@host的地址改寫成user@host.$mydomain。該特性可通過append_dot_mydomain參數(shù)進(jìn)行控制,其缺省值為yes。
* 將形如user@site.的地址改寫成 user@site,也即除去了最后的點(diǎn)號(hào)。

2. 規(guī)范地址映射
在cleanup進(jìn)程將一封新郵件存入incoming郵件隊(duì)列之前,cleanup進(jìn)程
將根據(jù)查詢規(guī)范表來進(jìn)行地址改寫,從而使之更具可讀性。主要是替換形如Firstname.Lastname 風(fēng)格的地址以及清除無效的域。缺省postfix是不進(jìn)行規(guī)范地址改寫的,你可以通過指定canonical_maps參數(shù)的值來使其生效。如:
     canonical_maps = hash:/etc/postfix/canonical
     也可以分別為收件人和發(fā)件人地址分別指定不同的改寫規(guī)范,這時(shí)參數(shù)sender_canonical_maps和recipient_canonical_maps的優(yōu)先級(jí)比canonical_maps高。如:
     sender_canonical_maps = hash:/etc/postfix/sender_canonical
     recipient_canonical_maps = hash:/etc/postfix/recipient_canonical

3. 地址欺騙
就是將形如user@host.domain的地址改寫成user@domain或user@other.domain,
好像是從其他的郵件服務(wù)器發(fā)出的一樣。缺省該功能是被禁止的,可以用參數(shù)masquerade_domains使其生效,如:
    masquerade_domains = $mydomain
    也可以通過masquerade_exceptions參數(shù)對(duì)特定的用戶不進(jìn)行地址欺騙,如:
masquerade_exceptions = root
注意:地址欺騙只對(duì)發(fā)件人地址有作用。

4. 虛擬地址映射
在運(yùn)用了規(guī)范地址映射和地址欺騙之后,cleanup將使用虛擬表映射將郵件
重定向到所有的收件人。注意,該操作僅僅作用于信頭上的收件人地址。這樣,我們就可以將發(fā)送到虛擬域的郵件投遞到真實(shí)用戶的郵箱。系統(tǒng)的別名數(shù)據(jù)庫同樣可以起到相同的作用。缺省該功能是被禁止的,可以用參數(shù)virtual_maps使其生效,如:
     virtual_maps = hash:/etc/postfix/virtual
     
5. Relocated數(shù)據(jù)庫查詢
    Relocated表格提供如何將郵件發(fā)送給在系統(tǒng)中沒有帳號(hào)的用戶。缺省該功能是被禁止的,可以用參數(shù)relocated_maps使其生效,如:
    relocated_maps = hash:/etc/postfix/relocated
   
6. 別名數(shù)據(jù)庫查詢
當(dāng)郵件在本地投遞時(shí),local投遞代理進(jìn)程會(huì)在別名數(shù)據(jù)庫(linux下為
/etc/aliases)中查詢收件人的別名。該操作不會(huì)作用于郵件信頭中的地址?梢杂胊lias_maps指定使用的別名數(shù)據(jù)庫。缺省地,該功能是有效的,如:
    alias_maps = hash:/etc/aliases
可以通過alias_database參數(shù)控制別名數(shù)據(jù)庫的路徑,如:
alias_database = hash:/etc/aliases

五、 postfix的配置實(shí)例
5.1為撥號(hào)用戶配置postfix
假設(shè)有一個(gè)小公司使用撥號(hào)上網(wǎng),公司通過ISP的SMTP服務(wù)器(假設(shè)其域名為mail.isp.com,ip地址為201.110.1.100)發(fā)送郵件;公司內(nèi)部的員工通過公司的SMTP服務(wù)器(運(yùn)行postfix)收發(fā)郵件,下面我們一起來配置公司內(nèi)部的SMTP服務(wù)器。

1. 因?yàn)闆]有自己的固定ip和域名,所以必須指定ISP的SMTP服務(wù)器作
為郵件網(wǎng)關(guān)(智能主機(jī))?梢杂萌缦碌膮(shù)指定:
   relayhost = [201.110.1.100]
注意:relayhost的值可以是domain、host、host:port、[address]或[address]。

2. 當(dāng)接收到新郵件時(shí),postfix就會(huì)嘗試投遞該郵件。如果將該公司內(nèi)部的
SMTP服務(wù)器設(shè)置為按需撥號(hào),也就是一有程序請(qǐng)求外聯(lián)就撥號(hào),則會(huì)增加上網(wǎng)的費(fèi)用。這時(shí)我們可以通過postfix的defer_transports參數(shù)推遲投遞新郵件直到postfix提出明確的要求,如指定:
    defer_transports = smtp
這時(shí)如果我們?cè)趐pp的腳本(如/etc/ppp/ip-up.local)加上如下命令,則postfix只在撥號(hào)成功后投遞新郵件:
/usr/sbin/sendmail

3. 因?yàn)槲覀兪菍⑧]件轉(zhuǎn)發(fā)到郵件網(wǎng)關(guān)(201.110.1.100)而不是自己進(jìn)行投
遞,所以我們沒有必要使用DNS,因此我們通過如下的參數(shù)取消DNS查詢:
disable_dns_lookups = yes

4. 為了保證我們能收到回信,我們必須進(jìn)行域偽裝。
masquerade_domains = isp.com

下面就是我們的配置文件mail.cf:

#指定郵件網(wǎng)關(guān)
relayhost =  [201.110.1.100]
# 在撥號(hào)成功后才投遞郵件
defer_transports = smtp
#取消DNS查詢
disable_dns_lookups = yes
#一般常規(guī)配置
queue_directory = /var/spool/postfix
program_directory = /usr/libexec/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
default_privs = nobody
mail_spool_directory = /var/spool/mail
mailbox_command = /usr/bin/procmail
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10
debug_peer_level = 2
debugger_command=PATH=/usr/bin:/usr/X11R6/bin,xxgdb$
                 daemon_directory/$ process_name $process_id & sleep 5
    # 假設(shè)本地網(wǎng)絡(luò)為192.168.1.1/24
mynetworks = 192.168.1.1/24
# host specific information
myhostname = yourhost.isp.com
mydomain = local.isp.com
myorigin = $mydomain
where do we receive mail and who do we accept/receive mail for?
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, $mydomain
default_transport = smtp
masquerade_domains = isp.com

需要注意的是:這里的$mydomain、$myorigin、$mydestination不能為isp.com, 因?yàn)槟闳绻O(shè)定為isp.com,內(nèi)部SMTP服務(wù)器就會(huì)認(rèn)為你的郵件是轉(zhuǎn)發(fā)給它的,故而在本地嘗試投遞郵件,結(jié)果只會(huì)返回“unknown user”的錯(cuò)誤。其次,該配置只實(shí)現(xiàn)了將郵件通過SMTP發(fā)送到ISP的SMTP服務(wù)器的手段,缺乏從ISP的郵件服務(wù)器取信的方法,這一點(diǎn)就只能通過如outlook或foxmail等的mail客戶端軟件來實(shí)現(xiàn)了。

5.2為中小型企業(yè)用戶配置postfix
假設(shè)有一家數(shù)千名員工的公司,該公司通過租用專線上網(wǎng),F(xiàn)在公司決定
通過postfix來建立自己的郵件系統(tǒng)。在這里我們假設(shè)該公司的域?yàn)閟ome.com, 郵件服務(wù)器的域名mail.some.com,地址為202.200.180.2,DNS服務(wù)器的域名為dns.some.com,地址為202.200.180.1。
1. 配置DNS服務(wù)器,設(shè)置MX記錄指向mail.some.com。相關(guān)的配置文件
為/var/named/some.com(假設(shè)其zone文件就叫some.com, 有關(guān)DNS配置的內(nèi)容請(qǐng)參看本書的相關(guān)章節(jié))的內(nèi)容如下:

@       IN      SOA  dns.some.com. root.dns.some.com (
                       2000011307  ; serial
                       28800       ; refresh, seconds
                       14400              ; retry, seconds
                       3600000              ; expire, seconds
                       86400            ; minimum, seconds
                        )

@             IN    NS      dns.some.com.
@             IN    A       202.200.180.1
@             IN    MX      10  mail.some.com.

localhost     IN    A        127.0.0.1
dns         IN     A        202.200.180.1
mail         IN    A        202.200.180.2
host1        IN     A       202.200.180.3
host2        IN     A       202.200.180.4

2. 配置postfix,其配置文件及相關(guān)的解釋如下:

#設(shè)置一般的路徑信息
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_spool_directory = /var/spool/mail

#設(shè)置郵件及郵件隊(duì)列的所有者為postfix
mail_owner = postfix

#設(shè)置郵件服務(wù)器的主機(jī)名
myhostname = mail.some.com

#設(shè)置mydomain、myorigin和mydomain參數(shù)
mydomain = some.com
myorigin =$mydomain
mydestination = $mydomain

#設(shè)置postfix服務(wù)監(jiān)聽的端口
inet_interfaces = all

#設(shè)置本地收件人的用戶名查詢手段,缺省是查詢/etc/passwd文件
#和別名數(shù)據(jù)庫
local_recipient_maps = $alias_maps unix:passwd.byname
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

#設(shè)置最終的本地投遞代理程序,在這里我們使用流行的procmail
mailbox_command = /usr/bin/procmail

#設(shè)置該值為$mydomain以便客戶端的連接
relay_domains = $mydomain
mynetworks = 202.200.180.0/24

#設(shè)置向用戶顯示的主機(jī)名和版本信息
smtpd_banner = $myhostname ESMTP $mail_name

#對(duì)于并發(fā)進(jìn)程的限制,保持系統(tǒng)缺省值就可以滿足要求了。
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10

#如果你不知道你在做什么,最好不要改變下面的設(shè)置
debug_peer_level = 2
debugger_command =
         PATH=/usr/bin:/usr/X11R6/bin
         xxgdb $daemon_directory/$process_name $process_id & sleep 5

3. 在RedHat中我們通常使用imap作為pop3服務(wù)器,可以通過rpm -q imap
命令查看系統(tǒng)有沒有安裝imap。如果沒有安裝則插入linux光盤,用rpm -ivh imap-4.5-4.rpm 進(jìn)行安裝。

4. 缺省地,pop3服務(wù)器是由inet 啟動(dòng)的,所以必須去掉/etc/inetd.conf文
件中有關(guān)pop3的一行注釋。如下所示:
  pop-3  stream  tcp    nowait  root   /usr/sbin/ipop3d    ipop3d

5. 重新啟動(dòng)inet服務(wù)器,啟動(dòng)postfix:
#/etc/rc.d/init.d/inet restart
#postfix start

5.3在防火墻內(nèi)部配置postfix
    假設(shè)一公司通過租用專線上網(wǎng),公司內(nèi)部使用192.168.0.0的私有ip, 然后通過防火墻(雙宿主主機(jī))的ip欺騙上網(wǎng),公司的郵件服務(wù)器(mail.some.com)也在內(nèi)部網(wǎng)中,也使用私有ip。我們假設(shè)在防火墻上進(jìn)行了端口轉(zhuǎn)發(fā),可以將Internet對(duì)防火墻25端口的請(qǐng)求包轉(zhuǎn)發(fā)到內(nèi)部的郵件服務(wù)器上,并且運(yùn)行DNS服務(wù)的防火墻的MX記錄指向防火墻本身。
在這個(gè)例子中,我想著重說明的是有關(guān)映射文件的用法。main.cf配置文件和相關(guān)的解釋如下所示:


    #表明自己的身份
myhostname = mail.some.com
mydomain = some.com
mydestination = $mydomain, $myhostname, localhost.$mydomain
myorigin = $mydomain
#讓postfix監(jiān)聽所有接口
inet_interfaces = all

#通過mynetworks參數(shù)接受內(nèi)部網(wǎng)用戶的SMTP連接請(qǐng)求
mynetworks = 192.168.0.0/8  

#向postfix管理員報(bào)告的信息量
notify_classes = resource, software, bounce, policy

#如果客戶端的ip地址符合$maps_rbl_domains參數(shù)中列出的則拒絕之
maps_rbl_domains = rbl.maps.vix.com, dul.maps.vix.com

#對(duì)可以連接的客戶端進(jìn)行嚴(yán)格的限制
smtpd_client_restrictions =
             #客戶端ip符合$mynetworks定義的范圍則接受連接
permit_mynetworks,
        #根據(jù)access的查詢結(jié)果判斷客戶端連接的合法性
              check_client_access hash:/etc/postfix/access,
     #拒絕ip符合$maps_rbl_domains定義范圍的連接
               reject_maps_rbl,
    #如果客戶端在DNS中沒有記錄則拒絕連接,要慎用
               reject_unknown_hostname

#通過發(fā)件人的地址進(jìn)行限制
smtpd_sender_restrictions =
    permit_mynetworks,
check_sender_access hash:/etc/postfix/access
   
#設(shè)置虛擬主機(jī)數(shù)據(jù)庫,別忘了執(zhí)行"postmap virtual"進(jìn)行格式轉(zhuǎn)換
virtual_maps = hash:/etc/postfix/virtual
   
#對(duì)無系統(tǒng)帳號(hào)的郵件進(jìn)行轉(zhuǎn)發(fā)設(shè)置,如離開公司的員工
relocated_maps = hash:/etc/postfix/relocated
   
#設(shè)置別名數(shù)據(jù)庫
alias_maps = hash:/etc/postfix/aliases
   
# 我們使用smtp投遞代理
default_transport = smtp
   
# 一些常規(guī)設(shè)置
mail_owner = postfix
default_privs = nobody

#設(shè)置路徑信息
queue_directory = /var/spool/postfix
program_directory = /usr/libexec/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_spool_directory = /var/spool/mail
mailbox_command = /usr/bin/procmail
   
#并發(fā)連接設(shè)置
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10

然后,我們執(zhí)行以下命令:

#進(jìn)入postfix配置目錄
cd /etc/postfix
#用newaliases初始化別名數(shù)據(jù)庫
newaliases
#用postmap分別建立virtual、access和relocated查詢數(shù)據(jù)庫
postmap virtual
postmap access
postmap relocated
#啟動(dòng)postfix
/etc/rc.d/init.d/postfix start

現(xiàn)在我們來看看virtual、access和reloacted幾個(gè)查詢文件的格式,下面是這幾個(gè)文件的示例和注釋:

    #virtual文件示例
#假設(shè)在這個(gè)例子中我們有個(gè)虛擬域?yàn)閛ther.com
other.com
     
    #access 文件示例
#如果符合前面的條件則進(jìn)行后面操作,可以有三種操作:
#1. [45]XX $messag:拒絕接受并且向客戶端顯示預(yù)定義的信息
#2. REJECT:拒絕接受,不顯示信息
#3. OK允許連接
    ispy99@noman.com.cn     550 Go away
    friend.com     OK
    202.192     REJECT
   
    #relocated 文件示例
    #該文件主要是將發(fā)給無系統(tǒng)帳號(hào)的郵件進(jìn)行轉(zhuǎn)發(fā)
    who@some.com     onetwo@newone.com
六、 postfix中的命令行工具及其它
下面我們來看一看postfix的命令行工具,通過這些工具的使用可能會(huì)使你
對(duì)postfix的管理更簡(jiǎn)單。

6.1 sendmail兼容的命令行工具

1. mailq  對(duì)郵件隊(duì)列文件進(jìn)行列表。表中的每一個(gè)條目包含有以下信息:
隊(duì)列文件ID、郵件的大小、到達(dá)的時(shí)間、發(fā)件人、收件人和投遞延遲的原因(如果投遞有延遲的話)。該命令主要是與showq后臺(tái)程序通信來獲取隊(duì)列文件的相關(guān)信息。該命令無參數(shù)。

2. newaliases 該工具進(jìn)行別名數(shù)據(jù)庫的初始化。如果沒有指定數(shù)據(jù)庫的類
型,則使用系統(tǒng)默認(rèn)的數(shù)據(jù)庫類型(在linux下為hash)。該命令可以不帶參數(shù)執(zhí)行。

6.2 postfix自帶的命令行工具

1. postcat  打印郵件隊(duì)列文件的內(nèi)容。后面界要顯示的隊(duì)列文件名,可以
帶一個(gè)-v的參數(shù)進(jìn)行冗余顯示。

2. postconf  打印配置參數(shù)設(shè)置后的值或postfix的其他信息。
             -d 打印配置參數(shù)的缺省值。
             -m 列出所有支持的查詢表類型。
                不帶參數(shù)則打印配置參數(shù)設(shè)置后的值。

3. postmap  建立postfix查詢數(shù)據(jù)庫。在linux下可以直接跟上原始文件
而不帶任何參數(shù)來建立該數(shù)據(jù)庫。

6.3 postfix的日志
     postfix的日志文件位于/etc/log/maillog, 文件中包含有postfix的啟動(dòng)信息、出錯(cuò)信息以及同其他SMTP服務(wù)器的會(huì)話等等。如下所示:

Sep 10 05:54:17 mail postfix/smtpd[5072]: disconnect from unknown[204.140.244.150]
Sep 10 06:06:00 mail postfix/qmgr[467]: 50D403DF8: from=<bye2000@yxtc.edu.cn>;, size=6591 (queue active)
Sep 10 06:11:06 mail postfix/smtp[5085]: connect to bjmx2.163.net[202.108.255.241]: read timeout (port 25)
Sep 10 06:16:07 mail postfix/smtp[5085]: connect to bjmx3.163.net[202.108.255.242]: read timeout (port 25)
Sep 10 06:21:08 mail postfix/smtp[5085]: connect to bjmx1.163.net[202.108.255.240]: read timeout (port 25)

6.4 在postfix中使用MySQL數(shù)據(jù)庫
     Scott Cotton 和 Joshua Marcus寫了一段可以在postfix中添加mysql映射類型的代碼,從而我們可以將postfix查詢的別名數(shù)據(jù)庫等數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫中,讓postfix進(jìn)行mysql查詢來得到結(jié)果。這樣做將有助于提供postfix的運(yùn)行效率, 有其對(duì)需要不斷對(duì)映射數(shù)據(jù)的站點(diǎn)特別有用。

   1.為postfix添加識(shí)別mysql數(shù)據(jù)庫映射的功能
a. 由于這段代碼使用了mysql客戶端庫,所以我們必須安裝mysql的開包。
可以到www.redhat.com等linux相關(guān)站點(diǎn)下載mysql開發(fā)包,也可以從某些linux的資源光盤中取得mysql的開發(fā)包,如MySQL-client-3.22.30-1.i386.rpm。
   b. 安裝該開發(fā)包:
   rpm -ivh MySQL-client-3.22.30-1.i386.rpm
c. 下載postfix的源代碼包,根據(jù)本章“3.1源代碼包的安裝”的提示進(jìn)行
安裝,但是注意在執(zhí)行make命令之前先執(zhí)行以下命令:
make -f Makefile.init makefiles 'CCARGS=-DHAS_MYSQL -I /usr/include/mysql'
                          'AUXLIBS=/usr/lib/mysql/libmysqlclient.a -lm'
   
5. 配置postfix使用mysql數(shù)據(jù)庫映射
我們以alias_maps進(jìn)行說明。在main.cf中指定:
   alias_maps = mysql:/etc/postfix/mysql-aliases.cf

6. 編輯mysql-aliases.cf

#首先指定登錄到mysql服務(wù)器的用戶名和密碼
user = your_user_name
password = your_password

#連接的數(shù)據(jù)庫名稱
dbname = your_database_name

#查詢的表名
table = mytable

#添加表的字段名稱
#forward_addr為轉(zhuǎn)發(fā)地址
#alias為別名數(shù)據(jù)
select_field=forward_addr
where_field=alias
#添加附加的查詢條件
additional_conditions=and status='paid'

#指定要連接的MySQL服務(wù)器
hosts=your.mysql.server

   這樣,當(dāng)發(fā)生一個(gè)查詢的時(shí)候,postfix是以這樣的SQL語句進(jìn)行查詢的:
   select forward_addr from mytable where alias='$lookup' and status='paid'

   以上只是一個(gè)例子。在實(shí)際的運(yùn)用中您可以指定多個(gè)mysql數(shù)據(jù)庫,使用多個(gè)數(shù)據(jù)表格。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2003-09-14 15:53 |只看該作者

郵件系統(tǒng)postfix安裝與配置(zt)

好帖子

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2003-10-22 22:54 |只看該作者

郵件系統(tǒng)postfix安裝與配置(zt)

我支持你,繼續(xù)發(fā)好帖

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2006-04-05 00:15 |只看該作者
對(duì)樓主的感激猶如滔滔江水.連綿不絕

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2006-06-04 16:33 |只看該作者

請(qǐng)教這是什么題

Jun  4 16:33:36 hyk postfix/smtpd[30329]: SQL engine 'mysql ' not supported

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2007-08-20 16:41 |只看該作者
好貼,看了頂一下。。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2007-11-04 23:20 |只看該作者
太強(qiáng)了。明天接著看。。。。

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2008-04-14 14:03 |只看該作者
正好今天自己做實(shí)驗(yàn),拿去參考一下,謝謝共享!

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2008-05-19 11:02 |只看該作者
hao  li hai

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2008-06-05 13:11 |只看該作者
you我的學(xué)習(xí)榜樣呀
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP