伺服器架設篇 - RedHat 9

第二十一章、簡易 Mail Server 架設 -- Postfix 設定

郵件主機之簡易設定、使用 Postfix 郵件伺服器之設定

最近更新時間: 2004/04/07

本文資料主要針對 RedHat 9 的系統進行說明,要注意的是,RedHat 9 與 Red Hat Enterprise Linux (RHEL) 是完全不同的東西!RedHat 9 在 2003 年推出,在 2004 年就不再維護了!這部份網站更新到 2005 年,也沒有再維護過! 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 RedHat 9 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
在介紹完了 sendmail 之後,您是否覺得~唉!怎麼 sendmail.cf 這個設定檔這麼難搞定~還得藉由 m4 scripts 才能搞定!而且, sendmail 需要考慮到相當多的安全設定項目 ( Security ),否則很容易一不小心就被攻擊了!那麼有沒有更簡單、更安全的郵件系統啊!當然有啊!那就是 Postfix 這個咚咚!Postfix 的作者有鑑於 sendmail 是這樣成功的一個 MTA ,但是偏偏有點小問題,所以該作者站在兼容的立場上面寫出這個幾乎可以完全取代 sendmail 的 MTA !此外, Postfix 還更加的安全呢,真是很不錯的一個 mail server 的替代方案啊!

前言:

在開始介紹 Postfix 這個伺服器之前,得先告訴您的是,這個 Postfix 的用途是『郵件伺服器』,那麼我們在前一章『Sendmail 伺服器』裡面已經提過了 mail server 的相關原理與運作過程,這個 Postfix 與 sendmail 是類似的東西,那就是『MTA』啦,既然都是 MTA ,使用的協定也相同,同時,這個 Postfix 最早之前的用途也是想要用來『取代 sendmail 』。所以,為了節省筆墨,也為了未來進行修改的時候不要有太多的版本 ( 意思是這裡 copy 一份 mail 原理,那裡又有一份原稿~ ) ,因此上,在進行本章的學習之前,請『務必』前往『簡易 Mail server -- sendmail』讀一讀 Mail server 的原理與相關的說明啊!
 

本章學習之前你需要先知道的知識
 
上面剛剛提到,學習本章你必須要知道 Mail Server 的相關知識才行,在這裡,我們不再說明已經提過的咚咚,請自行再前往翻閱。由於架設某種伺服器的第一步就是要瞭解該伺服器的工作原理,因此,在架設 Postfix 之前,您至少要知道以下的幾個咚咚:
  1. Mail Server 能否運作與 DNS ( MX 與 A recode )的相關性為何?
  2. 什麼是 MTA, MUA, MDA 與 Mail box, Mailing list 等相關的術語,及其內容所代表的意義!
  3. 什麼是 smtp, pop3 以及 imap 協定,他們的用途分別是什麼?
  4. 什麼是 Relay 與 Open Relay ?
  5. 什麼是 SMTP 郵件認證?
  6. 什麼是郵件的別名與轉遞( aliases 與 forward )?
  7. 什麼是 Procmail 與什麼是 ORDB 呢?
如果您不曉得上面問題的答案,請不要『白目』的繼續往下看 ^_^,先前往『簡易的 sendmail 伺服器』瞧一瞧相關的原理之後,再來這裡吧!慢點學習不打緊,學的不精....可能會有害啊! @_@
  

為什麼要有 Postfix 呢?
 
這是個很有趣的問題:『為什麼要有 Postfix 呢?有了 sendmail 不就可以了嗎?!』說到這個就要談到 postfix 的由來了!
 
Postfix 是由 Wietse Zweitze Venema 先生(http://www.porcupine.org/wietse/)所發展的。早期的 mail server 都是使用 sendmail 架設的,還真的是『僅此一家,絕無分號!』 ^_^ !不過,Venema 博士覺得 sendmail 雖然很好用,但是畢竟不夠安全,尤其效能上面並不十分的理想,最大的困擾是....他的設定檔 sendmail.cf 真的是太難懂了!對於網管人員來說,要設定好 sendmail.cf 這個檔案,真不是人作的工作~
 
為了改善這些問題, Venema 博士就在 1998 年利用他老大在 IBM 公司第一個休假年進行一個計畫:『設計一個可以取代 sendmail 的軟體套件,可以提供網站管理員一個更快速、更安全、而且"完全相容"於 sendmail 的 mail server 軟體!』這個計畫還真的成功了!而且也成功的使用在 IBM 內部,可以說是完全取代了 sendmail 這個郵件伺服器!在這個計畫成功之後, Venema 博士也在 1998 年首次釋出這個自行發展的郵件伺服器,並定名為 VMailer。不過, IBM 的律師卻發現一件事,那就是 VMailer 這個名字與其他已註冊的商標很類似,這樣可能會引起一些註冊上面的困擾。為了避免這個問題,所以 Venema 博士就將名稱改為 Postfix !這個 Postfix 有『在什麼什麼之後修正』的意思。鳥哥個人認為, Venema 先生最早的構想並不是想要『創造一個全新的 Mail server 軟體,而是想要製造一個可以完全相容於 sendmail 的軟體』,所以,Venema 先生認為他自行發展的軟體應該是『改良 sendmail 的缺失』,所以才稱為 Postfix 吧!取其意為:『在 sendmail 之後的改良的郵件伺服器軟體!』
 
所以啦, Postfix 設計的理念上面,主要是針對『想要完全相容於 sendmail』所設計出來的一款『內在部分完全新穎』的一個郵件伺服器軟體。就是由於這個理念,因此,Postfix 改善了 sendmail 安全性上面的問題,改良了 mail server 的工作效率,更由於其設定檔完全為 ASCII 碼,且設定內容都是『人類看的懂得語言!』因此,你可以輕易的由 sendmail 改良到 Postfix 上面!這也是當初 Venema 博士的最初構想啊!就是基於這個構想,所以, Postfix 在外部設定檔案的支援度,與 sendmail 幾乎沒有兩樣,同樣的支援 aliases 這個檔案,同樣的支援 ~/.forward 這個檔案,也同樣的支援 SASL 的 SMTP 郵件認證功能等等!所以,呵呵!趕緊來學一學怎樣架設 Postfix 這個相當出色的郵件伺服器吧! ^_^

套件安裝

跟之前一樣的,我們需要的 mail server 功能有哪些呢?
  • 具有 smtp 的功能;
  • 具有 pop3 的功能;
  • 具有 procmail 過濾郵件的功能;
  • 具有 Open Relay Data Base 抵擋的功能;
為達成上述的功能,所以你至少需要底下的幾個套件:
  • cyrus-sasl
  • procmail
  • postfix
  • imap(同時支援 pop3 及 imap 兩個協定)
如果您是使用 Mandrake 後期版本的話,那麼恭喜您,由於 Mandrake 預設就是使用 Postfix 做為郵件伺服器,並且在安裝的時候就已經將 Postfix 安裝到你的系統當中了。至於 Red Hat 9 同樣的也提供了 Postfix 喔!而如果您是使用非 postfix 為郵件伺服器的 Linux distribution ,呵呵!仔細的查看後面介紹的 Tarball 安裝的方式吧!
 

使用 RPM 安裝完整的 Postfix + POP3 + SMTP + Procmail
 
底下我們分 Mandrake 9.0 與 Red Hat 9 這兩個主要 Linux distribution 來介紹 Postfix + Cyrus-SASL 的方法喔!
 
Makdrake 9.x 版本
如果你是使用 Mandrake 之類的 Linux distribution 的話,由於他預設是以 Postfix 這個優良的郵件伺服器系統,所以您可以不費吹灰之力的,就將 Postfix 以 RPM 安裝完畢囉!基本上,如果是 Mandrake 的話,你需要安裝的套件大致上有:
  • SMTP 認證套件: cyrus-sasl ( cyrus-sasl-1.5.27-5mdk 以及其他認證機制函式庫 )
  • Postfix 郵件伺服器: postfix ( postfix-1.1.11-4mdk )
  • POP3 伺服器: imap ( imap-2001a-9mdk, imap-devel-2001a-9mdk 兩個 )
  • 郵件分析軟體:procmail ( procmail-3.22-3mdk )
你至少要安裝的套件就有上面這幾個,同時,請拿出您的原版光碟將上面的套件全部安裝吧!安裝的方法我們在『鳥哥的 Linux 私房菜 -- 基礎學習篇』介紹過的 RPM 與 Tarball 安裝方法裡面提過多次了,請自行參考喔!安裝完畢之後,你的主機就已經具有 Postfix 這個系統啦!不過,由於我們還要提供 SMTP 以及其他相關的功能,所以這裡我們必需要確認一下各個套件是否都完全的安裝了呢?底下我們就一個一個的來設定吧!(註:請特別留意 Cyrus-sasl 的版本,因為不同的版本他的函式庫所在目錄與設定檔都不相同!因此,在本篇文章中,您會發現我使用 Tarball 安裝的 2.xx 版本與使用 RPM 安裝的 1.5.xx 版本設定檔的內容不相同,不要懷疑,確實是如此的喔! )
 
安裝 cyrus-sasl
1. 安裝
# 安裝的方法很簡單,就是使用 RPM 即可!不過,請先確認是否已經安裝!
[root@test root]# rpm -qa | grep sasl
libsasl7-1.5.27-5mdk
cyrus-sasl-1.5.27-5mdk
libsasl7-devel-1.5.27-5mdk
libsasl7-plug-plain-1.5.27-5mdk
libsasl7-plug-login-1.5.27-5mdk

# 如果尚未安裝該套件,請拿出你的光碟片, mount 光碟,然後找尋該檔案,
# 直接安裝他吧!不過要注意的是,上面的檔案都要安裝喔!因為我們使用的
# 是最基本的 plain 與 login 這兩個機制,所以至少我們要安裝上面五個咚咚!
[root@test root]# rpm -ivh cyrus-sasl-1.5.27-5mdk.i586.rpm
# 如果有發生屬性相依的問題,請自行再將需要的檔案自光碟當中找出,
# 然後加以安裝吧!

2. 設定與啟動
# 由於 Cyrus-sasl 在 Mandrake 當中是 1.5.27 版本,所以他能支援的項目有:
shadow : 使用 /etc/shadow 做為認證碼;
pam  : 使用 pam 模組做為認證,這個需要在 /etc/pam.d 這個目錄下新增
     一個名為 smtp 的檔案,並設定檔案內容才行!
sasldb : 使用 SASL 的認證函式庫,使用這個功能時,你必需要額外的
     指定 1.函式庫的名稱; 2.使用 saslpasswd 程式增加使用者!
     鳥哥個人認為這個功能不太好用,因為每新增一個使用者需要主動的
     幫使用者新增帳號、密碼到認證函式庫中,不太方便!
     不過如果您還使用其他的伺服器如 LDAP, MySQL 等等軟體時,
     則這個功能可就大大的有幫助啦!因為他可以分享帳號與密碼吶!
pwcheck: 這個功能就不錯啦! pwcheck 是一個服務(daemon),必需要在
     啟動 postfix 之前就啟動啦,因為 sasl 的認證就靠這個 daemon,
     基本上,他可以經由讀取 /etc/shadow 的資料來提供 client 端
     認證的功能!目前我們 Mandrake 9.0 預設使用的是這個 daemon!
# 給他設定開機時啟動 pwcheck 的功能吧!
[root@test root]# vi /etc/rc.d/rc.local
# 在這個檔案當中最底下新增一行:
/usr/sbin/pwcheck
# 並且立刻執行這個 daemon 喔:
[root@test root]# /usr/sbin/pwcheck
[root@test root]# ps -aux | grep pwcheck
root   12602  0.0  0.5  1460  348 ?    S  02:59   0:00 /usr/sbin/pwcheck
# 看到沒!要出現這個咚咚才算是有啟動 pwcheck 喔!

# 在 Sendmail 當中,我們必需建立一個名為 Sendmail.conf 的檔案,來告訴
# sasl 我們所需要的認證模式,那麼在 postfix 當中也一樣,我們必需要建立
# 一個檔案名稱為smtpd.conf來告訴 sasl ,喝!我 postfix 要的認證方式為何!
# 所以你需要這樣做:
[root@test root]# cd /usr/lib/sasl
[root@test sasl]# echo 'pwcheck_method: pwcheck'  >  smtpd.conf

# 上面這樣做完之後,系統就知道了:
1. postfix 要用 SMTP 認證時會去讀取 /usr/lib/sasl/smtpd.conf 並且知道
  是以 pwcheck 這支程式進行身份認證的動作;
2. 而 pwcheck 這支程式會主動去讀取 /etc/shadow ,裡面的密碼做認證
# 到此為止,就已經設定好了 cyrus sasl 的部分啦!

 
安裝 postfix
1. 安裝
# 安裝的方法很簡單,就是使用 RPM 即可!不過,請先確認是否已經安裝!
[root@test root]# rpm -qa | grep postfix
postfix-1.1.11-4mdk

# 如果尚未安裝該套件,請拿出你的光碟片, mount 光碟,然後找尋該檔案,
# 直接安裝他吧!
[root@test root]# rpm -ivh postfix-1.1.11-4mdk.i586.rpm

# 這樣就安裝完畢啦!主機設定的部分請參考下一節喔!

 
安裝 procmail
1. 安裝
[root@test root]# rpm -qa | grep procmail
procmail-3.22-3mdk

2. 設定:
# 在設定方面,這主要與 procmail 有關而已,您可以下載 procmailrc 
# 並放置到 /etc/ 底下即可詳細的資料請參考上一章簡易 sendmail 之說明

 
安裝 imap
1. 安裝
[root@test root]# rpm -qa | grep imap
imap-2001a-9mdk
imap-devel-2001a-9mdk

2. 設定:
# 直接設定成為開機啟動即可:
[root@test root]# chkconfig --add ipop3
[root@test root]# /etc/rc.d/init.d/xinetd restart
# 這樣就已經可以收信件啦!

 
安裝的地方當中,重點在於 Cyrus-SASL 的安裝啦!由於我們需要有 SASL 的支援,所以必需要安裝這個咚咚!並且也需要設定 smtpd.conf 這個檔案!這樣就已經差不多 OK 啦!接下來請繼續參考主機設定的地方嚕!
 
Red Hat 9 版本:
什麼?!Red Hat 9 也同時提供 Postfix 啊?!沒錯的啦!呵呵!很高興吧!所以說, Red Hat 9 不但提供了 sendmail 給我們使用,還額外提供了 Postfix 讓我們可以隨意的轉換郵件伺服器軟體呢!不過,在 Red Hat 9 的 Cyrus-sasl 已經是 2.xx 版本了,而且還主動的提供相容於 1.5.xx 版本的函式庫呢!真是相當的棒啊!但是因為 Red Hat 9 提供的 Postfix 還是使用 1.xx 版,因此我們在 Red Hat 9 預設的 Postfix 郵件伺服器中,還是使用 Cyrus SASL 1.5.xx 的函式庫喔!所以也就無法使用 saslauthd 這個機制了!並且, Red Hat 9 並沒有提供 pwcheck 這個程式,所以在 Red Hat 9 底下的 Cyrus SASL 認證機制就需要使用 sasldb 了!至於安裝的方法最簡單的方式就是以我們在 網路升級套件 那一章節提到的 APT 來進行安裝即可!
 
1. 安裝:
[root@test root]# apt-get install postfix
[root@test root]# apt-get install cyrus-sasl
[root@test root]# apt-get install procmail
 
很簡單吧!這樣就搞定了 Red Hat 9 的 Postfix 囉!(注意, Mandrake 與 Red Hat 不同版本所使用的 Cyrus SASL 機制並不相同喔!在 Mandrake 當中預設是 pwcheck 而在 Red Hat 則預設使用 sasldb 這個驗證機制!並且,由於 Red Hat 9 在編譯 postfix 的時候使用的是 SASL version 1 ,所以無法使用 saslauthd 這個好用的機制,鳥哥認為,您最好使用 Tarball 來安裝您的 Postfix 在您的 Red Hat 9 上面喔!)
 

使用 Tarball 安裝完整的 Postfix + POP3 + SMTP + Procmail (適用任何版本的 Linux 喔!)
 
以 Tarball 安裝 Postfix 也不困難,比起 sendmail 來說,要簡單的很多喔!我們這裡選擇的主要套件有: 至於 procmail 與 imap 兩個套件都使用 Linux distribution 提供的 RPM 版本就好了,不需要額外的改裝啊!那麼底下就來談一談怎麼安裝吧!(註: Cyrus SASL 與 Cyrus SASL2 這兩個不同版本的 SASL 函式庫放置的目錄並不相同,所以你可以分別安裝 cyrus version 1 與 version 2 喔!在鳥哥的案例當中,還不會發生問題就是了!另外,如果您是 Red Hat 9 的使用者,由於 Red Hat 9 已經提供了 Cyrus SASL version 2 了,所以您可以直接略過 Cyrus SASL 的安裝部分,直接到 Postfix 2.xx 的安裝呢!)
 
安裝 Cyrus SASL 2.xx 版本!
1. 首先將資料解壓縮(假設您將我們網站的檔案捉到 /root 底下了!)
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/cyrus-sasl-2.1.12.tar.gz
.....(略).....最後建立一個 cyrus-sasl-2.1.12 的目錄

2. 再來就是設定你的 cyrus SASL 的參數以及編譯囉!
[root@test src]# cd cyrus-sasl-2.1.12
[root@test cyrus-sasl-2.1.12]# ./configure   \
> --prefix=/usr/local/cyrus-sasl2 --enable-login --enable-plain \
> --enable-pwcheck --with-saslauthd=/var/run \
# 注意上面的語法!!那個 \ 是跳脫字元喔!後面直接 Enter !
# 不要接任何空白或者是 tab 按鍵!若有問題,請到 Shell 看看!
# 至於那個 pwcheck 的項目,就是要用來做為密碼確認的一個咚咚囉!

[root@test cyrus-sasl-2.1.12]# make clean && make
[root@test cyrus-sasl-2.1.12]# make install
# 上面三個步驟會花去一些時間,請耐心等待~
# 而由於我們剛剛設定了 --prefix=/usr/local/cyrus-sasl2 這個參數,
# 所以, make install 之後,我們有用的函式庫會在 
# /usr/local/cyrus-sasl2/lib/sasl2 這個路徑當中,但是, cyrus 程式
# 會主動去找 /usr/lib/sasl2 這個目錄!所以,我們必需要做連結檔!
# 才可以讓未來我們的 postfix 可以直接找的到我們所要的函式庫喔!

[root@test cyrus-sasl-2.1.12]# cd /usr/lib
[root@test lib]# ln -s /usr/local/cyrus-sasl2/lib/* .
# 這樣就建立起連結檔囉!很簡單吧! ^_^不過要注意喔,
# 上面這一行最後面那個小數點『.』不要忘記加了!

3. 準備建立 Postfix 與 cyrus SASL 使用的簡易設定檔:
[root@test lib]# cd /usr/lib/sasl2
[root@test sasl2]# echo 'pwcheck_method: saslauthd' > smtpd.conf 
[root@test sasl2]# echo 'mech_list:plain login'  >>  smtpd.conf 
# 注意了!一般來說, Postfix 會使用 SASL 這個函式庫裡面相關的設定檔,
# /usr/lib/sasl2/smtpd.conf 這個檔案的設定就是 Postfix 的預設使用 SASL 的
# 參數檔案,與 1.5.xx 版本不太相同的地方是, 2.xx 版本使用不同的機制:
auxprop :使用 sasldb2 這個共享資料庫,同樣需要使用共享密碼檔案喔!
      所以一般來說,單純的 Postfix 比較少使用這種機制;
saslauthd:使用 saslauthd 這個 daemon 進行認證的工作,所以幾乎
      不需要其他的設定值哪,指定 saslauthd 就好啦! ^_^
pwcheck :使用與 1.5 版相似的認證 daemon ,不過在 2.xx 版本裡面這個模式
      支援度比較沒有這麼好的啦,所以請愛用 saslauthd 囉!
# 我們使用 SASL 預設的 saslauthd 這支程式做為密碼認證的 daemon。
# 至於 mech_list:plain login 是列出支援的認證機制的意思,我們使用的
# 是極為簡單的 login 與 plain 兩種機制而已!

4. 建立一些需要的參數:
[root@test sasl2]# vi /etc/man.config
# 新增底下這一行之後,未來我們就可以透過 man 這個工具來查詢 sasl 
# 相關的指令的用法了!而不需要修改任何咚咚!不過要注意的是,
# 這個檔案在每個 Linux distributions 當中不見得相同,例如 Open Linux 
# 檔名是 /etc/man.conf 呢!
MANPATH /usr/local/cyrus-sasl2/man

5. 檢驗 saslauthd 這支程式是否可行!
# 在 cyrus-sasl 的原始碼裡面提供了一支小程式用來判斷 saslauthd 的認證機制
# 是否成功的啟動了,這個小程式就是 testsaslauthd 囉!在剛剛原始碼目錄下,
# 所以你可以這樣做:
[root@test sasl2]# /usr/local/cyrus-sasl2/sbin/saslauthd -a shadow
# 執行之後, saslauthd 的 PID 會被紀錄到 /var/run/mux.pid 這個檔案!
[root@test sasl2]# cd /usr/local/src/cyrus-sasl-2.1.12/saslauthd/
[root@test saslauthd]# make testsaslauthd
[root@test saslauthd]# ./testsaslauthd -u userID -p 'yours.passwd'
0: OK "Success."
# 若顯示 OK 的話!那麼就是成功啦!很好!我喜歡~

6. 設定開機時啟動
[root @test saslauthd]# vi /etc/rc.d/rc.local
# 加入這一行:
/usr/local/cyrus-sasl2/sbin/saslauthd -a shadow

 
安裝 Postfix 2.xx 版本!
0. 先確認有沒有這個檔案存在!因為我們的 Postfix 會使用到很多資料庫啊!
[root@test root]# locate pcre.h | grep include
/usr/include/pcre.h
# 這個檔案也有可能存在於 /usr/include/pcre/pcre.h 裡面!不要擔心,存在就好了
# 如果沒有存在的話,例如 Mandrake 9.0 預設狀態可能並不會主動安裝這個套件,
# 請自行拿出原版光碟,安裝 MDK 的 libpcre0xxxx 檔案,至於 redhat 等
# 其他版本,請自行安裝 pcre 相關的套件吧!在 Red Hat 9 則是需要
# pcre-devel 這個套件喔! ( apt-get install pcre-devel)

1. 首先將資料解壓縮(假設您將我們網站的檔案捉到 /root 底下了!)
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/postfix-2.0.4.tar.gz
.....(略).....最後建立一個 postfix-2.0.4 的目錄

2. 清除規則並且建立新的使用 SMTP 的規則給 postfix
[root@test src]# cd /usr/local/src/postfix-2.0.4
[root@test postfix-2.0.4]# make tidy  # 清除規則
[root@test postfix-2.0.4]# make makefiles CCARGS="-DUSE_SASL_AUTH \
>  -I/usr/local/cyrus-sasl2/include/sasl/"  \
>  AUXLIBS="-L/usr/local/cyrus-sasl2/lib -lsasl2"
# 上面的動作在建立 Makefile 囉!其中那個 -CCARGS 後面接的 -DUSE_SASL_AUHT
# -I/usr/local/cyrus-sasl2/include/sasl 其中 -I 後面的路徑就是 SASL2 的
# 函式庫所在的目錄喔!請依照您安裝的 sasl2 目錄所在而定!
[root@test postfix-2.0.4]# make
# 就是開始編譯啦!過程有點久喔!如果有出現任何 Error 時,
# 請將 error 仔細的查看一下吧!通常最大的原因都是一些
# include 檔案沒有安裝,也就是某些重要的套件沒有安裝之故,
# 例如 pcre.h 這個檔案就是一個例子囉!
# 解決的方法就是將該缺乏的套件安裝進去系統啦!
# 如果是 Red Hat 9 的話,可以這樣下達指令:
# make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/include/sasl" \
# AUXLIBS="-L/usr/lib/sasl2 -lsasl2"
# 因為 Red Hat 9 的 SASL2 路徑在 /usr/include/sasl ,這裡要特別的強調,
# 否則由於 Red Hed 9 同時提供 Cyrus SASL 1.5.x 以及 2.x.x 的版本,
# 可能會造成程式的誤判,那麼很可能會出現下列的錯誤喔:
# fatal: SASL per-connection security setup 
# 上面的錯誤訊息出現在 /var/log/maillog 中!

3. 安裝前準備工作:
# 如果您的系統是由 sendmail 要改換到 Postfix 的話,你不需要移除 sendmail ,
# 不過卻需要進行一些小手術喔!
[root@test postfix-2.0.4]# mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF
[root@test postfix-2.0.4]# mv /usr/bin/newaliases /usr/bin/newaliases.OFF
[root@test postfix-2.0.4]# mv /usr/bin/mailq /usr/bin/mailq.OFF
[root@test postfix-2.0.4]# chmod 755 /usr/sbin/sendmail.OFF \
/usr/bin/newaliases.OFF /usr/bin/mailq.OFF

# 此外,還需要建立一個名為 postdrop 的群組與 postfix 的使用者喔!
[root@test postfix-2.0.4]# groupadd -r postdrop
[root@test postfix-2.0.4]# useradd -r -s /bin/false postfix
# 建立一個系統資料帳號吶!
[root@test postfix-2.0.4]# echo 'postfix:  root' >> /etc/aliases
# 請注意,如果您之前安裝過 sendmail 的話,那麼不同版本的 sendmail 他的
aliases 放置的目錄並不相同,所以上面這行指令請依您的主機來設定!

4. 開始安裝 Postfix 到 /etc/postfix 這個目錄下:
[root@test postfix-2.0.4]# make install
# 底下會出現一大堆的問題集,不管如何,幾乎按下 enter 就對啦!
# 除了底下這兩個問題(最後兩個)可以選擇將 readme 檔案存下來喔!
Please specify the destination directory for the Postfix sample
configuration files.
sample_directory: [/etc/postfix] /etc/postfix/sample

Please specify the destination directory for the Postfix README
files. Specify "no" if you do not want to install these files.
readme_directory: [no] /etc/postfix/readme_files

# 這樣就安裝成功啦!接下來請開始查閱 主機的設定 那一節囉!

 

主機的設定

    安裝完畢 postfix 之後,接著下來就是設定了!同樣的,在設定主機之前,有幾個東西是您必需先取得的喔:
     
    1. 具有合法的 hostname ,或者是經過授權的 DNS 主機來設定您自己的主機名稱(hostname);
    2. 您的 hostname 最好擁有一個 MX 的紀錄(record);
    3. 至少一定要瞭解到什麼是 Relay 的問題,以及規劃一下您所想要開放 relay 的網域;
     
    你至少需要有這些資料才行吶!好了,我先假設一下我的案例好了:
     
    1. 我的 hostname 為 vbird.adsldns.org;
    2. 我的 hostname 還有個別名為 www.vbird.adsldns.org ,也就是說, vbird.adsldns.org 與 www.vbird.adsldns.org 都指向同一個 IP ;
    3. 我的 domain name 為 adsldns.org ;
    4. 我預計開放的 relay 網域為 vbird.org 這個網域,與內部的 192.168.1.0/24 這個網域,還要可以使用 access 這個檔案的設定功能!
     
    開始來瞭解 postfix 囉! ^_^
     

    Postfix 的結構
     
    在主機的設定之前我們得先瞭解一下 postfix 的整體構造,以方便以後來處理我們的檔案吶!所以底下我們會先針對 postfix 這個套件的結構做個簡單的說明,然後再針對各個設定項目來進行說明囉!Postfix 的設定檔幾乎完全都在 /etc/postfix 裡面,至於執行檔則在 /usr/sbin 裡面,我們分別來談一談幾個主要的注意事項吧!
     
    • 設定檔Postfix 的設定檔都在 /etc/postfix 裡面,主要的設定檔有:
     
      • /etc/postfix/main.cf :這個就是最重要的 postfix 的設定檔了!等一下我們談到的設定都在這個檔案裡面進行修改的動作!基本上,他本身就是一個簡單的說明文件檔啦!不過,要注意的是,在你修改完成了 main.cf 之後,請記得『一定要重新 reload 或重新 restart postfix 才行!』
       
      • /etc/postfix/master.cf:這個檔案是另外一個重要的 postfix 設定檔!他主要是規定了 postfix 每個程序的運作參數!
       
      • /etc/postfix/access :這個檔案與 sendmail 的 access 是相同的!都是用來做為 relay 或者是 deny 某些 IP 與 hostname 的檔案!不過,要啟用他還是得要修改 main.cf 才行!
       
      • /etc/postfix/aliases : 這個檔案與 sendmail 的 aliases 也是相同的!同樣的可以做為別名之用,所以您可以回頭去翻一翻這個檔案的用法喔!
       
      • /etc/postfix/pcre_table regexp_table relocated : 這幾個檔案可以做為郵件的過濾之用喔!可以使用正規表示法來進行郵件過濾(filter)的規則,呵呵!會使用這幾個檔案,或許連 procmail 也不需要使用了呢! ^_^
       
    • 執行檔:Postfix 的執行檔可不少啊!約略提幾個主要的執行檔吧!

    •  
      • /usr/sbin/postfix:這就是 postfix 的主要執行檔案啦!啟動與簡單的關閉 postfix 可以使用:
        • postfix check :檢查 postfix 相關的檔案、權限等是否正確!
          postfix start :開始 postfix 的執行
          postfix stop  :關閉 postfix
          postfix flush :強制將目前正在郵件佇列的郵件寄出!
          postfix reload:重新讀入設定檔,也就是 /etc/postfix/main.cf
        要注意的是,每次更動了 /etc/postfix/main.cf 之後,一定需要執行 postfix reload 喔!
         
      • /usr/sbin/postalias:這個指令是 sendmail 的 newaliases 啦!他可以用來將上面提到的設定檔  aliases 製作成為 postfix 看的懂得『資料庫』格式化檔案!由於一般來說,我們都是使用 hash 這一種資料格式,所以囉,你可以簡單的使用底下的指令方式來格式化。
        • postalias 資料庫格式:檔名
          postalias hash:/etc/postfix/aliases  ==>自動建立 /etc/postfix/aliases.db 這個資料庫檔案!
           
      • /usr/sbin/postcat :這個指令可以用來觀察某個郵件佇列裡面檔案的資訊!postfix 的郵件佇列放置在 /var/spool/postfix 裡面,但是這個目錄裡面的檔案格式是 postfix 看的懂得,我們人類看不懂~為了取得這些在郵件佇列裡面的檔案資訊,所以我們得使用 postcat 這個指令來讀取出資訊喔!假如有個檔案放在 /var/spool/postfix/deferred,你可以這樣看:
        • postcat /var/spool/postfix/deferred/filename
           
      • /usr/sbin/postconf :可以用來讀取 main.cf 這個檔案裡面的設定資料的一個指令!用途多多啊!簡單的來說,可以直接將你的 main.cf 裡面的設定分門別類的顯示給你看,可以幫助除錯 (debug) 啦!不錯的工具,鳥哥個人蠻喜歡加入 -n 這個參數來瞭解目前的主要規範檔放置在那個目錄下!
        • postconf -n
        顯示的結果為:
          alias_database = hash:/etc/postfix/aliases
          alias_maps = hash:/etc/postfix/aliases
          command_directory = /usr/sbin
          config_directory = /etc/postfix
          daemon_directory = /usr/lib/postfix
          debug_peer_level = 2
          .......
        看到了吧!你想要知道的資料立刻一目了然,可以加快你的除錯喔!不必每次都要進入 main.cf 裡面找好久呢!
       
      • /usr/sbin/postmap:怪怪!這個指令的用法跟上面提到的 postalias 幾乎完全一模一樣啊! ^_^不過,他是用來取代 sendmail 的 makemap 的!用法是:
        • postmap hash:/etc/postfix/access ==>自動建立 /etc/postfix/access.db 這個資料庫檔案!
       
      • /usr/sbin/postqueue :這個是在觀察郵件佇列的一個指令啦!你可以使用 postqueue -p 來顯示目前的郵件佇列內容!這個:
        • postqueue -p 與 mailq 顯示的內容會一模一樣喔!
           
    • 目錄:同樣的具有郵件佇列與郵件信箱的放置目錄啊!

    •  
      • /var/spool/mail :電子郵件信箱放置目錄
      • /var/spool/postfix :郵件佇列,裡面還有很多次目錄,都是一些其他功能的咚咚啊!
     
    整體的架構大致是如此,好啦!瞭解的一定程度的架構之後,我們要開始來談談主機的最基礎設定了吧!
     

    基礎設定
     
    終於要來搞定我們的設定檔 /etc/postfix/main.cf 啦!先來搞定比較簡單的幾個部分喔!在 Postfix 安裝完畢之初,他僅支援本機寄信而已,如果您想要開放外送郵件,那就必需要做一些手術啦!底下幾個重要的項目先來觀察一下囉!(註:請使用 vi 來編輯喔!)
     
    在 main.cf 這個檔案當中,設定的項目都是以類似變數的設定方法來設定的,例如要設定 postfix 主機名稱時,就以:
    myhostname = vbird.adsldns.org
    這樣的方式來設定的,那麼什麼是『變數』呢?如果還不清楚,趕緊拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』翻到『認識 BASH 』的章節,好好的瞧一瞧去吧!尤其變數的內容顯示需要用 $ 來領頭的用法,千萬不可忘記!例如:
    myorigin = $myhostname  ==> myorigin = vbird.adsldns.org
    上面兩個是一模一樣的,只是藉由變數來讓我們的設定更加的簡單化!不過,與變數設定規則當中比較不同的,在 main.cf 當中的等號兩邊需要有空白!此外,如果有兩個以上的設定呢?那你就必須要逗號『,』或者是空白字元『 』來做為分隔了!例如:
    mydestination = $myhostname, $mydomain 
    mydestination = $myhostname $mydomain 
    在底下的設定當中請特別留意這些設定喔!
     
    • 主機名稱的設定:myhostname 與 mydomain (極重要)

    • 這個設定蠻重要的喔!就是在設定你的主機名稱囉!請特別留意,這個『 myhostname 』的變數在 main.cf 設定檔的後面會持續的被使用到,所以,不要寫錯了!至於 mydomain 則是你的網域啦!以鳥哥的 linux.vbird.org 為例,我的主機名稱為 linux.vbird.org (用 FQDN 的方式來寫),此時,我的 domain 就是 vbird.org 啦!在本章的例子當中,主機名稱為 vbird.adsldns.org 網域名稱為 adsldns.org ,所以你要這樣設定:
      myhostname = vbird.adsldns.org   <==這裡請書寫你的主機名稱喔!
      mydomain = adsldns.org      <==這裡則是你的 domain 名稱!
       
    • 送件來源的主機名稱:myorigin

    • 這個項目在設定『郵件標頭上面的 mail from 的那個位址』!當我們在本機端使用 mail 這個程式發送信件時,由於沒有定義送件者的位址,一般而言, 郵件主機會以目前的主機名稱做為郵件的 FROM 的那個主機名稱。例如在我的 postfix 上面使用 mail 發送信件時,在發送的郵件當中,就會顯示發信人為 vbird@vbird.adsldns.org 的意思啦!不過,我也可以自行指定來源主機的名稱,就是在這個 myorigin 設定的!通常,使用 $myhostname 來設定 myorigin 即可,不過,在某些大型主機當中,由於這個大型網域內可能有多部的郵件主機,在此時可指定 myorigin 為 $mydomain ,不過,如此一來還得替每個 user 指定其他相關的參數!所以,如果沒有其他要求的話,這個地方設定為底下的樣子即可:
      myorigin = $myhostname
       
    • 可用來收件的主機名稱:mydestination (極重要)

    • 這個項目可就重要的太多太多了!這個項目就是 sendmail 當中的 /etc/mail/local-host-names 相同的意義啦!你的 postfix 只有在發現 mydestination 這個項目中有寫入的主機名稱做為收信主機時,才會將該封信件收下來!例如,當你的主機名稱有 vbird.adsldns.org 與 www.vbird.adsldns.org ,這兩個主機名稱均指向同一部主機,那麼只有在你將這兩個名稱都寫入 mydestination 項目中,那麼兩個主機的來信才可以被接受,否則就會被退回喔!這個項目有多種設定方法,最簡單的就是直接寫入檔案中,另外,也可以設定的跟 sendmail 一樣,用外部的檔案來取代喔!
      方法一:利用變數的型態
      mydestination = $myhostname, www.$myhostname

      方法二:直接給他寫入名稱
      mydestination = vbird.adsldns.org, www.vbird.adsldns.org

      方法三:使用檔案型態
      mydestination = /etc/postfix/local-host-names
      上面的名稱可以隨便你取喔!然後在該檔案內設定
      [root@test root]# vi /etc/postfix/local-host-names
      vbird.adsldns.org,
      www.vbird.adsldns.org

      一般來說,除非您對於 local-host-names 這個檔案名稱情有獨鍾,否則的話,鳥哥個人建議您直接在 mail.cf 裡面直接設定好你的可接受的主機名稱即可!特別留意的是,如果你的 DNS 裡頭的設定有 MX 的話,那麼請將 MX 指向的那個主機名稱一定要寫在這個 mydestination 內!否則很容易出現錯誤訊息喔!特別的給他注意這一點!『一般來說,使用者最常發生錯誤的地方就在這個設定裡頭呢!需要搭配你的 DNS 設定喔!
       
    • 簡易的 Relay 控制:inet_interfaces mynetworks_style mynetworks relay_domains (極重要)

    • 這個項目在控制誰可以利用我們的主機來寄信呢?也就是在 sendmail 裡面的 access 那個檔案的咚咚啦!分別說明一下幾個東西囉!
       
      • inet_interfaces:你的 Postfix 主機能被用來使用的介面,假如你的 Linux 主機有多個介面,例如多張網路卡或者是撥接之後又會產生的 ppp0 這些介面時,如果你不想要全部的介面都開放 postfix 功能,那麼就可以在這裡指定能用的介面囉 (註:指定的方式是以主機名稱為主喔!) 一般預設只有自己的內部迴圈網路可以使用 (localhost) ,不過,如果要連上 Internet 的話,建議就要全部都開放啦! inet_interfaces = all
       
      • mynetworks_style:這是用來設定你所想要的 relay 的信任(trust)網域型態!一般來說,有三種主要的型態,分別是:
       
        • class :表示為 A/B/C 三種 class 其中之一,在撥接或者是 ADSL 的情況下,這種型態設定並不好!因為他會主動的去找你目前的 IP 所在的網域來進行 relay 的功能開放!舉個例子來說,如果你是以中華電信的 ADSL 撥接情況,那麼你的 IP 很可能會是 61.59.xxx.yyy ,那如果你設定為 A class 的話 ( postfix 會自動的判斷,請至"網路基礎"一文當中查看 A/B/C 三個 class 的說明 ) ,那麼只要是 61 開頭的 IP 都可以用你的 postfix 喔!很嚴重吧!這個設定通常只給內部私有網域來使用的囉!
         
        • subnet:這是 postfix 的預設值,使用 subnet 的型態來設定喔!意義是說,你的網路卡 IP 所在網域的任何一個 IP 都會被接受的意思!例如我的主機網卡私有 IP 為 192.168.1.2 那麼所有我內部網域連接到這個網卡的 192.168.1.0/24 這個網域的所有 IP 都會被認為是『合法的』!而自動的提供其 Relay 的功能呢!
         
        • host :在這個設定時, postfix 僅會知道 localhost 設定為 trust (信任) 的網域而已!
         
        基本上,這個設定值你可以指定為 mynetworks_style = subnet ,不過,也可以不要設定啦!直接以底下 mynetworks 來設定 relay 的網域即可!另外,如果您有設定 mynetworks_style 以及 mynetwork 時,那麼 mynetworks 這個設定會取代掉 mynetworks_style 喔!因為如此,所以鳥哥個人是不設定 mynetworks_style 的,只設定 mynetworks 而已!
         
      • mynetworks :這個也是用來開放 Relay domain 的一個設定項目!一般來說,也可以設定成很多的方式,包括檔案與變數或直接書寫需要的 IP/netmask 類型!這裡我們假設有 192.168.1.0/24, 127.0.0.0/8 以及 192.168.1.100 這幾個咚咚要開放,所以我可以這樣寫:『mynetworks = 192.168.1.0/24, 127.0.0.0/8, 192.168.1.100/32』!如此一來,連 access 都不需要設定呢! ^_^ ( 註:請注意,如果你沒有設定 mynetworks 的話,一定要將 mynetworks_style 設定為 host 喔!不然你的 IP 所在的子網域的 IP 會被自動的認為是『合法的』呢!)另外,如果你想要啟用 /etc/postfix/access 這個檔案的設定功能時,那就必需要再加以修改喔!例如:『mynetworks = 127.0.0.0/8, hash:/etc/postfix/access 』注意檔案名稱使用完整檔名!
       
      • relay_domains:相對於 mynetworks 設定的專門針對『來源』的 IP 來設定,那麼如果是以主機名稱,或者是領域名稱( domain )時,要如何設定呢?那就可以使用這個項目來設定啦! mynetworks 設定『信任網域的來源 IP 』而 relay_domains 則可以設定『信任網域的來源與目標之主機或領域名稱』啦!舉個例子來說,如果你的主機要開放 vbird.org 這個網域的主機的 Relay 功能,那麼你將 vbird.org 寫入 relay_domains 當中時,那麼:
       
        1. 任何由 vbird.org 來的信件都會被認為是『信任』的,所以 postfix 主機會自動幫忙 relay ;
        2. 由任何地方來的信件,"並且"要往 vbird.org 這個網域去的信件,postfix 主機也會幫忙 Relay 的!
         
        所以說,這個 relay_domains 可以設定『來源』與『目標』的主機或領域名稱喔!一般來說,relay_domains 預設就是我們自己的主機啦!!
       
      上面的設定項目當中,我們可以僅設定兩個即可啦!其他的不用管也沒有關係!不過,由於我預設還有啟動 vbird.org 這個 relay domain ,所以說,整體架設如下:
      inet_interfaces = all
      mynetworks = 192.168.1.0/24, 127.0.0.0/8, 192.168.1.100/32, 
             hash:/etc/postfix/access
      relay_domains = vbird.org

      設定完成之後還需要啟動 access 喔!
      1. 先手動修改完任何你想要的動作在 /etc/postfix/access 當中;
      2. 完成資料庫的建置:
      [root@test root]# postmap hash:/etc/postfix/access

       
    • 設定帳號別名的資料庫:aliases_maps (極重要)

    • 還記得 aliases 這個帳號別名的用途吧?!如果你是以 RPM 的方式來安裝 Postfix ,那麼這個設定值是沒有問題的,但是,如果你是以 Tarball 來安裝你的系統時,並且是由 sendmail 升級的,那麼由於 sendmail 將 aliases 放置在 /etc/aliases (要視你的 Linux 版本而定!),不過,比較好的作法是將 aliases 放置在 /etc/postfix/aliases 裡面,這樣設定與目錄之間的關係比較容易找啦!那要如何修改呢?首先,你可以將舊有的 aliases 移動到 /etc/postfix/aliases 裡面,並且請特別注意,這個舊有的檔案裡面,一定要存在有『 postfix: root 』這一個設定才行喔!然後透過 /etc/postfix/main.cf 裡面的 alias_maps 來修改,通常鳥哥個人喜歡改成這樣:
      alias_maps = hash:/etc/postfix/aliases
      alias_database = hash:/etc/postfix/aliases
      改完之後還需要以 postalias 來建置成為 postfix 可以讀取的資料庫格式喔!
      [root@test root]# postalias hash:/etc/postfix/aliases
       
    呵呵!設定完上面這幾個重要的項目之後,基本上,你的 postfix 主機『已經準備好上路啦!』所以,這個時候請將他啟動吧!或者是重新啟動他吧!
     
    先確認設定檔有沒有錯誤:
    [root@test root]# postfix check  <==檢查錯誤,若沒有任何顯示,表示正確

    如果是 RPM 安裝的情況:
    [root@test root]# /etc/rc.d/init.d/postfix restart

    如果是 Tarball 安裝的情況:
    [root@test root]# postfix start

    檢查是否正確的啟動了呢?
    [root@test root]# netstat -tl | grep smtp
    tcp        0      0 *:smtp                  *:*                     LISTEN

    設定開機的時候立刻啟動:
    [root@test root]# chkconfig --add postfix <== RPM 安裝時
    [root@test root]# vi /etc/rc.d/rc.local   <== Tarball 安裝時
    加入下面這行:
    /usr/sbin/postfix start

     
    當出現上面的那行斜體字顯示的內容 ( LISTEN ) 時,哈哈!你的 postfix 已經啟動啦!這個時候 postfix 已經可以:
     
    1. 針對 mynetworks 設定的 Client 端,進行 relay 的動作;
    2. 針對信件目的為 mydestination 設定的主機名稱『接收該信件』!
     
    雖然你是使用 Tarball 方式安裝 Postfix 的,但是如果你想要使用 /etc/rc.d/init.d/postfix restart 的語法來啟動的話,鳥哥已經寫了一支簡單的 scripts 提供大家這樣進行工作呢!可以 前往下載(http://linux.vbird.org/download/index.php#sendmail_postfix) 喔!
     

    重要觀念:Postfix 預設的 Relay 流程與收受信件流程:
     
    在預設的情況下 ( 也就是說,在沒有開放 SMTP 這個郵件認證時! ) Postfix 對於收信與寄信的流程是如何呢?!這裡我們得分別來談一談幾個主要的設定項目與郵件傳輸的動作喔!
     
    • 幫助 Client 發送信件,也就是 Relay 的功能開放的需求項目:在開放哪些項目之後,你的 postfix 主機才會幫助『信任』的 Client 端 Relay 呢?
      1. 當 Client 來自信任的網域,也就是 IP 符合 $mynetworks 的設定值時;
      2. 當 Client 來自信任的機器,也就是主機名稱符合 $relay_domains 的設定項目時;
      3. 當 Client 來自不信任的網域,但是去的目的地主機端符合 $relay_domains 的設定時。
      當符合上面三點的任何一點時,那麼 postfix 將對該信件進行 relay 的動作喔!
       
    • 收信程序:在哪些情況之下,我們的 postfix 會將該封信件收下來呢?
      1. 收件者主機名稱符合 $inet_interfaces 的設定;
      2. 收件者主機名稱符合 $mydestination 的設定;
      3. 收件者主機名稱符合 $virtual_maps 的設定。
      符合上面三點的任何一項時,那麼該封信件就會被我們的 postfix 收下來!所以,如果你的 postfix 能寄不能收,或者是能收不能寄,請仔細的觀察一下上面的幾個重大的設定項目,仔細的在你的 main.cf 重新設定一下,基本上,應該就不會有太大的問題啦!
     

    啟動 smtp 郵件認證功能
     
    談完了 Relay 的功能之後,接下來自然就是重要的『SMTP』郵件認證的部分了!目前郵件認證的功能有相當多種類,請特別留意的是,鳥哥這裡使用的是 SASL 釋出的 pwcheck 與 saslauthd 這兩個 daemons 提供的功能喔!這兩個功能分別在 cyrus-sasl 1.5.xx(pwcheck) 裡頭與 2.xx(saslauthd) 裡頭設定的啦!但是 Red Hat 9 使用的是 saslauthd 喔!請回到前面的 Postfix 安裝裡面瞧一瞧 RPM 的 1.5.xxTarball 的 2.xx 好嗎!你要作的動作有:
     
    1. 確定 cyrus-sasl 已經安裝,並且同時必須要安裝 libsasl 相關的 LOGIN 及 PLAIN 的函式庫(這個在前面 Postfix 套件安裝 當中已經說明了,分別參考 Tarball 與 RPM 的安裝,請前往參考);
    2. 確定在 sasl 函式庫內已經存在有 smtpd.conf 這個檔案 (注意,cyrus-sasl 第一版函式庫在 /usr/lib/sasl 而第二版則在 /usr/lib/sasl2 ,目錄並不相同,請仔細察看一下您的 sasl 喔! ),這個檔案的內容在 Postfix 套件安裝裡面已經說明了!並且 sasl 與 sasl2 設定並不相同,請自行參考;
    3. 確定已經使用 pwcheck(cyrus-sasl 1.5.xx) 或 saslauthd(cyrus-sasl 2.xx) 這兩個 daemon 了,並且已經成功的啟動 daemon 了!可以使用『ps -aux | grep pwcheck 』或『ps -aux | grep saslauthd 』察看是否有 process 存在;
    4. 修改 /etc/postfix/main.cf 這個檔案的設定 (請參考底下的說明);
    5. 重新啟動 postfix 。
     
    基本上,大部分的內容我們在安裝的時候已經搞定啦,就剩下需要設定 main.cf 這個檔案而已,那麼有哪些資料必須要設定的呢?
     
    針對主機設定:
    • smtpd_sasl_auth_enable:『確定是否要針對 Client 啟動 sasl 的認證呢?』預設是不啟用,這裡我們必須要將他給啟用才行啊!所以要『smtpd_sasl_auth_enable = yes
     
    • smtpd_sasl_local_domain:『確認已經經過認證的網域』,就是不需要身份認證也可以是『信任』的網域囉,在 1.5.xx 版的 cyrus 可以直接填寫為 $myhostname 啦!不過,在 2.xx 版本時,就不能設定了!很重要喔!
     
    • smtpd_recipient_restrictions:『信件收件的限制規則』,既然已經啟動了 sasl 的郵件認證,此時必須要規定一下,到底在什麼條件之下,我們的 postfix 可以接受 Client 端的 Relay 的功能呢?主要有底下這幾種限制的規則:
      • permit_mynetworks:在 mynetworks 這個項目設定的網域 IP 都可以被允許連線喔;
      • permit_authenticated:允許使用者經過 SASL 的認證方式寄信!
      • check_relay_domains:通過一些測試之後的主機可以進行 relay ,與剛剛前幾節的 relay_domains 有點關係!不過,在 2.xx 版本下,需要變成底下的項目了!
      • reject_unauth_destination:這是在 2.xx 版本時的設定項目,取代了 check_relay_domains 的設定項目囉!
      通常我們會設定上面這三個就差不多啦!
       
    • smtpd_client_restrictions:『針對 client 端的限制規則』,經過 mynetworks 這個信任網域的 IP 之後,那未經信任的 Client端 IP 來源你要限制他使用你的 postfix 時,這個項目就要啟動 permit_sasl_authenticated 囉!
     
    • smtpd_sasl_security_options:『限制某些登入的方式』,在 Postfix 裡面,預設是使用 Plaintext 的方式來認證的,所以自然不能取消掉這個認證囉(noplaintext)!但是我們可以取消掉匿名登入的型態喔(noanonymous)!可以這樣做『smtpd_sasl_security_options = noanonymous
     
    針對 Client 設定:
    • smtp_sasl_auth_enable:上面是針對主機來設定的,這個項目則是針對 Client 來設定的,在預設的情況之下, Postfix 並不會對 client 提供認證的功能,也就是說, postfix 只會依據 mynetworks 之類的信任網域來提供 Relay 的功能,那麼我們要啟動對於 client 的身份認證功能時,這裡就必需要設定為 yes 才行!不過,如果是在 2.xx 版本時,這個設定就不需要啦!
     
    所以整個設定值就變成這樣啦:
     
    [root@test root]# vi /etc/postfix/main.cf
    1.5.xx 版本的 Cyrus SASL
    底下請自行新增在這個檔案的最後面:
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain = $myhostname
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, 
         check_relay_domains
    smtpd_client_restrictions = permit_sasl_authenticated
    smtpd_sasl_security_options = noanonymous
    smtp_sasl_auth_enable = yes

    2.xx 版本的 Cyrus SASL
    底下請自行新增在這個檔案的最後面:
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain = ' '
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
         reject_unauth_destination
    smtpd_client_restrictions = permit_sasl_authenticated
    smtpd_sasl_security_options = noanonymous
    註:有網友來信告知,在 smtpd_sasl_local_domain 的部分,也可以修改成:
    smtpd_sasl_local_domain=
    即可!

     
    另外,由於 RPM 版本的 Postfix 預設會使用 chroot jail 這個比較安全的動作,所以,如果是 RPM 安裝時,你還必需要修改一個檔案:
     
    [root@test root]# vi /etc/postfix/master.cf
    找到底下的這一行:
    smtp    inet    n       -       y       -       -       smtpd
    將他改成為:
    smtp    inet    n       -       n       -       -       smtpd
     
    註:chroot jail 的功能在於『使用權限較低的一般身份使用者來進行 postfix 的工作程序,只有在需要的時候才可以進入 /var/spool/postfix 這個郵件佇列目錄!』,對於系統來說,是有一定程度的安全保障的!所以, Postfix 才會在預設的情況之下以 chroot 的功能來進行 postfix 的!不過,再加上了 SMTP 這個認證機制之後,由於他必需要以比較高等級的使用者來執行一些認證個功能,所以除非您額外的加入很多的函式庫去到 chroot jail 目錄下,否則的話,就不能使用 chroot 啦!所以,如果要啟動 SMTP 的話,請務必將 master.cf 這個檔案修改過喔! ^_^
     
    這樣就算設定完畢啦!然後重新啟動 postfix 看看情況是如何:
     
    [root@test root]# /etc/rc.d/init.d/postfix restart
    [root@test root]# telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost (127.0.0.1).
    Escape character is '^]'.
    220 vbird.adsldns.org ESMTP Postfix (1.1.11) (Mandrake Linux)
    ehlo localhost   <==確認一下你的主機狀態
    250-vbird.adsldns.org
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-AUTH PLAIN LOGIN  <==出現這個就是成功囉!
    250-XVERP
    250 8BITMIME
    quit  <==離開吧!
    221 Bye
    Connection closed by foreign host.
     
    然後確定一下你的機器是否真的有在進行認證的工作呢?首先,先取得你的密碼,然後再以密碼來測試看看認證是否可以通過!舉例來說,假如我有一個使用者 test ,test 的密碼為 abc 的時候,那麼你可以這樣做:
     
    [root@test root]# printf 'test\0test\0abc' | mmencode
    dGVzdAB0ZXN0AGFiYw==   <==這個東西就是你的密碼啦!
    [root @test root]# telnet localhost 25
    telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 vbird.adsldns.org ESMTP Postfix
    ehlo localhost   <==先打招呼
    250-vbird.adsldns.org
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-AUTH LOGIN PLAIN
    250-XVERP
    250 8BITMIME
    auth plain dGVzdAB0ZXN0AGFiYw==
    235 Authentication successful  <==若出現這一行表示你的 SMTP 已經運作正常
    quit
     

    幾個相關的檔案說明
     
    在 sendmail 當中有幾個頗為重要的檔案,例如 ~/.forward 等等的檔案!在這裡我們也必需說明一下這幾個檔案在 postfix 裡面的應用情況:
     
    • /etc/mail/local-host-names:這個檔案是用來書寫你的 mail server 可以接收『目的 e-mail server』的名稱的一個檔案,這在先前的設定項目中已經提過了,就是 /etc/postfix/main.cf 裡面的 mydestination 的設定內容啦!
     
    • /etc/mail/access :這個檔案用來規定可以 Relay 或者需要 discard 的動作!在 postfix 當中預設是不開啟這個檔案的設定的,如果要啟用的話,需要在 mynetworks 裡面規定好檔案名稱喔!設定方法請參考前幾節的說明!
     
    • ~/.forward :這個檔案在 sendmail 與 postfix 當中的設定是一模一樣的,都是用來幫忙郵件的轉遞的,可以參考 sendmail 的設定項目!
     
    • /usr/sbin/mailq:這個執行檔已經被更改過了!目前可以使用 postqueue -p 來顯示出還在郵件佇列的信件標題喔!
     
    基本上,在 sendmail 當中可以使用的外部設定檔案,在 postfix 底下幾乎都能再被使用!所以,由 sendmail 升級到 postfix 真是相當的簡便啊! ^_^

用戶端的使用說明

所有在 sendmail 當中需要注意的與可以使用的 Client 端的功能,在 postfix 當中都同樣的可以使用喔!所以,這部份請回到『sendmail 伺服器』那一章去瞧一瞧怎麼使用 client 來進行 Mail server 的種種工作吶!其中,需要特別強調的有幾個小細節:
  • 如果您有啟動 SMTP 的認證時,請千萬注意在 client 端的 MUA 必需要啟動『我的寄件人需要密碼』的項目,詳情請參考 sendmail 的設定一文;
  • 在 sendmail 當中,不論 port 25 有沒有啟動, Linux 本機上面使用 mail 寄信,『還是可以』將信傳送出去,不過在 postfix 可不是這麼回事了!你若沒有啟動 port 25 時,那麼使用 mail 將會把信暫時的放置郵件佇列當中 (/var/spool/postfix) ,直到再次開啟 port 25 之後,信件才有可能再次的備傳送出去喔!

關於郵件主機安全的設定

    關於郵件主機的安全性方面,我們已經啟動了 SMTP 了,那麼還有 Open Relay 主機的抵擋,以及 Procmail 的規則要規定呢!關於原理部分我們就不再提了,有興趣的回到上一篇去瞧一瞧,這裡僅介紹作法喔!
     

    關於 Open Relay Data Base
     
    啟動 ORDB 的功能只要:
     
    1. 設定 /etc/postfix/main.cf
    2. 重新載入 postfix
     
    就可以啦!我們可以這樣做:
     
    [root@test root]# vi /etc/postfix/main.cf
    smtpd_client_restrictions = hash:/etc/postfix/access, 
         reject_rbl_client   relays.ordb.org,
         reject_rhsbl_client dsn.rfc-ignorant.org
    # 還記得 main.cf 的語法喔!呵呵!上面說的是,我們可以利用/etc/postfix/access
    # 以及relays.ordb.org 以及 dsn.rfc-ignorant.org 等機制來抵擋黑名單主機之意
    # 不過,如果您使用的是舊的 postfix 版本(1.5.xx),那麼可能您的設定需要改為
    maps_rbl_domains = relays.ordb.org
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
         reject_unauth_destination, reject_maps_rbl
     
    [root@test root]# /etc/rc.d/init.d/postfix reload
     
    還有更多的 Open Relay 的機制可以參考這個網頁喔:
    http://jimsun.linxnet.com/misc/postfix-anti-UCE.txt
     

    關於 Procmail 用法
     
    在 Postfix 當中啟用 procmail 真是太簡單啦!同樣的設定只要一行就夠了!
     
    [root@test root]# vi /etc/postfix/main.cf
    mailbox_command = /usr/bin/procmail

    [root@test root]# /etc/rc.d/init.d/postfix reload

     
    就是這麼簡單!至於 procmailrc 這個檔案,請參考 sendmail 的簡易設定一文喔!不過,事實上,使用 Procmail 在 Postfix 上面屬於額外新增一項功能的設定,其實我們可以使用 Postfix 預設的郵件過濾功能即可,那就是使用信件的 header 與 body 過濾機制來達成囉!至於作法我們在底下進行介紹囉!
     

    關於郵件過濾的規則設定
     
    相信您如果架設過郵件主機的話,一定有曾經 (1)被廣告信件轟炸與 (2)被莫名的病毒信件攻擊的窘境發生過~真的是很討厭!我們一般的作法有可能是利用額外的 Procmail 來進行郵件的分析與過濾,這是一個不錯的選擇啦!不過,由於使用 Procmail 時,他是另外一支程序,所以可能會造成程序與登錄檔屬性不合的問題發生呢!那怎麼辦呢?呵呵!其實在 Postfix 裡面他原本就預設了兩個郵件過濾的機制了,分別是標頭( Header )與內容( Body )這兩部份的過濾機制喔!
     
    先來說明一下,什麼是 Header 與 Body 呢?最簡單的想法你可以這樣想:在你接到的一封信中,這封信主要分為底下這兩部份:
     
    • 信封上面的資訊 ( Header ):這包含了寄件者、收件者、地址、與信件標題等等!至於在 E-mail 上面,就是所謂的標題 ( Subject ) 、送件者 (From: )、收件者 ( To: )以及其他相關的資訊等等囉!
     
    • 信封內的信紙資訊 ( Body ):這就是對方寄信給你的時候所書寫的內容啦!
     
    如果我們能夠針對這兩者來進行規則的過濾,如此一來,呵呵!當然就可以抵擋掉大部分的問題信件咯!這些問題信件主要就是病毒信與廣告信了。不過,您必須要瞭解的是,這個過濾的規則是以正規表示法 ( Regular Expression, RE ) 來進行設定的!因此,您最好能夠具有初階的 RE 概念,如此一來會比較容易看懂底下的資料喔!
     
    1. 啟用 Postfix 設定檔裡頭的設定:

    2. 好了,首先我們當然必須要啟動設定檔裡面針對這個郵件過濾的設定了!這裡我們訂定為這樣:
      • 對於 Header 的過濾規則以 /etc/postfix/header_checks 來進行設定;
      • 對於 body 的過濾規則以 /etc/postfix/body_checks 來進行設定。
      然後下達這樣的參數:
      [root@test root]# vi /etc/postfix/main.cf
      # 在這個檔案的最底下加入這兩行
      header_checks = regexp:/etc/postfix/header_checks
      body_checks = regexp:/etc/postfix/body_checks
      # 注意一下,那個 regexp 表示『我使用正規表示法來進行過濾的規則訂定』的意思
      # 至於後面接的檔案就是設定檔啦!
       
      [root@test root]# postfix reload
       
    3. 開始設定規則:

    4. 對於規則的訂定其實並不簡單的!我們有必要針對 RE 的規則來進行約略的說明:
      • 在規則設定檔裡面 ( 就是 header_checks 與 body_checks ) 只要是 # 代表該行為註解,系統或直接略過;
      • 所謂的過濾規則即是 Header 與 body 裡面的『關鍵字』,例如我不想讓 192.168.100.5 這個 IP 寄件到我的 mail server ,那麼這個 From:.* 192.168.100.5 就是一條規則了!那個 .* 代表什麼意思呢?他代表『沒有或多個任意字元』的意思~更詳細的說明請參考各個正規表示法的標準說明了!常見的正規表示法特殊字元與意義為:
        • 『.』:代表任意字元
          『\』:代表跳脫字元,可以讓後面接的一個字元變成一般字元;
          『*』:代表重複零個或多個前一個 RE 的字元,例如『.*』則代表任意零個或多個字元的意思;
          『^』:代表『這一行的第一個字元需要符合規則』的意思;
          『$』:代表這一行的最後一個字元必須要符合這個字元的意思,
      • 單一規則的設定方法為:
        • /規則/  動作  顯示在登錄檔裡面的訊息
        請注意,要使用兩個『 / 』將規則包起來喔!舉個例子來說明:例如我想要 (1)抵擋掉標題為 A funny game 的信件,(2)並且在登錄檔裡面顯示 drop header deny,我可以這樣寫:
          /^Subject:.*A funny game/  DISCARD drop header deny
      • 在預設的規則當中,大小寫是視為相同的;
      • 如果有兩條以上的規則,那麼就必須要使用 if 了,例如底下的案例:
        • if /^Content\-Type:.*audio.*x\-midi/
          /^.*name\=.*\.scr/  DISCARD   drop the header inavalid
          endif
        上面的意思是,當一封郵件裡面同時包含『 Content-Type: audio.x-midi 』與『name=*.scr』時,該封信件就會被丟棄了!那麼如果有三條以上的規則時呢?呵呵!就是使用多個 if 來進行啦!
          if /rule1/
          if /rule2/
          /rule3/  動作   顯示字眼
          endif
          endif
        不過請特別留意,這個 if .... endif 的設定我僅在 2.x 版本上面試過,是沒有問題的,不過,已經有很多的朋友提出說,在 1.xx 版本上面執行時會有問題發生,所以如果您的 Postfix 不是 2.xx 版本,那麼底下鳥哥列出的兩個範例就參考看看即可,不可直接套用喔!
      • 關於動作有底下幾個動作:
        • REJECT :將該封信件退回給原發信者;
          WARN   :將信件收下來,但是將該封信的基本資料記錄在登錄檔內;
          DISCARD:將該封信件丟棄,並不給予原發信者回應!
        一般來說我是比較喜歡以 DISCARD 將信件直接丟棄的啦! ^_^
      此外,請特別留意,在各主要 Linux distribution 釋出的 1.xx 版本中,並無法使用 DISCARD 的規則喔!所以您只能使用 REJECT 了!底下列出鳥哥的兩個範本:
      header_checks 範本
      body_checks 範本
       
    5. 檢查規則檔案設定是否正確:

    6. 請注意!不是設定好了就 OK 了!你必須要檢查一下剛剛設定的規則是否正確?請特別留意喔!如果設定錯誤的話,很有可能會造成郵件無法順利的被你的 Mail server 接收下來的困境呢!檢查的方法很簡單的,利用 postmap 來檢查即可!如下所示:
      [root@test root]# postmap -q - regexp:/etc/postfix/header_checks < \
      > /etc/postfix/header_checks
      上面這些字眼『postmap -q - regexp:/etc/postfix/header_checks < /etc/postfix/header_checks』是同一行喔!如果螢幕上沒有出現任何的訊息,就表示至少您的規則訂定沒有疑問了!然後不需要重新 啟動 postfix ,剛剛的設定立刻生效啦!
     
    藉由一個這樣簡單的郵件過濾機制,您就可以輕易的設定個人的郵件規則,並且將他抵擋在你的 mail server 之外呢!很不錯吧!此外,你可以在接收完信件之後,如果有發現任何不滿意的郵件時,想要將他過濾掉,那麼:
     
    1. 開啟該不滿意的郵件,並且進入查看『郵件原始檔』的內容,找尋出該郵件的『關鍵字』;
    2. 查尋一下該關鍵字是在 Header 還是在 Body 呢?
    3. 將該規則加入 header_checks 或者是 body_checks ;
    4. 以 postmap 檢查一下該規則是否設定無誤,如果顯示出錯誤訊息請持續修改至無錯誤為只;
     
    這樣就 OK 啦!簡單的很~ ^_^
     

    問題信件的送達 notify_classes
     
    如果你的 postfix 發生了郵件或者其他方面的問題,應該通知誰呢?預設情況下, Postfix 會通知 postmaster 這個人的,所以,你必須要在 aliases 這個檔案裡面設定 postmaster 對應的實體用戶才行!一般來說,預設的 postfix 已經設定好 postmaster 的郵件會轉交給 root 了!所以這裡還可以比較不用理他!重要的是,我們必須要將哪些訊息送給 postmaster 呢?有底下這幾樣:
     
    • bounce:將無法寄出的信件複製一份給 postmaster 囉!不過,為了寄件者的隱私,postmaster 接到的是已經去除原始標頭(headers)的郵件;
    • 2bounce:將兩次無法寄出的郵件複製一份給 postmaster ;
    • delay :將延誤寄出的信件的標頭(headers)通知 postmaster ;
    • policy:用戶端的寄件需求被 postfix 訂定的規則所拒絕時,發送錯誤的訊息給 postmaster 觀察用!
    • protocol:當由於 client 端或者是主機端因為執行某些程式,造成不完整的執行程序時(就是有錯誤發生啦!),則通知 postmaster 一個協定錯誤的訊息(protocol errors);
    • resource:當無法寄出的郵件是由於本身 postfix 的資源(resource)所造成的,例如 queue 檔案無法寫入的錯誤訊息等,則通知 postmaster 該問題!
    • software:由於相關軟體的問題造成無法寄出信件時的通知!
     
    一般來說,預設值是以 notify_classes = resource, software 來設定的!如果我們僅只要這樣的功能,那麼就直接將『notify_classes = resource, software 』加在 main.cf 當中吧!

其他應用說明:

在其他應用方面,基本上,與 sendmail 相似的,我們都需要:
  1. 進行備份;
  2. 進行磁碟配額限制(quota);
  3. 進行登錄檔的查詢與記錄
這些動作與 sendmail 都很類似啦!所以您可以回上一章去參考一下喔!那麼萬一是無法使用 postfix 來寄信呢?你可以這樣試看看:
  1. 回歸到最原始的狀態,也就是不開放任何 SMTP, Open Relay, procmail 等等,以最原始的 main.cf 檔案進行 postfix 的運作,然後檢查一下重要的 myhostname, mydestination 以及 mynetwork 的設定,來看看 postfix 是否工作的很順暢,然後再來一個一個的啟用其他相關的控制喔!
  2. 萬一無法進行 SMTP 時,請確認您的 cyrus SASL 函式庫是第幾版的,然後在依照本文上面的設定來設定看看,應該不成問題吧!
  3. 還是無法解決您的問題時,請檢查一下您的 /var/log/maillog 這個登錄檔,問題的解決都在裡面啊!!!
另外,我們的網友 yangsman 提供了一支不錯的 script 用來啟動 pwcheck 之用,有興趣的朋友也可以參考喔! script 內容如下:
 
[root@test root]# vi /etc/rc.d/init.d/pwcheck
#!/bin/sh
#
# Written By Yangsman 2003/05/5 
#
#
# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} =  "no" ] && exit 0

[ -f /usr/sbin/pwcheck ] || exit 0

# See how we were called.
case  "$1" in
 start)
    # Start daemons.
    if [ ! -f /var/lock/subsys/pwcheck ]; then
    gprintf  "Starting pwcheck:  "
    /usr/sbin/pwcheck 2>/dev/null
    echo pwcheck
    touch /var/lock/subsys/pwcheck
    else
    $0 status
    fi
    ;;
 stop)
    # Stop daemons.
    if [ -f /var/lock/subsys/pwcheck ]; then
    gprintf  "Shutting down pwcheck:  "
    kill `ps -aux|grep -v ps |grep  "/usr/sbin/pwcheck"| \
        gawk '{print $2}'` 2>/dev/null
    echo pwcheck
    rm -f /var/lock/subsys/pwcheck
    else
    $0 status
    fi
    ;;
 restart)
    $0 stop
    $0 start
    ;;
 status)
       if [ -f /var/lock/subsys/pwcheck ]; then
         gprintf  "pwcheck (pid \c"
         gprintf  "`ps -aux|grep -v ps |grep  "/usr/sbin/pwcheck"| \
            gawk '{print $2}' 2>/dev/null`\c"
         gprintf  ")is runing ...\n"
    else
         gprintf  "pwcheck is't stopped \n"
    fi
    ;;
 *)
    gprintf  "Usage: %s {start|stop|restart|status}\n"  "$0"
    exit 1
esac

exit 0

 

參考資源


本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看)

  • 請問 Cyrus SASL 在 1.5.xx 以及 2.xx 版本中,用來作為 SMTP 的認證的機制有何不同?並請說明不同的版本與 Postfix 的搭配情況。
  • 如果要讓 Postfix 可以收發來自非本機的外部信件,您可以修改 main.cf 裡面的什麼參數?
  • 如何察看您目前的 Postfix 伺服器的所有設定參數?(使用什麼指令?)
  • 在 Postfix 當中,由於已經具有過濾郵件的機制,所以不太需要使用 procmail 了!請問,我該如何啟用信件的 Header 過濾機制?同時,如何設定規則,使得 192.168.100.100 這個主機的來信,以及只要郵件的標頭為『 Your account 』的信件就予以丟棄?

  • 前往參考用解答
修改歷史:
2003/03/07:第一次完成
2003/04/19:加入 Posfix 的郵件過濾規則訂定
2003/09/12:重新修訂一些安裝方法!
2004/01/26:訂正 Tarball 安裝 Postfix + SASL 的方法!如果您的 Postfix 安裝完後,卻無法執行 SASL 的認證功能,那麼大部分的原因應該是出現在 Tarball 安裝時沒有確定好 SASL 的函式庫的原因!如果您的 /var/log/maillog 出現這樣的字眼:『fatal: SASL per-connection security setup』那就是這個問題啦!這個時候,請重新編譯您的 postfix 即可!如何編譯?在 make 的時候,請參考 點這裡
2004/04/07:修訂了新版的 Postfix 與 Open Relay 的搭配語法,請 點這裡 參考新的資訊!同時也修改了顯示的格式,如同首頁的說明喔!
2004/06/22:如果您在使用 postfix + Cyrus-SASL 2.xx 版本時, 卻怎麼也無法進行郵件認證成功時, 建議您將三個套件移除看看. ( postfix + fetchmail + mutt ) 鳥哥最近在使用 Fedora Core I 同樣發生無法進行成功的問題, 後來將上述三個套件移除, 然後重新安裝 postfix (不安裝 fetchmail/mutt) 怪了, 竟然就認證成功了.

2003/03/07以來統計人數
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計