postfix郵件服務系統原理及配置

                                                                                                          POSTFIX工作原理及相關概念


Postfix內部收信、發信流程圖

sx.pngfx.png

   整個處理流程分爲三個階段:接收郵件、將郵件排入隊列、遞送郵件。每個階段由一組獨立的Postfix組件負責。當一封郵件被收下並排入隊列之後,隊列管理器(Queue Manager)會啓動適當的MDA,將郵件送到終點。



郵件如何進入Postfix系統

   郵件有四種渠道可以進入Postfix系統:
  1、Postfix可接受來自本機系統的郵件(本機用戶或自主進程提交的郵件)。
  2、Postfix可接受網絡傳入的郵件(來自MUA或者其他MTA)。
  3、已經被Postfix收下並交給MDA的郵件,被MDA傳回到Postfix(通常是爲了轉寄到另一個地址)。
  4、當Postfix無法將郵件寄到目的地時,自己會產生退信通知函。
  郵件有可能在進入Postfix之前就被拒絕了,或者因爲暫時性的故障(網絡斷線、遠程服務器響應暫時性的錯誤等),同樣的郵件可能會每隔一段時間就重複進入Postfix系統一次,重新遞送。


   1)來自服務器本機的郵件

       各個Postfix組件之間的合作全靠隊列(Queue)交換郵件、Postfix系統有多個隊列,這些隊列全部隊列管理器(Queue Manager)負責控制管理。Postfix組件可將郵件交付給Queue Manager,由其代爲放入適當的隊列。當需要處理特定工作時,Queue Manager將隊列裏的郵件交付給正確的組件。
  在Unix系統上,當用戶要寄出郵件時(不管這封信是寄到哪裏),通常是使用sendmail包內的sendmail命令。Postfix提供了一個與此命令兼容的同名工具,也稱爲sendmail。當用戶以Postfix的sendmail寄出郵件後,sendmail(postfix的版本)會使用postdrop程序將郵件存入Postfix隊列目錄下的maildrop/子目錄。專門注意maildrop子目錄有無變化的是Pickup Daemon,每當有新的郵件進入maildrop時,Pickup Daemon便會讀出新郵件,然後交給cleanup daemon進入“清理程序”。
  當郵件剛進入Postfix時,不一定含有構成有效郵件的所有必要字段,而且標頭裏的地址也可能需要被改寫成標準格式(
[email protected]),並依據規範的或虛擬的查詢表(如果有的話)將原本的地址改成其他地址。所謂“清理程序”就是補足遺漏的標頭字段,這部分工作由cleanup daemon負責;地址的處理由Trivial-Rewrite Daemon負責。
  經過Cleanup Daemon處理好的郵件,會被傳入收件隊列(Incoming Queue)。Queue Manager會不斷的注意收件隊列的變化,每當有新郵件進入收件隊列時,便會用適當的MDA將郵件送到下一站,或直接送到最終目的地。
   2)來自網絡的郵件
       來自網絡的郵件由Postfix Smtpd Daemon接收進來,然後交給Cleanup Daemon運行清理程序,隨後排入收件隊列,由Queue Manager選擇適當的MDA將郵件送到下一站或最終目的地。Smtpd有可能收到兩種郵件,第一種是外界寄給Postfix所控制的網域的郵件(Postfix系統本身是郵件的終點站或網關),另一種是要寄到其他網域的郵件。
  Smtpd一定會收下第一種郵件(如果收件人存在的話),至於第二種郵件(目的地在其他網域),就要看傳郵件過來的客戶端是否有資格。網絡收下要寄到其他網域的郵件,並代爲寄送到目的地的動作稱爲轉發(relay)。在兩種情況下,Postfix願意提供轉發服務:一是客戶端符合配置文件限定的資格,二是收信網域是relay_domain參數所列出的網域之一。


   3)通知函

       當用戶的郵件被延時時,或是根本無法遞送到目的地時,Postfix使用Defer或Bounce Daemon產生一封新的通知函。這封通知函會被交給Cleanup Daemon,由它進行例行的清理程序之後再排入收件隊列,由Queue Manager接手處理。
   4)轉寄郵件
       有時候,郵件在委託給MDA之後,MDA會發現該郵件其實應該寄送到另一個系統的另一個賬戶。比如說,當MDA在用戶個人的forward文件發現了另一個地址時,就會發現這種情況。照理說,MDA可以直接使用Smtp Client(即Smtp Daemon)送出郵件。不過,由於同一封信可能有多位收件人,爲了照顧到每一位收件人,同時也爲了在郵件日誌上留下完整記錄,MDA應該依提交新郵件的方式,讓郵件重新回到Postfix系統,由Postfix按照“來自本機的郵件”的程序來處理。
   Postfix的隊列管理器
郵件本身的處理工作主要是由隊列管理器(Queue Manager)負責,每一個能收到郵件的Postfix組件,都有一個共同的目的地--隊列管理器。郵件進入隊列之前的關卡是Cleanup Daemon,因爲只有經過清理的郵件,纔有資格進入隊列。Cleanup將郵件排入隊列後,會通知Queue Manager去處理新郵件。每當Queue Manager察覺收信隊列有新信到達時,就會使用Trivial-Rewrite來決定郵件路由信息,這些信息包括傳輸方法、下一站以及收件人地址。
  Queue Manager總共維護四種隊列:收件(Incoming)、活動(Active)、延遲(Deferred)、故障(Corrupt)。新郵件通過Cleanup之後的第一站是“收件隊列”。假設系統資源空閒。Queue Manager會將郵件移入“活動隊列”,然後調用適當的MDA來投遞郵件,而投遞失敗的郵件則會被移入“耽擱隊列”。
  如果郵件被耽擱太久,或是被判定無法送達,則Queue Manager還要負責協調Bounce與Defer Daemons來產生一份遞送狀態報告,並傳回給系統管理員或送信者(或兩者)。在Postfix的隊列目錄下(默認位置是/var/spool/postfix/),除了上述四種郵件隊列目錄之外,還有bounce/與defer/目錄。這些目錄含有狀態信息,解釋特定郵件爲何被耽擱或無法遞送,Bounce與Defer Daemon就是利用這些目錄下的狀態信息來產生通知函。


   投遞操作

       Postfix依據收件地址的類型,來判斷是否要收下郵件以及如何進行投遞操作。主要的地址類型有本地(Local)、虛擬別名(Virtual Alias)、虛擬郵件(Virtual Mailbox)以及轉發(Relay)。如果收件地址不在這四種主要類型之中,則郵件會被交給Smtp Client,通過網絡寄送出去(假設原信是來自有資格使用轉發服務的客戶端);否則,Queue Manager便依據地址的類型,選擇適當的MDA來投遞郵件。

   本地郵件
  如果收件人爲Postfix本地系統的用戶(在運行Postfix的那臺服務器上有Shell賬戶的用戶),則他們的郵件會被交給Local MDA處理,凡是收件地址的網域名稱與mydestination參數列出的任一網域名稱相符,這類郵件都算是本地郵件,對於送到任何mydestination網域的任何有效賬戶的郵件,Local MDA會先檢查收件人是否有個人的.forward文件,如果沒有,則郵件會被存入用戶的個人郵箱;否則,則依據.forward文件的內容來進行投遞操作(或轉寄到其他地方,或是交給外部程序處理)。
  對於需要轉寄到他處的郵件,將會被重新提交會Postfix,以便傳送到新地址。如果傳送過程發生了暫時性問題,MDA會通知Queue Manager,而郵件會被保存在延遲隊列等待下次的遞送機會;如果發生永久性問題,則要求Queue Manager將信息退給發信者。

   虛擬別名郵件
  寄給虛擬別名地址的郵件,全部都需要轉寄(Forward)到其真實地址,虛擬別名的網域名稱列在virtual_alias_domains參數中,每一個虛擬網域都可以有自己的一組用戶,不同的虛擬網域可以容許有同名的用戶。用戶與其真實地址之間對應關係,列在virtual_alias_maps參數所指定的查詢表中。當Queue Manager發現郵件的收件地址的網域部分virtual_alias_domains所列出的網域之一,則會重新提交郵件,以便傳到真實地址。


   虛擬郵箱郵件

  虛擬郵箱的網域名稱列在virtual_mailbox_domains參數中。每一個網域都可以有自己的用戶羣,而且有各自獨立的命名空間,換言之,即不同的虛擬郵箱網域可以有同名的用戶。用戶與郵箱之間的對應關係,定義在virtual_mailbox_maps參數所指定的查詢表中,虛擬郵箱與系統上的Shell賬戶之間沒有關聯性,虛擬郵箱郵件的投遞操作由Virtual MDA負責運行。

   轉發郵件
  實際郵箱位於其他MTA控制管理的網域,但是Postfix願意代收並轉寄的郵件,稱爲轉發郵件。這類網域的名稱列在relay_domains參數中,其郵件由smtp MDA通過網絡送到目標網域的MTA。當你假設郵件網關係統時,便可利用轉發功能收下Internet寄到內部網域的郵件,並轉寄到內部網絡的郵件系統上。


   其他郵件

  如果郵件的收件地址不屬於前述四類,則一律交給Smtp以遞送到正確地點,因爲這類郵件必定是要送到系統本身之外的其他網域。先前在“來自網絡的郵件”曾說過,並非所有客戶端都有資格使用轉發服務。一般而言,我們會將轉發服務開放給與Postfix Server位於相同局域網絡的其他主機,好讓這些主機可通過Postfix Server寄信到Internet上的外界網域。
  當Smtp MDA收到外地郵件時,它會依據收件地址來判斷郵件應該送到哪個(或哪些)主機,然後依序連接到這些主機,直到有一部主機願意收下郵件爲止。如果投遞過程發生暫時性問題,Smtp會通知Queue Manager將郵件放在延遲隊列,等待下次傳送的機會;如果發生永久性錯誤,則要求Queue Manager退信給發信者。
  當因暫時故障而不能連接的遠程主機恢復連接時,Postfix會先採取試探性動作,以免過多的延遲郵件使對方癱瘓。一開始,Smtp只會搭建有限度的幾條連接通道(數量可通過配置文件調整)到收件方,在發現對方能夠成功收下郵件之後,纔會慢慢提升連接通道的數量(到一個可設定的上限);相反的,如果Smtp發現接送方有任何麻煩,它會立刻撤銷連接。

   其他傳送代理程序
  Postfix還提供了其他MDA,可用來處理特殊的地址或目的地。這些MDA需要在master.cf配置文件中設定妥當之後纔有作用。此外,你還必須在class_transport或transport_maps參數指定的傳送表(transport table)中設定如何啓動它們。最常用的兩個特殊MDA是LMTP與PIPE。

   LMTP投遞
  LMTP是一種很類似SMTP的協議,但只能用於同一網絡上的郵件系統之間,或是同一主機上的不同郵件程序之間。舉例來說,如果需要將郵件送到不同的軟件包–該軟件可能與Postfix在同一臺機器上,也可能位於局域網絡上的另一臺主機,則Queue Manager可以調用LMTP MDA將郵件傳送給該軟件包。
  實際上,LMTP最常被用來將郵件交給特殊的POP/IMAP Server,以便使用特殊郵箱格式來存儲郵件。在這種情況下,由於只要POP/IMAP SERVER知道特殊郵件格式,所以只好使用標準的LMTP來交付郵件。如果LMTP投遞過程中出了任何問題,LMTP MDA會通知Queue Manager將郵件放在延遲隊列,等待下次傳送的機會。
   PIPE投遞
  Postfix提供了Pipe Daemon將郵件傳送給外部程序。實際上,Pipe經常被用來將郵件傳給外部的內容過濾程序(例如:病毒掃描系統、垃圾郵件分析程序)或其他通信媒介(例如:傳真機)。同樣,如Pipe無法順利傳出郵件,它會通知Queue Manager將郵件放在延遲隊列,等待下次傳送的機會。
  實際追蹤POSTFIX的郵件處理流程
  讓我們追蹤一封典型郵件如何通過POSTFIX系統。處理流程是一封郵件從發信方到達目的地(信封地址所指的MTA),然後又被轉寄到最終的MTA(收件人實際取信處)。
  例如:HELENE的賬戶位於一臺運行POSTFIX的服務器,她使用自己習慣的MUA編寫郵件,然後調用POSTFIX的sendmail命令送出郵件。POSTFIX的sendmail程序從HELENE的MUA軟件中取下郵件,然後放在隊列的MAILDROP/子目錄下。
接着,Pickup Daemon從該目錄取出郵件,交給CLEANUP DAEMON運行必要的清理程序,如果HELENE的MUA軟件沒提供地址from:,或是該地址沒使用完整的主機名稱,則Cleanup會自動補齊不足的信息以確保郵件格式符合標準。完成清理程序之後,Cleanup將郵件存入收件隊列,並通知Queue Manager,使其知道有一封新信正在等待投遞。
  如果Queue Manager已經準備好處理新郵件,它會將郵件搬移到活動隊列。由於HELENE的信是要送到其他網域系統的用戶,所以Queue Manager使用SMTP MDA來投遞該郵件。SMTP使用DNS查出哪些郵件服務器願意收下目的地網域的郵件,然後從中挑出最優先的郵件交換主機(MX HOST)並與該主機接洽,以SMTP協議送出HELENE寫的郵件。
  當目的網域的服務器上的MTA SMTPD收下HELENE的SMTP MDA送來的郵件。當smtpd確認它應該收下該郵件之後,它會將郵件交給Cleanup Daemon進行檢查,然後存入收件隊列。
  Queue Manager將郵件搬移到活動隊列,檢查收件人地址,然後使用LOCAL MDA來進行投遞操作。接着,LOCAL發現收件地址其實是一個別名,其真實地址位於另一個網域,所以將郵件與新地址信息傳給CLEANUP DAEMON,回到POSTFIX的隊列系統。
  當CLEANUP與Queue Manager處理郵件時,依靠TRIVIAL-REWRITE將地址轉換成標準格式,並判斷傳送方式以及遞送流程到下一站。
  當Queue Manager發現新郵件應該送到另一個網絡,則會調用SMTP來進行投遞操作,而SMTP會先向DNS查出哪些郵件服務器可能接收該網域的郵件。該網域的MTA收下這封郵件後,最後會將郵件交給LOCAL MDA,由它將郵件存入該系統的郵箱。
  到這個時候,Postfix就完成了它的工作。這時收件人現可以用他自己的MUA來閱讀郵件,至於這個MUA是直接從郵箱取信,還是使用POP或IMAP之類的協議通過網絡下載郵件,都已經不是Postfix所能控制的了。
  我們的例子只假設了最理想的簡單狀態,實際的傳送程序可能會遇到一些意外狀況,諸如網絡臨時斷線、遠程主機死機、郵箱空間不足。發生意外時,MDA必須通知Queue Manager,將郵件暫時放回延遲隊列,等待一段時間之後再重新投遞。
  除了臨時意外回影響投遞過程,還有一些情況也會影響,比方說,收件人並非實際的系統賬戶,而是IMAP郵件系統的一個賬戶,在這種情況下,Queue Mananger可能要通過LMTP MDA來投遞郵件,或是通過PIPE MDA將郵件送到一個事先確定的外部程序。
  Postfix還要面對各式各樣的變化與潛在的複雜性,幸運的,它本身的結構設計足夠穩定,幾乎能夠應付所有可想像到的情況,也有足夠的可塑性來適應未來的可能變化。


   隊列種類

  收件:Incoming 活動:Active 延遲:Deferred 故障:Corrupt 保留:Hold

   組件結構
  Master組件:主導郵件處理流程、其他組件的總管。配置文件:main.cf和master.cf。
  Qmgr組件:隊列管理器。各個postfix組件之間的合作依靠隊列交換郵件。
  Sendmail組件:服務器本機發送郵件。
  Postdrop組件:將郵件存入postfix隊列目錄下的maildrop/子目錄。
  Pickup組件:監視maildrop/子目錄,讀出新郵件,交給cleanup組件。
  Cleanup組件:補足遺漏的標頭字段。
  Trivial-Rewrite組件:地址處理,改成標準格式。決定路由信息,包括傳輸方法、下一站以及收件人地址。
  Smtpd組件:接收來自網絡的郵件,交給cleanup組件處理。
  Defer組件:郵件被延時時產生通知函。
  Bounce組件:郵件無法送達目的地時產生通知函。
  Dns組件:查找符合條件的郵件服務器。

   Postfix命令行工具
  postalias:創建或查詢別名數據庫。
  postcat:顯示出隊列文件的內容,讓管理員可觀察滯留在隊列裏的郵件內容。
  postconf:顯示或改變postfix參數,可一次顯示一個參數,或是顯示所有參數。
  postdrop:將郵件放回到maildrop目錄,由postfix重新進行投遞操作。
  postfix:啓動或停止postfix系統,或重新讀取配置文件。也可以用於其他維護工作,包括檢查系統配置,以及清空隊列。
  postkick:對特定postfix服務發出請求。此工具的作用,主要是給shell scripts提供一個能夠與postfix溝通服務的管道。
  postlock:鎖定特定文件,確保能夠獨佔訪問。此工具的作用,主要是讓shell scripts能使用兼容於postfix的鎖定方式。
  postlog:將特定的信息記錄到系統日誌文件中。這是支持shell scripts工具,使其能以類似於postfix的樣式來記錄信息到日誌文件。
  postmap:創建查詢表的DB數據庫或查詢查詢表內容。postfix有許多配置信息都是記錄在postmap所建的查詢表數據庫中。
  postqueue:讓一般的用戶能夠有限度地訪問postfix隊列。可能改變隊列的訪問方式需要有管理員特權才能進行,而這方面的訪問能力由postsuper命令提供。
  postsuper:供管理員訪問postfix隊列。管理員可刪除郵件、扣留郵件(搬到hold隊列)、取回郵件(將郵件從hold隊列搬回active隊列),必要時,還可以修復隊列目錄結構。


                                                                                                        POSTFIX   配置過程

一、安裝前的準備工作
    安裝前說明:郵件服務依賴於DNS服務,請事先確信您的DNS服務已經爲郵件應用配置完成。
    1、安裝所需的rpm包,這包括以下這些:
         httpd, mysql, mysql-server, mysql-devel, openssl-devel, dovecot, perl-DBD-MySQL, tcl, tcl-devel, libart_lgpl, libart_lgpl-devel, libtool-ltdl, libtool-ltdl-devel, expect
    2、關閉sendmail,並將它的隨系統自動啓動功能關閉:
         # service sendmail stop
         # chkconfig sendmail off
    3、安裝以下開發所用到的rpm包組:
         Development Libraries
         Development Tools
二、編譯安裝postfix
    # groupadd -g 2525 postfix
    # useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
    # groupadd -g 2526 postdrop
    # useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop
    # tar zxvf postfix-2.10.3.tar.gz
    # cd postfix-2.10.3
    # make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl  -DUSE_TLS ' 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2  -lssl -lcrypto'

   此處如果你是源碼安裝或是二進制包安裝,注意你的mysql庫文件和頭文件位置
    # make && make install

   

   進行一些基本配置,測試啓動postfix並進行發信
     # vim /etc/postfix/main.cf
    修改以下幾項爲您需要的配置
     myhostname = mail.neo.com
     myorigin = neo.com
     mydomain = neo.com
     mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
     mynetworks = 192.168.100.0/24, 127.0.0.0/8

    注:參數說明
     myorigin參數用來指明發件人所在的域名,即做發件地址僞裝;
     mydestination參數指定postfix接收郵件時收件人的域名,即您的postfix系統要接收到哪個域名的郵件;
     myhostname 參數指定運行postfix郵件系統的主機的主機名,默認情況下,其值被設定爲本地機器名;
     mydomain 參數指定您的域名,默認情況下,postfix將myhostname的第一部分刪除而作爲mydomain的值;
     mynetworks 參數指定你所在的網絡的網絡地址,postfix系統根據其值來區別用戶是遠程的還是本地的,如果是本地網絡用戶則允許其訪問;
     inet_interfaces 參數指定postfix系統監聽的網絡接口;


   配置postfix啓動服務腳本

###############################################################START#################################

#!/bin/bash
# postfix      Postfix Mail Transfer Agent    
# chkconfig: 2345 80 30
# description: Postfix is a Mail Transport Agent, which is the program \
#              that moves mail from one machine to another.
# processname: master
# pidfile: /var/spool/postfix/pid/master.pid
# config: /etc/postfix/main.cf
# config: /etc/postfix/master.cf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ $NETWORKING = "no" ] && exit 3
[ -x /usr/sbin/postfix ] || exit 4
[ -d /etc/postfix ] || exit 5
[ -d /var/spool/postfix ] || exit 6
RETVAL=0
prog="postfix"
start() {
# Start daemons.
echo -n $"Starting postfix: "
       /usr/bin/newaliases >/dev/null 2>&1
/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
       echo
return $RETVAL
}
stop() {
 # Stop daemons.
echo -n $"Shutting down postfix: "
/usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure $"$prog stop"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
echo
return $RETVAL
}
reload() {
echo -n $"Reloading postfix: "
/usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure $"$prog reload"
RETVAL=$?
echo
return $RETVAL
}
abort() {
/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"
return $?
}
flush() {
/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"
return $?
}
check() {
/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"
return $?
}
restart() {
stop
start
}
# See how we were called.
case "$1" in
 start)
start
;;
 stop)
stop
;;
 restart)
stop
start
;;
 reload)
reload
;;
 abort)
abort
;;
 flush)
flush
;;
 check)
check
;;
 status)
  status master
;;
 condrestart)
[ -f /var/lock/subsys/postfix ] && restart || :
;;
 *)
echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
exit 1
esac
exit $?
#####################################################################END####################

   爲此腳本賦予執行權限:
       # chmod +x /etc/rc.d/init.d/postfix
   將postfix服務添加至服務列表:
       # chkconfig --add postfix
   設置其開機自動啓動:
       # chkconfig postfix on
   使用此腳本重新啓動服務,以測試其能否正常執行:
       # service postfix restart
   此時可使用本地用戶測試郵件收發了。

#####################################################測試開始####################################
[root@mail ~]# telnet mail.neo.com 25
Trying 192.168.100.5...
Connected to mail.neo.com (192.168.100.5).
Escape character is '^]'.
220 mail.neo.com ESMTP Postfix
ehlo mail.neo.com
250-mail.neo.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:[email protected]
250 2.1.0 Ok
rcpt to:tom
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
hello,I am [email protected]
are you OK?
.
250 2.0.0 Ok: queued as 9041F29802C
quit
221 2.0.0 Bye
Connection closed by foreign host.
[root@mail ~]# tail /var/log/maillog
Mar  1 10:11:47 mail postfix/qmgr[10162]: 9041F29802C: from=<[email protected]>, size=323, nrcpt=1 (queue active)
Mar  1 10:11:47 mail postfix/local[10195]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Mar  1 10:11:47 mail postfix/local[10195]: 9041F29802C: to=<[email protected]>, orig_to=<tom>, relay=local, delay=92, delays=92/0.01/0/0.05, dsn=2.0.0, status=sent (delivered to mailbox)
[root@mail ~]# su - tom
[tom@mail ~]$ mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/tom": 1 message 1 new
>N  1 [email protected]           Sat Mar  1 10:11  14/430  
Message 1:
From [email protected]  Sat Mar  1 10:11:47 2014
X-Original-To: tom
Delivered-To: [email protected]
Date: Sat,  1 Mar 2014 10:10:15 +0800 (CST)
From: [email protected]

hello,I am [email protected]
are you OK?


##########################################測試完成###############################################



   爲postfix服務開啓用戶別名支持:
   1、在配置文件開啓基於hash的別名文件支持
       在main.cf中,找到如下指令,而後啓用它(即移除前面的#號):
       #alias_maps = hash:/etc/aliases
   2、在/etc/aliases文件中定義新的別名項,其格式通常爲以冒號隔開的兩個字段,前一字段爲別名用戶,後一字段爲實際用戶
       redhat: neo
   3、將/etc/aliases轉換爲hash格式:
       # postalias  /etc/aliases
   4、讓postfix重新載入配置文件,即可進行測試;

   實現postfix基於客戶端的訪問控制
    1、基於客戶端的訪問控制概覽
         postfix內置了多種反垃圾郵件的機制,其中就包括“客戶端”發送郵件限制。客戶端判別機制可以設定一系列客戶信息的判別條件:
         smtpd_client_restrictions
         smtpd_data_restrictions
         smtpd_helo_restrictions
         smtpd_recipient_restrictions
         smtpd_sender_restrictions
        上面的每一項參數分別用於檢查SMTP會話過程中的特定階段,即客戶端提供相應信息的階段,如當客戶端發起連接請求時,postfix就可以根據配置文件中定義的smtpd_client_restrictions參數來判別此客戶端IP的訪問權限。相應地,smtpd_helo_restrictions則用於根據用戶的helo信息判別客戶端的訪問能力等等。
        如果DATA命令之前的所有內容都被接受,客戶端接着就可以開始傳送郵件內容了。郵件內容通常由兩部分組成,前半部分是標題(header),其可以由header_check過濾,後半部分是郵件正文(body),其可以由check_body過濾。這兩項實現的是郵件“內容檢查”。
        postfix的默認配置如下:
         smtpd_client_restrictions =
         smtpd_data_restrictions =
         smtpd_end_of_data_restrictions =
         smtpd_etrn_restrictions =
         smtpd_helo_restrictions =
         smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
         smtpd_sender_restrictions =
        這限制了只有mynetworks參數中定義的本地網絡中的客戶端才能通過postfix轉發郵件,其它客戶端則不被允許,從而關閉了開放式中繼(open relay)的功能。
        Postfix有多個內置的限制條件,如上面的permit_mynetworks和reject_unauth_destination,但管理員也可以使用訪問表(access map)來自定義限制條件。自定義訪問表的條件通常使用check_client_access, check_helo_access, check_sender_access, check_recipient_access進行,它們後面通常跟上type:mapname格式的訪問表類型和名稱。其中,check_sender_access和check_recipient_access用來檢查客戶端提供的郵件地址,因此,其訪問表中可以使用完整的郵件地址,如[email protected];也可以只使用域名,如neo.com;還可以只有用戶名的部分,如jun@。


實驗1
   禁止192.168.100.3這臺主機通過工作在192.168.100.5上的postfix服務發送郵件爲例演示說明其實現過程。訪問表使用hash的格式。
       (1)首先,編輯/etc/postfix/access文件,以之做爲客戶端檢查的控制文件,在裏面定義如下一行:
           192.168.100.3  REJECT
       (2)將此文件轉換爲hash格式
           # postmap /etc/postfix/access
       (3)配置postfix使用此文件對客戶端進行檢查
           編輯/etc/postfix/main.cf文件,添加如下參數:
           smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
       (4)讓postfix重新載入配置文件即可進行發信控制的效果測試了。


實驗2
   禁止通過本服務器向baidu.com域發送郵件爲例演示其實現過程。訪問表使用hash的格式。
       (1)首先,建立/etc/postfix/deny文件(文件名任取),在裏面定義如下一行:
           baidu.com  REJECT
       (2)將此文件轉換爲hash格式
           # postmap /etc/postfix/deny
       (3)配置postfix使用此文件對客戶端進行檢查
           編輯/etc/postfix/main.cf文件,添加如下參數:
           smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/deny, permit_mynetworks, reject_unauth_destination
       (4)讓postfix重新載入配置文件即可進行發信控制的效果測試了。

   爲postfix開啓基於cyrus-sasl的認證功能
    查看postfix是否支持cyrus的sasl認證
    #postconf -a
     cyrus
     dovecot
   #vim /etc/postfix/main.cf
   添加以下內容:
############################cyrus-SASL###################################################

broken_sasl_auth_clients = yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_path = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!

########################################################################################


   # vim /usr/lib/sasl2/smtpd.conf
       添加如下內容:
       pwcheck_method: saslauthd
       mech_list: PLAIN LOGIN
   讓postfix重新加載配置文件
       #/usr/sbin/postfix reload
   [root@mail ~]# telnet mail.neo.com 25
Trying 192.168.100.5...
Connected to mail.neo.com (192.168.100.5).
Escape character is '^]'.
220 Welcome to our mail.neo.com ESMTP,Warning: Version not Available!
ehlo mail.neo.com
250-mail.neo.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN
250-AUTH=LOGIN

250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

確保與我們剛開始測試postfix是否能工作,多出了兩行,這樣證名己成功了


   安裝Courier authentication library
       1、courier簡介
       courier-authlib是Courier組件中的認證庫,它是courier組件中一個獨立的子項目,用於爲Courier的其它組件提供認證服務。其認證功能通常包括驗正登錄時的帳號和密碼、獲取一個帳號相關的家目錄或郵件目錄等信息、改變帳號的密碼等。而其認證的實現方式也包括基於PAM通過/etc/passwd和/etc/shadow進行認證,基於GDBM或DB進行認證,基於LDAP/MySQL/PostgreSQL進行認證等。因此,courier-authlib也常用來與courier之外的其它郵件組件(如postfix)整合爲其提供認證服務。
       # tar jxvf courier-authlib-0.64.0.tar.bz2
       # cd courier-authlib-0.64.0
       #./configure \
   --prefix=/usr/local/courier-authlib \
   --sysconfdir=/etc \
   --without-authpam \
   --without-authshadow \
   --without-authvchkpw \
   --without-authpgsql \
   --with-authmysql \
   --with-mysql-libs=/usr/lib/mysql \
   --with-mysql-includes=/usr/include/mysql \
   --with-redhat \
   --with-authmysqlrc=/etc/authmysqlrc \
   --with-authdaemonrc=/etc/authdaemonrc \
   --with-mailuser=postfix \
   --with-mailgroup=postfix \
   --with-ltdl-lib=/usr/lib \
   --with-ltdl-include=/usr/include
   # make &&make install
   # chmod 755 /usr/local/courier-authlib/var/spool/authdaemon/  
   # cp /etc/authmysqlrc.dist /etc/authmysqlrc
   # cp /etc/authdaemonrc.dist /etc/authdaemonrc
   修改/etc/authdaemonrc 文件
       authmodulelist="authmysql"
       authmodulelistorig="authmysql"
       daemons=10
   配置其通過mysql進行郵件帳號認證
    編輯/etc/authmysqlrc 爲以下內容,其中2525,2525 爲postfix 用戶的UID和GID。
 MYSQL_SERVER localhost
 MYSQL_PORT 3306                   (指定你的mysql監聽的端口,這裏使用默認的3306)
 MYSQL_USERNAME  extmail      (這時爲後文要用的數據庫的所有者的用戶名)
 MYSQL_PASSWORD extmail        (密碼)
 MYSQL_SOCKET  /var/lib/mysql/mysql.sock
 MYSQL_DATABASE  extmail
 MYSQL_USER_TABLE  mailbox
 MYSQL_CRYPT_PWFIELD  password
 MYSQL_UID_FIELD  '2525'
 MYSQL_GID_FIELD  '2525'
 MYSQL_LOGIN_FIELD  username
 MYSQL_HOME_FIELD  concat('/var/mailbox/',homedir)
 MYSQL_NAME_FIELD  name
 MYSQL_MAILDIR_FIELD  concat('/var/mailbox/',maildir)

   提供SysV服務腳本

    # cp courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib
    # chmod 755 /etc/init.d/courier-authlib
    # chkconfig --add courier-authlib
    # chkconfig --level 2345 courier-authlib on

    # echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf.d/courier-authlib.conf
    # ldconfig -v
    # service courier-authlib start   (啓動服務)

   配置postfix和courier-authlib

        新建虛擬用戶郵箱所在的目錄,並將其權限賦予postfix用戶:
        #mkdir –pv /var/mailbox
        #chown –R postfix /var/mailbox

   接下來重新配置SMTP 認證,
    編輯 /usr/lib/sasl2/smtpd.conf ,確保其爲以下內容:
    pwcheck_method: authdaemond
    log_level: 3
    mech_list:PLAIN LOGIN
    authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket


   讓postfix支持虛擬域和虛擬用戶

    1、編輯/etc/postfix/main.cf,添加如下內容:
########################Virtual Mailbox Settings#####################################################
virtual_mailbox_base = /var/mailbox
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_domains =
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_uid_maps = static:2525
virtual_gid_maps = static:2525
virtual_transport = virtual
maildrop_destination_recipient_limit = 1
maildrop_destination_concurrency_limit = 1
##########################QUOTA Settings##########################################################
message_size_limit = 14336000
virtual_mailbox_limit = 20971520
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please Tidy your mailbox and try again later.
virtual_overquota_bounce = yes

##############################################################################################

   此處配置完後最好執行一次postconf -n檢查是否有選項無效,如果有,註釋或刪除都行

    2、使用extman源碼目錄下docs目錄中的extmail.sql和init.sql建立數據庫:

        # tar zxvf  extman-1.1.tar.gz
        # cd extman-1.1/docs
        # mysql -u root -p < extmail.sql
        # mysql -u root -p <init.sql
        # cp mysql*  /etc/postfix/

    3、授予用戶extmail訪問extmail數據庫的權限
        mysql> GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';
        mysql> GRANT all privileges on extmail.* TO [email protected] IDENTIFIED BY 'extmail';

    說明:
         1、啓用虛擬域以後,需要取消中心域,即註釋掉myhostname, mydestination, mydomain, myorigin幾個指令;當然,你也可以把mydestionation的值改爲你自己需要的。
         2、對於MySQL-5.1以後版本,其中的服務腳本extmail.sql執行會有語法錯誤;可先使用如下命令修改extmail.sql配置文件,而後再執行。修改方法如下:
             # sed -i 's@TYPE=MyISAM@ENGINE=InnoDB@g' extmail.sql


     1   配置dovecot

    # vi /etc/dovecot.conf

##############################################################################################
     mail_location = maildir:/var/mailbox/%d/%n/Maildir
  ……
 auth default {
    mechanisms = plain
    passdb sql {
         args = /etc/dovecot-mysql.conf
    }
    userdb sql {
         args = /etc/dovecot-mysql.conf
    }
    ……

############################################################################################

# vim /etc/dovecot-mysql.conf    

############################################################################################      
driver = mysql
connect = host=localhost dbname=extmail user=extmail password=extmail
default_pass_scheme = CRYPT
password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, uidnumber AS uid, gidnumber AS gid FROM mailbox WHERE username = '%u'

###########################################################################################

    說明:如果mysql服務器是本地主機,即host=localhost時,如果mysql.sock文件不是默認的/var/lib/mysql/mysql.sock,可以使用host=“sock文件的路徑”來指定新位置;例如,使用通用二進制格式安裝的MySQL,其soc文件位置爲/tmp/mysql.sock,相應地,connect應按如下方式定義。
    connect = host=/tmp/mysql.sock dbname=extmail user=extmail password=extmail

   接下來啓動dovecot服務:

        # service dovecot start
        # chkconfig dovecot on


    2  安裝Extmail-1.2

        說明:如果extmail的放置路徑做了修改,那麼配置文件webmail.cf中的/var/www路徑必須修改爲你所需要的位置。本文使用了默認的/var/www,所以,以下示例中並沒有包含路徑修改的相關內容。

    1、安裝
         # tar zxvf extmail-1.2.tar.gz
         # mkdir -pv /var/www/extsuite
         # mv extmail-1.2 /var/www/extsuite/extmail
         # cp /var/www/extsuite/extmail/webmail.cf.default  /var/www/extsuite/extmail/webmail.cf

    2、修改主配置文件
         #vi /var/www/extsuite/extmail/webmail.cf

    部分修改選項的說明:

############################################################################################

SYS_MESSAGE_SIZE_LIMIT = 5242880
用戶可以發送的最大郵件
SYS_USER_LANG = en_US
語言選項,可改作:
SYS_USER_LANG = zh_CN

SYS_MAILDIR_BASE = /home/domains
此處即爲您在前文所設置的用戶郵件的存放目錄,可改作:
SYS_MAILDIR_BASE = /var/mailbox

SYS_MYSQL_USER = db_user
SYS_MYSQL_PASS = db_pass
以上兩句句用來設置連接數據庫服務器所使用用戶名、密碼和郵件服務器用到的數據庫,這裏修改爲:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail

SYS_MYSQL_HOST = localhost
指明數據庫服務器主機名,這裏默認即可

SYS_MYSQL_TABLE = mailbox
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password

以上用來指定驗正用戶登錄裏所用到的表,以及用戶名、域名和用戶密碼分別對應的表中列的名稱;這裏默認即可

SYS_AUTHLIB_SOCKET = /var/spool/authdaemon/socket
此句用來指明authdaemo socket文件的位置,這裏修改爲:
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket

########################################################################################
    3   apache相關配置

     由於extmail要進行本地郵件的投遞操作,故必須將運行apache服務器用戶的身份修改爲您的郵件投遞代理的用戶;本例中打開了apache服務器的suexec功能,故使用以下方法來實現虛擬主機運行身份的指定。此例中的MDA爲postfix自帶,因此將指定爲postfix用戶:
<VirtualHost *:80>
ServerName mail.neo.com
DocumentRoot /var/www/extsuite/extmail/html/
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
SuexecUserGroup postfix postfix
</VirtualHost>

 修改 cgi執行文件屬主爲apache運行身份用戶:
 # chown -R postfix.postfix /var/www/extsuite/extmail/cgi/

 如果您沒有打開apache服務器的suexec功能,也可以使用以下方法解決:
 # vim /etc/httpd/httpd.conf
 User postfix
 Group postfix

<VirtualHost *:80>
ServerName mail.neo.com
DocumentRoot /var/www/extsuite/extmail/html/
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
</VirtualHost>


    4   依賴關係的解決

 extmail將會用到perl的Unix::syslogd功能,您可以去http://search.cpan.org搜索下載原碼包進行安裝。
 # tar zxvf Unix-Syslog-0.100.tar.gz
 # cd Unix-Syslog-0.100
 # perl Makefile.PL
 # make && make install

5、啓動apache服務
 # service httpd start
 # chkconfig httpd on


   5  安裝Extman-1.1

1、安裝及基本配置

 # tar zxvf  extman-1.1.tar.gz
 # mv extman-1.1 /var/www/extsuite/extman

 修改配置文件以符合本例的需要:
 # cp /var/www/extsuite/extman/webman.cf.default  /var/www/extsuite/extman/webman.cf
 # vi /var/www/extsuite/extman/webman.cf

############################################################################################

 SYS_MAILDIR_BASE = /home/domains
 此處即爲您在前文所設置的用戶郵件的存放目錄,可改作:
 SYS_MAILDIR_BASE = /var/mailbox

 SYS_DEFAULT_UID = 1000
 SYS_DEFAULT_GID = 1000
 此兩處後面設定的ID號需更改爲前而創建的postfix用戶和postfix組的id號,本文使用的是2525,因此,上述兩項需要修改爲:
 SYS_DEFAULT_UID = 2525
 SYS_DEFAULT_GID = 2525

 SYS_MYSQL_USER = webman
 SYS_MYSQL_PASS = webman
 修改爲:
 SYS_MYSQL_USER = extmail
 SYS_MYSQL_PASS = extmail

##############################################################################################

 而後修改cgi目錄的屬主:
 # chown -R postfix.postfix /var/www/extsuite/extman/cgi/

 在apache的主配置文件中Extmail的虛擬主機部分,添加如下兩行:
 ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
 Alias /extman /var/www/extsuite/extman/html

 創建其運行時所需的臨時目錄,並修改其相應的權限:
 #mkdir  -pv  /tmp/extman
 #chown postfix.postfix  /tmp/extman

 修改
  SYS_CAPTCHA_ON = 1
 爲
  SYS_CAPTCHA_ON = 0

 好了,到此爲止,重新啓動apache服務器後,您的Webmail和Extman已經可以使用了,可以在瀏覽器中輸入指定的虛擬主機的名稱進行訪問,如下:
   http://mail.neo.com

 選擇管理即可登入extman進行後臺管理了。默認管理帳號爲:[email protected]  密碼爲:extmail*123*

 說明:
  (1) 如果您安裝後無法正常顯示校驗碼,安裝perl-GD模塊會解決這個問題。如果想簡單,您可以到以下地址下載適合您的平臺的rpm包,安裝即可:  http://dries.ulyssis.org/rpm/packages/perl-GD/info.html
  (2) extman-1.1自帶了圖形化顯示日誌的功能;此功能需要rrdtool的支持,您需要安裝此些模塊纔可能正常顯示圖形日誌。


    6   配置Mailgraph_ext,使用Extman的圖形日誌:(下面所需的軟件包面要自己下載)

 接下來安裝圖形日誌的運行所需要的軟件包Time::HiRes、File::Tail和rrdtool,其中前兩個包您可以去http://search.cpan.org搜索並下載獲得,後一個包您可以到 http://oss.oetiker.ch/rrdtool/pub/?M=D下載獲得; 注意安裝順序不能改換。

 安裝Time::HiRes
  #tar zxvf Time-HiRes-1.9707.tar.gz
  #cd Time-HiRes-1.9707
  #perl Makefile.PL
  #make
  #make test &&make install

 7  安裝File::Tail
  #tar zxvf File-Tail-0.99.3.tar.gz
  #cd File-Tail-0.99.3
  #perl Makefile
  #make &&make install

8   安裝rrdtool-1.2.23
  #tar zxvf rrdtool-1.2.23.tar.gz
  #cd rrdtool-1.2.23
  #./configure --prefix=/usr/local/rrdtool
  #make &&make install

 創建必要的符號鏈接(Extman會到這些路徑下找相關的庫文件)
  #ln -sv /usr/local/rrdtool/lib/perl/5.8.5/i386-linux-thread-multi/auto/RRDs/RRDs.so   /usr/lib/perl5/5.8.5/i386-linux-thread-multi/
  #ln -sv /usr/local/rrdtool/lib/perl/5.8.5/RRDp.pm   /usr/lib/perl5/5.8.5
  #ln -sv /usr/local/rrdtool/lib/perl/5.8.5/i386-linux-thread-multi/RRDs.pm   /usr/lib/perl5/5.8.5

 複製mailgraph_ext到/usr/local,並啓動之
  # cp -r /var/www/extsuite/extman/addon/mailgraph_ext  /usr/local  
  # /usr/local/mailgraph_ext/mailgraph-init start

 啓動cmdserver(在後臺顯示系統信息)
  # /var/www/extsuite/extman/daemon/cmdserver --daemon

 添加到自動啓動隊列
  # echo “/usr/local/mailgraph_ext/mailgraph-init start” >> /etc/rc.d/rc.local
  # echo “/var/www/extsuite/extman/daemon/cmdserver -v -d” >> /etc/rc.d/rc.local



-------------------------------本文爲學習筆記,經本人親試,完美成功-------------------------------------------











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章