主機的設定
安裝完畢 postfix 之後,接著下來就是設定了!同樣的,在設定主機之前,有幾個東西是您必需先取得的喔:
具有合法的 hostname ,或者是經過授權的 DNS 主機來設定您自己的主機名稱(hostname);
您的 hostname 最好擁有一個 MX 的紀錄(record);
至少一定要瞭解到什麼是 Relay 的問題,以及規劃一下您所想要開放 relay 的網域;
你至少需要有這些資料才行吶!好了,我先假設一下我的案例好了:
我的 hostname 為 vbird.adsldns.org;
我的 hostname 還有個別名為
www.vbird.adsldns.org ,也就是說, vbird.adsldns.org 與
www.vbird.adsldns.org 都指向同一個 IP ;
我的 domain name 為 adsldns.org ;
我預計開放的 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, [url]www.[/url]$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 當中時,那麼:
任何由 vbird.org 來的信件都會被認為是『信任』的,所以 postfix 主機會自動幫忙 relay ;
由任何地方來的信件,"並且"要往 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 已經可以:
針對 mynetworks 設定的 Client 端,進行 relay 的動作;
針對信件目的為 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 呢?
當 Client 來自信任的網域,也就是 IP 符合 $mynetworks 的設定值時;
當 Client 來自信任的機器,也就是主機名稱符合 $relay_domains 的設定項目時;
當 Client 來自不信任的網域,但是去的目的地主機端符合 $relay_domains 的設定時。
當符合上面三點的任何一點時,那麼 postfix 將對該信件進行 relay 的動作喔!
收信程序:在哪些情況之下,我們的 postfix 會將該封信件收下來呢?
收件者主機名稱符合 $inet_interfaces 的設定;
收件者主機名稱符合 $mydestination 的設定;
收件者主機名稱符合 $virtual_maps 的設定。
符合上面三點的任何一項時,那麼該封信件就會被我們的 postfix 收下來!所以,如果你的 postfix 能寄不能收,或者是能收不能寄,請仔細的觀察一下上面的幾個重大的設定項目,仔細的在你的 main.cf 重新設定一下,基本上,應該就不會有太大的問題啦!