## 22.2 MTA 服務器: Postfix 基礎設定
可達成 MTA 的服務器軟件非常多,例如我們的 CentOS 預設就提供了數十年老牌子的 sendmail ([http://www.sendmail.org](http://www.sendmail.org/)) 以及近期以來很熱門的 Postfix ([http://www.postfix.org](http://www.postfix.org/))。雖然 sendmail 曾是最為廣泛使用的 mail server 軟件,但由于 sendmail 的配置文件太過于難懂,以及早期的程序漏洞問題導致的主機安全性缺失;加上 sendmail 將所有的功能都統合在 /usr/sbin/sendmail 這個程序當中,導致程序太大可能會有效能方面的疑慮等等, 所以新版的 CentOS 已經將預設的 mail server 調整為 postfix 啰!我們這里也主要介紹 postfix。當然啦,原理方面都一樣,您也可以自己玩玩其他的 mail server。
* * *
### 22.2.1 Postfix 的開發
Postfix 是由 Wietse Zweitze Venema 先生([http://www.porcupine.org/wietse](http://www.porcupine.org/wietse/))所發展的。早期的 mail server 都是使用 sendmail 架設的,還真的是『僅此一家,絕無分號』!不過,Venema 博士覺得 sendmail 雖然很好用,但是畢竟不夠安全,尤其效能上面并不十分的理想,最大的困擾是...sendmail 的配置文件 sendmail.cf 真的是太難懂了!對于網管人員來說,要設定好 sendmail.cf 這個檔案,真不是人作的工作。
為了改善這些問題, Venema 博士就在 1998 年利用他老大在 IBM 公司的第一個休假年進行一個計劃:『 設計一個可以取代 sendmail 的軟件套件,可以提供網站管理員一個更快速、 更安全、而且**完全兼容**于 sendmail 的 mail server 軟件!』這個計劃還真的成功了! 而且也成功的使用在 IBM 內部,在 IBM 內可以說是完全取代了 sendmail 這個郵件服務器!在這個計劃成功之后, Venema 博士也在 1998 年首次釋出這個自行發展的郵件服務器,并定名為 VMailer。
不過,IBM 的律師卻發現一件事,那就是 VMailer 這個名字與其他已注冊的商標很類似, 這樣可能會引起一些注冊上面的困擾。為了避免這個問題,所以 Venema 博士就將這個郵件軟件名稱改為 Postfix !『Post 有在什么什么之后』的意思,『fix 則是修訂』的意思,所以 postfix 有 『在修訂之后』的意思。
鳥哥個人認為, Venema 先生最早的構想并不是想要『創造一個全新的 Mail server 軟件,而是想要制造一個可以完全兼容于 sendmail 的軟件』,所以,Venema 先生認為他自行發展的軟件應該是『改良 sendmail 的缺失』,所以才稱為 Postfix 吧!取其意為: 『改良了 sendmail 之后的郵件服務器軟件!』
所以啦, Postfix 設計的理念上面,主要是針對『想要完全兼容于 sendmail』所設計出來的一款『內在部分完全新穎』的一個郵件服務器軟件。就是由于這個理念,因此 Postfix 改善了 sendmail 安全性上面的問題,改良了 mail server 的工作效率, 且讓配置文件內容更具親和力!因此,你可以輕易的由 sendmail 轉換到 Postfix 上面!這也是當初 Venema 博士的最初構想啊!
就是基于這個構想,所以 Postfix 在外部配置文件案的支持度,與 sendmail 幾乎沒有兩樣,同樣的支持 aliases 這個檔案,同樣的支持 ~/.forward 這個檔案,也同樣的支持 SASL 的 SMTP 郵件認證功能等等! 所以,呵呵!趕緊來學一學怎樣架設 Postfix 這個相當出色的郵件服務器吧! ^_^
* * *
### 22.2.2 所需要的軟件與軟件結構
由于 CentOS 6.x 預設就是提供 postfix 的!所以根本無須調整啥咚咚~直接來使用吧! 那么 postfix 有哪些重要的配置文件呢?他主要的配置文件都在 /etc/postfix/ 當中,詳細的檔案內容就讓我們來談談:
* /etc/postfix/main.cf
這就是主要的 postfix 配置文件啰,幾乎所有的設定參數都是在這個檔案內規范的! 這個檔案預設就是一個完整的說明檔了,你可以參考這個檔案的內容就設定好屬于你的 postfix MTA 呢! 只要修改過這個檔案,記得要重新啟動 postfix 喔!
* /etc/postfix/master.cf
主要規定了 postfix 每個程序的運作參數,也是很重要的一個配置文件。不過這個檔案預設已經很 OK 了,通常不需要更改他。
* /etc/postfix/access (利用 postmap 處理)
可以設定開放 Relay 或拒絕聯機的來源或目標地址等信息的外部配置文件,不過這個檔案要生效還需要在 /etc/postfix/main.cf 啟動這個檔案的用途才行。且設定完畢后需要以 postmap 來處理成為數據庫檔案呢!
* /etc/aliases (利用 postalias 或 newaliases 均可)
做為郵件別名的用途,也可以作為郵件群組的設定喔!
至于常見的執行檔則有底下這些:
* /usr/sbin/postconf (查閱 postfix 的設定數據)
這個指令可以列出目前你的 postfix 的詳細設定數據,包括系統默認值也會被列出來, 所以數據量相當的龐大!如果你在 main.cf 里面曾經修改過某些預設參數的話,想要僅列出非默認值的設定數據, 則可以使用『postconf -n』這個選項即可。
* /usr/sbin/postfix (主要的 daemon 指令)
此為 postfix 的主要執行檔,你可以簡單的使用他來啟動或重新讀取配置文件:
```
[root@www ~]# postfix check <==檢查 postfix 相關的檔案、權限等是否正確!
[root@www ~]# postfix start <==開始 postfix 的執行
[root@www ~]# postfix stop <==關閉 postfix
[root@www ~]# postfix flush <==強制將目前正在郵件隊列的郵件寄出!
[root@www ~]# postfix reload <==重新讀入配置文件,也就是 /etc/postfix/main.cf
```
要注意的是,每次更動過 main.cf 后,務必重新啟動 postfix,可簡單的使用『postfix reload』即可。不過老實說,鳥哥還是習慣使用 /etc/init.d/postfix reload..
* /usr/sbin/postalias
設定別名數據庫的指令,因為 MTA 讀取數據庫格式的檔案效能較佳,所以我們都會將 ASCII 格式的檔案重建為數據庫。 在 postfix 當中,這個指令主要在轉換 /etc/aliases 成為 /etc/aliases.db 啰!用法為:
```
[root@www ~]# postalias hash:/etc/aliases
# hash 為一種數據庫的格式,然后那個 /etc/aliases.db 就會自動被更新啰!
```
* /usr/sbin/postcat
主要用在檢查放在 queue (隊列) 當中的信件內容。由于隊列當中的信件內容是給 MTA 看的, 所以格式并不是一般我們人類看的懂的文字數據。所以這個時候你得要用 postcat 才可以看出該信件的內容。 在 /var/spool/postfix 內有相當多的目錄,假設內有一個文件名為 /deferred/abcfile , 那你可以利用底下的方式來查詢該檔案的內容喔:
```
[root@www ~]# postcat /var/spool/postfix/deferred/abcfile
```
* /usr/sbin/postmap
這個指令的用法與 postalias 類似,不過他主要在轉換 access 這個檔案的數據庫啦!用法為:
```
[root@www ~]# postmap hash:/etc/postfix/access
```
* /usr/sbin/postqueue
類似 mailq 的輸出結果,例如你可以輸入『postqueue -p』看看就知道了!
整個 postfix 的軟件結構大致上是這個樣子的,接下來讓我們先來簡單的處理一下 postfix 的收發信件功能吧!
* * *
### 22.2.3 一個郵件服務器的設定案例
前面談到 mail server 與 DNS 系統有很大的相關性,所以如果你想要架設一部可以連上 Internet 的郵件服務器時, 你必需要已經取得合法的 A 與 MX 主機名,而且最好反解也已經向您的 ISP 申請修改設定了, 這可是個大前提!不要忽略他!在底下的練習當中鳥哥以之前[十九章 DNS](http://linux.vbird.org/linux_server/0350dns.php) 內的設定為依據,主要的參數是這樣的:
* 郵件服務器的主要名稱為: www.centos.vbird
* 郵件服務器尚有別名為 linux.centos.vbird 及 ftp.centos.vbird 也可以收發信件;
* 此郵件服務器已有 MX 設定,直接指向自己 (www.centos.vbird)
* 這個 www.centos.vbird 有個 A 的標志指向 192.168.100.254。
在實際的郵件服務器設定當中,上述的幾個標志是很重要的,請自行參考 DNS 章節的介紹吧!底下就讓我們來實際設定 postfix 服務器啰!
* * *
### 22.2.4 讓 Postfix 可監聽 Internet 來收發信件
在預設的情況下,CentOS 6.x 的 MTA 僅針對本機進行監聽,不相信嗎?測測看:
```
[root@www ~]# netstat -tlnp | grep :25
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3167/master
```
所以如果你要對整個 Internet 開放的話,就得要努力的搞定幾個簡單的設定啰!而幾乎所有的設定你都可已經由 /etc/postfix/main.cf 這個檔案搞定!修改前你需要注意的項目有:
* 『 # 』符號是批注的意思;
* 所有設定值以類似『變量』的設定方法來處理,例如 myhostname = www.centos.vbird,請注意等號的兩邊要給予空格符喔, 且第一個字符不可以是空白,亦即『my..』要由行首寫起;
* 可以使用『 $ 』來延伸使用變量設定,例如 myorigin = $myhostname,會等于 myorigin = www.centos.vbird;
* 如果該變量支持兩個以上的數據,則使用空格符來分隔,不過建議使用逗號加空格符『, 』來處理。 例如: mydestination = $myhostname, $mydomain, linux.centos.vbird,意指 mydestination 支持三個數據內容之意。
* 可使用多行來表示同一個設定值,只要在第一行最后有逗號,且第二行開頭為空格符, 即可將數據延伸到第二行繼續書寫 (所以剛剛第二點才說,開頭不能留白!);
* **若重復設定某一項目,則以較晚出現的設定值為準!**
要讓你的 postfix 可以收發信件時,你必需要啟動的設定數據有底下這些喔:
* * *
* myhostname:設定主機名,需使用 FQDN 喔
這個項目在于設定你的主機名,且這個設定值會被后續很多其他的參數所引用,所以必須要設定正確才行。 你應該要設定成為完整的主機名。在鳥哥的這個練習當中,應該設定為: myhostname = www.centos.vbird 才對。 除了這個設定值之外,還有一個 mydomain 的設定項目,這個項目默認會取 $myhostname 第一個『.』之后的名稱。 舉例來說上頭設定完畢后,預設的 mydomain 就是 centos.vbird 啰!你也可以自行設定他。
* myorigin :發信時所顯示的『發信源主機』項目
這個項目在設定『郵件頭上面的 mail from 的那個地址』, 也就是代表本 MTA 傳出去的信件將以此設定值為準喔!如果你在本機寄信時忘記加上 Mail from 字樣的話, 那么就以此值為準了。默認這個項目以 $myhostname 為主的,例如: myorigin = $myhostname
* inet_interfaces :設定 postfix 的監聽接口 (極重要)
在預設的情況下你的 Postfix 只會監聽本機接口的 lo (127.0.0.1) 而已,如果你想要監聽整個 Internet 的話, 請開放成為對外的接口,或者是開放給全部的接口,常見的設定方法為: inet_interfaces = all 才對! 由于如果有重復設定項目時,會以最晚出現的設定值為準,所以最好只保留一組 inet_interfaces 的設定喔!
* inet_protocols :設定 postfix 的監聽 IP 協議
預設 CentOS 的 postfix 會去同時監聽 IPv4, IPv6 兩個版本的 IP,如果你的網絡環境里面僅有 IPv4 時,那可以直接指定 inet_protocols = ipv4 就會避免看到 :::1 之類的 IP 出現呦!
* mydestination :設定『能夠收信的主機名』 (極重要)
這個設定項目很重要喔!因為我們的主機有非常多的名字,那么對方填寫的 mail to 到底要寫哪個主機名字我們才能將該信件收下? 就是在這里規范的!也就是說,你的許多主機名當中,僅有寫入這個設定值的名稱才能作為 email 的主機地址。 在我們這個練習當中這部主機有三個名字,所以寫法為: mydestination = $myhostname, localhost, linux.centos.vbird, ftp.centos.vbird
如果你想要將此設定值移動到外部檔案,那可以使用類似底下的作法: mydestination = /etc/postfix/local-host-names ,然后在 local-host-names 里面將可收信的主機名寫入即可。一般來說,不建議你額外建立 local-host-names 這個檔案啦, 直接寫入 main.cf 即可說!特別留意的是,如果你的 DNS 里頭的設定有 MX 標志的話,那么請將 MX 指向的那個主機名一定要寫在這個 mydestination 內, 否則很容易出現錯誤訊息喔!一般來說,使用者最常發生錯誤的地方就在這個設定里頭呢!
* mynetworks_style :設定『信任網域』的一項指標
這個設定值在規定『與主機在同一個網域的可信任客戶端』的意思!舉例來說,鳥哥的主機 IP 是 192.168.100.254,如果我相信整個局域網絡內 (192.168.100.0/24) 的用戶的話,那我可規定此設定值為『 subnet 』吶! 不過,一般來說,因為底下的 mynetworks 會取代這個設定值, 所以不設定也沒有關系喔!如果要設定的話,最好設定成為 host 即可 (亦即僅信任這部 MTA 主機而已)。
* mynetworks :規定信任的客戶端 (極重要)
你的 MTA 能不能幫忙進行 Relay 與這個設定值最有關系!舉例來說,我要開放本機與內部網域的 IP 時,就可以這樣進行設定: mynetworks = 127.0.0.0/8, 192.168.100.0/24。如果你想要以 /etc/postfix/access 這個檔案來控制 relay 的用戶時,那鳥哥可以建議你將上述的數據改寫成這樣: mynetworks = 127.0.0.0/8, 192.168.100.0/24, hash:/etc/postfix/access 然后你只要再建立 access 之后重整成數據庫后,嘿嘿!就能夠設定 Relay 的用戶啰!
* relay_domains :規范可以幫忙 relay 的下一部 MTA 主機地址
相對于 mynetworks 是針對『信任的客戶端』而設定的,這個 relay_domains 則可以視為『針對下游 MTA 服務器』而設定的。舉例來說,如果你這部主機是 www.niki.centos.vbird 的 MX 主機時, 那你就得要在 relay_domains 設定針對整個 niki.centos.vbird 這個領域的目標信件進行轉遞才行。 在預設的情況下,這個設定值是 $mydestination 而已啦。
你必需要注意的『Postfix 預設并不會轉遞 MX 主機的信件』,意思就是說:如果你有兩部主機,一部是上游的 MTAup ,一部是下游的 MTAdown ,而 MTAdown 規范的 MX 主機是 MTAup,由 [22.1.2 談到的 DNS 的 MX 設定值與信件傳遞方向](#whatmail_dns),我們知道任何想要寄給 MTAdown 主機的信件, 都會先經過 MTAup 來轉遞才行!此時如果那部 MTAup 沒有開啟幫 MTAdown 進行 relay 的權限時, 那么任何傳給 MTAdown 的信件將『全部都被 MTAup 所退回』!從此 MTAdown 就無法收到任何信件了。
上一段的說明請您特別再想一想,因為如果你在大公司服務而且你的公司上、下游均有 mail server 時, 并且也有設定 MX 的狀況下,嘿嘿!這個 relay_domains 就很重要啦!上游的 MTA 主機必需要啟動這個設定。 一般來說除非你是某部 MTA 主機的 MX 源頭,否則這個設定項目可以忽略不設定他。 而如果你想要幫你的客戶端轉遞信件到某部特定的 MTA 主機時,這個設定項目也是可以設定的啦。 默認請您保留默認值即可。
* alias_maps :設定郵件別名
就是設定郵件別名的設定項目,只要指定到正確的檔案去即可,這個設定值可以保留默認值啊:
* * *
在了解上述的設定后,以鳥哥的范例來看的話,鳥哥有更動過或注明重要的設定值以及相關檔案是這樣處理的:
```
[root@www ~]# vim /etc/postfix/main.cf
myhostname = www.centos.vbird <==約在第 77 行
myorigin = $myhostname <==約在第 99 行
inet_interfaces = all <==約在第 114 行,117 行要批注掉
inet_protocols = ipv4 <==約在第 120 行
mydestination = $myhostname, localhost.$mydomain, localhost,
linux.centos.vbird, ftp.centos.vbird <==約在第 165,166 行
mynetworks = 127.0.0.0/8, 192.168.100.0/24, hash:/etc/postfix/access <==約在269行
relay_domains = $mydestination <==約在第 299 行
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases <==約在第 389, 400 行
# 其他的設定值就先保留默認值即可啊!
[root@www ~]# postmap hash:/etc/postfix/access
[root@www ~]# postalias hash:/etc/aliases
```
因為 main.cf 當中我們有額外加入兩個外部配置文件 (mynetworks 及 alias_maps) ,所以才會額外進行 postmap 及 postalias。然后準備來啟動啦!你可以這樣處理喔:
```
# 1\. 先檢查配置文件的語法是否有錯誤
[root@www ~]# /etc/init.d/postfix check <==沒有訊息,表示沒有問題。
# 2\. 啟動與觀察 port number
[root@www ~]# /etc/init.d/postfix restart
[root@www ~]# netstat -tlunp | grep ':25'
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 13697/master
```
很簡單吧!這樣就設定妥當了。假設你的防火墻已經處理完畢,那你的 Postfix 已經可以開放客戶端進行轉遞,并且也可以收受信件啰!不過,到底在預設的情況下我們的 postfix 可以收下哪些信件?又可以針對哪些設定值的內容進行轉遞呢?這就得要參考下一小節的說明了。
* * *
### 22.2.5 信件傳送流程與收信、relay 等重要觀念
我想,您對于 MTA 的設定與收發信件應該有一定程度的概念了,不過要妥善設定好你的 MTA 時, 尤其是想要了解到整部 MTA 是如何收、發信件時,你最好還是要知道『我這部 MTA 如何接受來源主機所傳來的信件,以及將信件轉遞到下一部主機去』的整個流程啊。 一般來說一封郵件傳送會經過許多的流程為:
1. 送信端與收信端兩部主機間會先經過一個握手 (ehlo) 的階段,此時送信端被記錄為發信來源(而不是 mail from)。 通過握手后就可以進行信件標頭 (header) 的傳送;
2. 此時收信端主機會分析標頭的信息,若信件之 Mail to: 主機名為收信端主機,且該名稱符合 <u>mydestination</u> 的設定,則該信件會開始被收下至隊列,并進一步送到 mailbox 當中; 若不符合 <u>mydestination</u> 的設定,則終止聯機且不會進行信件內容 (body) 的傳送;
3. 若 Mail to: 主機名非為收信端本身,則開始進行轉遞 (relay) 的分析。
4. 轉遞過程首先分析該信件的來源是否符合信任的客戶端 (這個客戶端為步驟 1 所記錄的發信主機喔),亦即來源是否符合 <u>mynetworks</u> 的設定值,若符合則開始收下信件至隊列中,并等待 MDA 將信件再轉遞出去,若不符 mynetworks 則繼續下一步;
5. 分析信件來源或目標是否符合 <u>relay_domains</u> 的設定,若符合則信件將被收下至隊列,并等待 MDA 將信件再轉遞出去;
6. 若這封信的標頭數據都不合乎上述的規范,則終止聯機,并不會接受信件的內容數據的。
整個流程有點像底下這樣:

圖 22.2-1、在本機 MTA 當中的信件分析過程
也就是說標頭分析通過后,你的信件內容才會開始上傳到主機的隊列,然后透過 MDA 來處理該信件的流向。 而不是將信件完整的傳送到主機后才開始分析的喔!這個得要特別注意吶!而透過上述的流程后, 在暫不考慮 access 以及 MDA 的分析機制中,一部 MTA 想要正確的收、發信件時,電子郵件必需要符合:
* 收信方面:必需符合底下需求:
1. 發信端必需符合 $inet_interfaces 的設定;
2. 信件標頭之收件者主機名必需符合 $mydestination 的設定, 或者收件主機名需要符合 $virtual_maps (與虛擬主機有關) 的設定;
* 轉遞方面 (Relay):必需符合底下需求:
1. 發信端必需符合 $inet_interfaces 的設定;
2. 發信端來源必需為 $mynetworks 的設定;發信端來源或信件標頭之收件者主機名符合 $relay_domains 之設定內容。
同樣的原理與想法你可以將他用在 sendmail 的設定當中喔! ^_^!不過很多垃圾信卻是藉由這個預設的收發管道來發送, 怎么說呢?請看底下的分析:
例題:在我的主機上面竟然發現這樣的廣告信,那就是『利用我的主機發送廣告信給我自己!』為什么這樣也可以呢?答:首先,你必需要熟悉一下上述的流程,在第 2 個步驟當中我們知道,當主機收到一封信且這封信的目標是自己, 并且也符合 mydestination 的設定時,該信件就會被收下來而不必驗證客戶端是否來自于 mynetworks 了。 所以說,任何人都可以用這個流程來寄信給你啊。不過,你的 MTA 并不是 open relay 啦,不會幫人家發送廣告信的,不用擔心。
例題:我的主機明明沒有 Open relay ,但很多其他的 MTA 管理員發信給我,說我的主機的某個賬號持續發送廣告信, 但是我的主機明明沒有那個賬號啊!這是怎么回事?答:仔細看一下流程的步驟 1 與 2 ,確認該封信能否被收下來與發信端及收信端主機名有關。 而我們知道在郵件的 header 里面還有一個 mail from 的標頭設定項目,這個標頭設定是我們在查閱郵件時看到的『回郵地址』, 這個數據是可以偽造的!而且他與收發信件的數據無關!所以,您應該要告知對方 MTA 管理員, 請他提供詳細的 log 數據,才能夠判斷該封信是否由你的主機所發送出去的。
一般來說,目前的廣告業者很多都是利用這種欺敵的方式來處理的,所以您必需要請對方提供詳細的 log file 數據以供查驗才行喔!
* * *
### 22.2.6 設定郵件主機權限與過濾機制 /etc/postfix/access
基本上,指定了 Postfix 的 mynetworks 的信任來源就能夠讓使用者 relay 了,不過如果你依照[鳥哥上述的方式 (22.2.4)](#postfix_basic_case) 來設定你的 mynetworks 的話,那么我們還可以利用 access 這個檔案來額外管理我們的信件過濾呢!基本的 access 語法為:
```
規范的范圍或規則 Postfix 的動作 (范例如下)
IP/部分IP/主機名/Email等 OK/REJECT
```
假設你想要讓 120.114.141.60 還有 .edu.tw 可以使用這部 MTA 來轉遞信件,且不許 av.com 以及 192.168.2.0/24 這個網域的使用時,可以這樣做:
```
[root@www ~]# vim /etc/postfix/access
120.114.141.60 OK
.edu.tw OK
av.com REJECT
192.168.2\. REJECT
# OK 表示可接受,而 REJECT 則表示拒絕。
[root@www ~]# postmap hash:/etc/postfix/access
[root@www ~]# ls -l /etc/postfix/access*
-rw-r--r--. 1 root root 19648 2011-08-09 14:05 /etc/postfix/access
-rw-r--r--. 1 root root 12288 2011-08-09 14:08 /etc/postfix/access.db
# 你會發現有個 access.db 的檔案才會同步更新!這才是 postfix 實際讀取的!
```
用這個檔案設定最大的好處是,你不必重新啟動 postfix,只要將數據庫建立好, 立刻就生效了!這個檔案還有其它的進階功能,你可以自行進入該檔案查閱就知道了。但是進階設定還需要 main.cf 內的其他參數有設定才行!如果只有之前 $mynetworks 的設定值時,你只能利用 access.db 的方式來開放 relay 的能力而已。不過,至少他可以讓我們的設定簡化啰! ^_^
* * *
### 22.2.7 設定郵件別名: /etc/aliases, ~/.forward
想一想,你的主機里面不是有很多系統賬號嗎?例如 named, apache, mysql..., 那么以這些賬號執行的程序若有訊息發生時,他會將該訊息以 email 的方式傳給誰?應該就是傳給 named, apache... 等賬號自己吧。 不過,你會發現其實這些系統賬號的信息都是丟給 root! 這是因為其他的系統賬號并沒有密碼可登入,自然也就無法接收任何郵件了,所以若有郵件就給系統管理員啰。不過,咱們的 MTA 怎么知道這些信件要傳給 root ?這就得要 aliases 這個郵件別名配置文件來處理啦!
* 郵件別名配置文件: /etc/aliases
在你的 /etc/aliases 檔案內,你會發現類似底下的字樣:
```
[root@www ~]# vim /etc/aliases
mailer-daemon: postmaster
postmaster: root
bin: root
daemon: root
....(底下省略)....
```
左邊是『別名』右邊是『實際存在的使用者賬號或者是 email address』! 就是透過這個設定值,所以讓我們可以將所有系統賬號所屬的信件通通丟給 root 啊!好,我們現在將他擴大化,假如你的 MTA 內有一個實際的賬號名稱為 dmtsai ,這個使用者還想要使用 dermintsai 這個名稱來收他的信件, 那么你可以這樣做:
```
[root@www ~]# vim /etc/aliases
dermintsai: dmtsai
# 左邊是你額外所設定的,右邊則是實際接收這封信的賬號!
[root@www ~]# postalias hash:/etc/aliases
[root@www ~]# ll /etc/aliases*
-rw-r--r--. 1 root root 1535 2011-08-09 14:10 /etc/aliases
-rw-r--r--. 1 root root 12288 2011-08-09 14:10 /etc/aliases.db
```
從此之后不論是 dmtsai@www.centos.vbird 還是 dermintsai@www.centos.vbird 都會將信件丟到 /var/spool/mail/dmtsai 這個信箱當中喔!很方便吧!
* /etc/aliases 實際應用一:讓一般賬號可接收 root 的信
假設你是系統管理員,而你常用的一般賬號為 dmtsai,但是系統出錯時的重要信件都是寄給 root 啊, 偏偏 root 的信件不能被直接讀取....所以說,如果能夠將『給 root 的信也轉寄一份給 dmtsai 』的話, 那就太好了!可以達到嗎?當然可以!你可以這樣做:
```
[root@www ~]# vim /etc/aliases
root: root,dmtsai <==鳥哥建議這種寫法!
# 信件會傳給 root 與 dmtsai 這兩個賬號!
root: dmtsai <==如果 dmtsai 不再是管理員怎辦?
# 從此 root 收不到信了,都由 dmtsai 來接受!
[root@www ~]# postalias hash:/etc/aliases
```
上面那兩行你可以擇一使用,看看 root 要不要保留他的信件都可以的!鳥哥建議使用第一種方式,因為這樣一來, 你的 dmtsai 可以收到 root 的信,且 root 自己也可以『備份』一份在他的信箱內,比較安全啦!
* /etc/aliases 實際應用二:發送群組寄信功能
想象一個情況,如果你是學校的老師,你雖然只帶一班導生,但是『每年都一班』時,如果有一天你要將信發給所有的學生, 那在寫 email 的標頭時,可能就會頭昏昏的了 (因為聯絡人名單太多了)!這個時候你可以這樣做: (假設主機上學生的賬號為 std001, std002... )
```
[root@www ~]# vim /etc/aliases
student2011: std001,std002,std003,std004...
[root@www ~]# postalias hash:/etc/aliases
```
如此一來只要寄信到這部主機的 student2011 這個不存在的賬號時,該封信就會被分別存到各個賬號里頭去, 管理上面是否很方便啊! ^_^!事實上,郵件別名除了填寫自己主機上面的實體用戶之外,其實你可以填寫外部主機的 email 喔! 例如你要將本機的 dermintsai 那個不存在的用戶的信件除了傳給 dmtsai 之外,還要外傳到 dmtsai@mail.niki.centos.vbird 時,可以這樣做:
```
[root@www ~]# vim /etc/aliases
dermintasi: dmtsai,dmtsai@mail.niki.centos.vbird
[root@www ~]# postalias hash:/etc/aliases
```
很方便吧!更多的功能就期待您自行發掘啰!
**Tips:** 在這本書里面,dmtai 的家目錄并非在正規的 /home 底下,而是放置于 /winhome 當中 (參考第十六章的練習),所以實際操作 mail 指令會出錯!這是因為 SELinux 的關系!請參考 /var/log/messages 底下的建議動作去處理即可!

* 個人化的郵件轉遞: ~/.forward
雖然 /etc/aliases 可以幫我們達到郵件別名設定的好處,不過 /etc/aliases 是只有 root 才能修改的檔案權限, 那我們一般使用者如果也想要進行郵件轉遞時,該如何是好?沒關系,可以透過自己家目錄下的 .forward 這個檔案喔! 舉例來說,我的 dmtsai 這個賬號所接收到的信件除了自己要保留一份之外,還要傳給本機上的 vbird 以及 dmtsai@mail.niki.centos.vbird 時,那你可以這樣做設定:
```
[dmtsai@www ~]$ vim .forward
# 注意!我現在的身份現在是 dmtsai 這個一般身份,而且在他的家目錄下!
dmtsai
vbird
dmtsai@mail.niki.centos.vbird
[dmtsai@www ~]$ chmod 644 .forward
```
記得這個檔案內容是一行一個賬號 (或 email) ,而且權限方面非常重要:
* 該檔案所在用戶家目錄權限,其 group、other 不可以有寫入權限。
* .forward 檔案權限,其 group、other 不可以有寫入權限。
如此一來這封信就會開始轉遞啰!有趣吧! ^_^
* * *
### 22.2.8 察看信件隊列信息: postqueue, mailq
說實話,設定到此為止咱們的 postfix 應該可以應付一般小型企業之 mail server 的用途了! 不過,有的時候畢竟因為網絡的問題或者是對方主機的問題,可能導致某些信件無法送出而被暫存在隊列中, 那我們如何了解隊列當中有哪些郵件呢?還有,在隊列當中等待送出的信件是如何送出的呢?
* 如果該封信在五分鐘之內無法寄出,則通常系統會發出一封『警告信』給原發信者, 告知該封郵件尚無法被寄送出去,不過,系統仍會持續的嘗試寄出該封郵件;
* 如果在四小時候仍無法寄出,系統會再次的發出警告信給原發信者;
* 如果持續進行五天都無法將信件送出,那么該封郵件就會退回給原發信者了!
當然啦,某些 MTA 已經取消了警告信的寄發,不過原則上,如果信件無法實時寄出去的話 MTA 還是會努力嘗試 5 天的,如果接下來的 5 天都無法送出時,才會將原信件退回給發信者。 一般來說,如果 MTA 設定正確且網絡沒有問題時,應該是不可能會有信件被放在隊列當中而傳不出去的, 所以如果發現有信件在隊列時,當然得要仔細的瞧一瞧啰!檢查隊列內容的方法可以使用 mailq , 也可以使用 postqueue -p 來檢查的:
```
[root@www ~]# postqueue -p
Mail queue is empty
```
若您的郵件如此顯示時,恭喜您,沒有什么問題郵件在隊列當中。不過如果你將 postfix 關閉, 并嘗試發一封信給任何人,那就可能會出現如下的畫面啦:
```
[root@www ~]# /etc/init.d/postfix stop
[root@www ~]# echo "test" | mail -s "testing queue" root
[root@www ~]# postqueue -p
postqueue: warning: Mail system is down -- accessing queue directly
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
5CFBB21DB 284 Tue Aug 9 06:21:58 root
root
-- 0 Kbytes in 1 Request.
# 第一行就說明了無法寄出的原因為 Mail system is down 啦!
# 然后才出現無法寄出的信件信息!包括來源與目標喔!
```
輸出的信息主要為:
* Queue ID:表示此封郵件隊列的代表號 (ID),這個號碼是給 MTA 看的,我們看不懂不要緊;
* Size :這封信有多大容量 (bytes) 的意思;
* Arrival Time:這封信什么時候進入隊列的,并且可能會說明無法立即傳送出去的原因;
* Sender/Recipient:送信與收信者的電子郵件啰!
事實上這封信是放置在 /var/spool/postfix 里面,由于信件內容已經編碼為給 MTA 看的數據排列, 所以你可以使用 postcat 來讀出原信件的內容喔!例如這樣做 (注意看檔名與 Queue ID 的對應!):
```
[root@www ~]# cd /var/spool/postfix/maildrop
[root@www maildrop]# postcat 5CFBB21DB <==這個檔名就是 Queue ID
*** ENVELOPE RECORDS 5CFBB21DB *** <==說明隊列的編號啊
message_arrival_time: Tue Aug 9 14:21:58 2011
named_attribute: rewrite_context=local <==分析 named (DNS) 的特性來自本機
sender_fullname: root <==發信者的大名與 email
sender: root
recipient: root <==就是收件者啰!
*** MESSAGE CONTENTS 5CFBB21DB *** <==底下則是信件的實際內容啊!
Date: Tue, 09 Aug 2011 14:21:58 +0800
To: root
Subject: testing queue
User-Agent: Heirloom mailx 12.4 7/29/08
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
test
*** HEADER EXTRACTED 5CFBB21DB ***
*** MESSAGE FILE END 5CFBB21DB ***
```
如此一來你就知道目前我們的 MTA 主機有多少未送出的信件,還有未送出信件的內容你也可以追蹤的到了! 很不錯,對吧!不過,如果你想要我們的 postfix 立刻嘗試將這些在隊列當中的信件寄出去,那又該如何是好? 你有幾個作法啦,可以重新啟動 postfix ,也可以透過 postfix 的動作來處理,例如:
```
[root@www ~]# /etc/init.d/postfix restart
[root@www ~]# postfix flush
```
鳥哥個人比較建議使用 postfix flush 啰!自行參考看看先! ^_^!接下來,讓我們先來處理一下收信的 MRA 服務器, 搞定后再來處理客戶端的用戶接口吧!
* * *
### 22.2.9 防火墻設置
因為整個 MTA 主要是透過 SMTP (port 25) 進行信件傳送的任務,因此,針對 postfix 來說,只要放行 port 25 即可呦! 修改一下 [iptables.rule](http://linux.vbird.org/linux_server/0250simple_firewall.php#local_script) 吧!
```
[root@www ~]# vim /usr/local/virus/iptables/iptables.rule
# 找到底下這一行,并且將它批注拿掉!
iptables -A INPUT -p TCP -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT
[root@www ~]# /usr/local/virus/iptables/iptables.rule
```
這樣就放行整個 Internet 對您服務器的 port 25 的讀取啰!簡單!搞定!
* * *
- 鳥哥的Linux私房菜:服務器架設篇 第三版
- 第一部份:架站前的進修專區
- 作者序
- 第一章、架設服務器前的準備工作
- 1.1 前言: Linux 有啥功能
- 1.2 基本架設服務器流程
- 1.3 自我評估是否已經具有架站的能力
- 1.4 本章習題
- 第二章、基礎網絡概念
- 2.1 網絡是個什么玩意兒
- 2.2 TCP/IP 的鏈結層相關協議
- 2.3 TCP/IP 的網絡層相關封包與數據
- 2.4 TCP/IP 的傳輸層相關封包與數據
- 2.5 連上 Internet 前的準備事項
- 2.6 重點回顧:
- 2.7 本章習題
- 2.8 參考數據與延伸閱讀
- 第三章、局域網絡架構簡介
- 3.1 局域網絡的聯機
- 3.2 本書使用的內部聯機網絡參數與通訊協議
- 第四章、連上 Internet
- 4.1 Linux 連上 Internet 前的注意事項
- 4.2 連上 Internet 的設定方法
- 4.3 無線網絡--以筆記本電腦為例
- 4.4 常見問題說明
- 4.5 重點回顧
- 4.6 本章習題
- 4.7 參考數據與延伸閱讀
- 第五章、 Linux 常用網絡指令
- 5.1 網絡參數設定使用的指令
- 5.2 網絡偵錯與觀察指令
- 5.3 遠程聯機指令與實時通訊軟件
- 5.4 文字接口網頁瀏覽
- 5.5 封包擷取功能
- 5.6 重點回顧
- 5.7 本章習題
- 5.8 參考數據與延伸閱讀
- 第六章、 Linux 網絡偵錯
- 6.1 無法聯機原因分析
- 6.2 處理流程
- 6.3 本章習題
- 6.4 參考數據與延伸閱讀
- 第二部分:主機的簡易資安防護措施
- 第七章、網絡安全與主機基本防護:限制端口, 網絡升級與 SELinux
- 7.1 網絡封包聯機進入主機的流程
- 7.2 網絡自動升級軟件
- 7.3 限制聯機埠口 (port)
- 7.4 SELinux 管理原則
- 7.5 被攻擊后的主機修復工作
- 7.6 重點回顧
- 7.7 課后練習
- 7.8 參考數據與延伸閱讀
- 第八章、路由觀念與路由器設定
- 8.1 路由
- 8.2 路由器架設
- 8.3 動態路由器架設:quagga (zebra + ripd)
- 8.4 特殊狀況:路由器兩邊界面是同一個 IP 網段: ARP Proxy
- 8.5 重點回顧
- 8.6 本章習題
- 8.7 參考數據與延伸閱讀
- 第九章、防火墻與 NAT 服務器
- 9.1 認識防火墻
- 9.2 TCP Wrappers
- 9.3 Linux 的封包過濾軟件:iptables
- 9.4 單機防火墻的一個實例
- 9.5 NAT 服務器的設定
- 9.6 重點回顧
- 9.7 本章習題
- 9.8 參考數據與延伸閱讀
- 第十章、申請合法的主機名
- 10.1 為何需要主機名
- 10.2 注冊一個合法的主機名
- 10.3 重點回顧
- 10.4 本章習題
- 10.5 參考數據與延伸閱讀
- 第三部分:局域網絡內常見的服務器架設
- 第十一章、遠程聯機服務器SSH / XDMCP / VNC / RDP
- 11.1 遠程聯機服務器
- 11.2 文字接口聯機服務器: SSH 服務器
- 11.3 最原始圖形接口: Xdmcp 服務的啟用
- 11.4 華麗的圖形接口: VNC 服務器
- 11.5 仿真的遠程桌面系統: XRDP 服務器
- 11.6 SSH 服務器的進階應用
- 11.7 重點回顧
- 11.8 本章習題
- 11.9 參考數據與延伸閱讀
- 第十二章、網絡參數控管者: DHCP 服務器
- 12.1 DHCP 運作的原理
- 12.2 DHCP 服務器端的設定
- 12.3 DHCP 客戶端的設定
- 12.4 DHCP 服務器端進階觀察與使用
- 12.5 重點回顧
- 12.6 本章習題
- 12.7 參考數據與延伸閱讀
- 第十三章、文件服務器之一:NFS 服務器
- 13.1 NFS 的由來與其功能
- 13.2 NFS Server 端的設定
- 13.3 NFS 客戶端的設定
- 13.4 案例演練
- 13.5 重點回顧
- 13.6 本章習題
- 13.7 參考數據與延伸閱讀
- 第十四章、賬號控管: NIS 服務器
- 14.1 NIS 的由來與功能
- 14.2 NIS Server 端的設定
- 14.3 NIS Client 端的設定
- 14.4 NIS 搭配 NFS 的設定在叢集計算機上的應用
- 14.5 重點回顧
- 14.6 本章習題
- 14.7 參考數據與延伸閱讀
- 第十五章、時間服務器: NTP 服務器
- 15.1 關于時區與網絡校時的通訊協議
- 15.2 NTP 服務器的安裝與設定
- 15.3 客戶端的時間更新方式
- 15.4 重點回顧
- 15.5 本章習題
- 15.6 參考數據與延伸閱讀
- 第十六章、文件服務器之二: SAMBA 服務器
- 16.1 什么是 SAMBA
- 16.2 SAMBA 服務器的基礎設定
- 16.3 Samba 客戶端軟件功能
- 16.4 以 PDC 服務器提供賬號管理
- 16.5 服務器簡單維護與管理
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考數據與延伸閱讀
- 第十七章、區網控制者: Proxy 服務器
- 17.1 什么是代理服務器 (Proxy)
- 17.2 Proxy 服務器的基礎設定
- 17.3 客戶端的使用與測試
- 17.4 服務器的其他應用設定
- 17.5 重點回顧
- 17.6 本章習題
- 17.7 參考數據與延伸閱讀
- 第十八章、網絡驅動器裝置: iSCSI 服務器
- 18.1 網絡文件系統還是網絡驅動器
- 18.2 iSCSI target 的設定
- 18.3 iSCSI initiator 的設定
- 18.4 重點回顧
- 18.5 本章習題
- 18.6 參考數據與延伸閱讀
- 第四部分:常見因特網服務器架設
- 第十九章、主機名控制者: DNS 服務器
- 19.1 什么是 DNS
- 19.2 Client 端的設定
- 19.3 DNS 服務器的軟件、種類與 cache only DNS 服務器設定
- 19.4 DNS 服務器的詳細設定
- 19.5 協同工作的 DNS: Slave DNS 及子域授權設定
- 19.6 DNS 服務器的進階設定
- 19.7 重點回顧
- 19.8 本章習題
- 19.9 參考數據與延伸閱讀
- 第二十章、WWW 伺服器
- 20.1 WWW 的簡史、資源以及伺服器軟體
- 20.2 WWW (LAMP) 伺服器基本設定
- 20.3 Apache 伺服器的進階設定
- 20.4 登錄檔分析以及 PHP 強化模組
- 20.5 建立連線加密網站 (https) 及防砍站腳本
- 20.6 重點回顧
- 20.7 本章習題
- 20.8 參考資料與延伸閱讀
- 第二十一章、文件服務器之三: FTP 服務器
- 21.1 FTP 的數據鏈路原理
- 21.2 vsftpd 服務器基礎設定
- 21.3 客戶端的圖形接口 FTP 聯機軟件
- 21.4 讓 vsftpd 增加 SSL 的加密功能
- 21.5 重點回顧
- 21.6 本章習題
- 21.7 參考數據與延伸閱讀
- 第二十二章、郵件服務器: Postfix
- 22.1 郵件服務器的功能與運作原理
- 22.2 MTA 服務器: Postfix 基礎設定
- 22.3 MRA 服務器: dovecot 設定
- 22.4 MUA 軟件:客戶端的收發信軟件
- 22.5 郵件服務器的進階設定
- 22.6 重點回顧
- 22.7 本章習題
- 22.8 參考數據與延伸閱讀