## 22.5 郵件服務器的進階設定
時至今日,郵件攻擊主要的問題已經不是病毒與木馬了,大多數的垃圾郵件多是釣魚以及色情廣告。 網絡釣魚的問題在于用戶的莫名好奇心以及較糟糕的操作習慣,這部份很難處理。色情廣告則是防不勝防,你想出一個過濾機制, 他就使用另一個機制來丟你!用嚴格的過濾機制嗎?又可能將正常的信件抵擋掉,真是要命啊!所以,還是請用戶直接刪除比較好。 因此,在這一個小節當中,關于收信的過濾機制方面,鳥哥移除了前一版介紹的病毒掃瞄以及自動學習廣告機制了。 如果你還是有相關的需要,可能得要自行查查相關的官方網站啰!不好意思啦!
另外,底下主要針對 postfix 的郵件收下過濾處理,以及重新發送的 Relay 過程進行介紹。這兩個過程在 postfix 的設定中,主要有幾個重要的項目管理:
* smtpd_recipient_restrictions:recipient 是收件者的意思,這個設定值主要在管理『由本機所收下的信件』的功能,因此大部分的設定都是在進行郵件過濾以及是否為可信任郵件的意思。 來源可以是 MTA 或 MUA 的意思;
* smtpd_client_restrictions:client 是客戶端的意思,因此主要在管理客戶端的來源是否可信任。 可以將非正規的 mail server 來信拒絕掉的!來源當然就是 MUA 啰;
* smtpd_sender_restrictions:sender 是寄件人的意思,可以針對信件來源 (對方郵件服務器) 來進行分析過濾的動作。來源理論上就是 MTA 啦!
* * *
### 22.5.1 郵件過濾一:用 postgrey 進行非正規 mail server 的垃圾信抵擋
早期的廣告信很多都是藉由僵尸計算機 (已經被當作跳板但管理員卻沒有發現或沒有處理的主機) 來發送的, 這些僵尸計算機所發送的信件有個很明顯的特色,就是『他只會嘗試傳送該封電子郵件一次, 不論有無成功,該封信就算發出去了,故該信件將被移出隊列中。』 不過,合法的 mail server 運作流程就如 [22.2.8](#postfix_mailq) 分析的一般,在郵件無法順利寄出時該郵件會暫時放置到隊列中一段時間, 并一直嘗試將信件寄出的動作,預設直到五天后若還是無法寄出才會將信件退回。
根據這個合法與非法的郵件服務器運作流程而發展出一套所謂的曙光 (postgrey) 軟件, 你可以參考底下的幾個說明來了解這個軟件:
* [http://isg.ee.ethz.ch/tools/postgrey/](http://isg.ee.ethz.ch/tools/postgrey/)
* [http://www.postfix.org/SMTPD_POLICY_README.html](http://www.postfix.org/SMTPD_POLICY_README.html)
基本上 postgrey 主要的功能是在記錄發信來源而已,若發信來源同一封信第一次寄來時, postgrey 默認會抵擋他,并且將來源地址記錄起來,在約 5 分鐘后,若該信件又傳來一次時, 則該信件會被收下來。如此則可以杜絕非發郵件服務器單次發送的問題喔! ^_^! 但對于你確定合法的主機則可以開放所謂的『白名單 (whitelist) 』來優先通過而不抵擋。 所以說,他主要是這樣進行的:(參考[http://projects.puremagic.com/greylisting/whitepaper.html](http://projects.puremagic.com/greylisting/whitepaper.html))
1. 確認發信來源是否在白名單中,若是則予以通過;
2. 確認收信者是否在白名單中,若是則予以通過;
3. 確定這封信是否已經被記錄起來呢?放行的依據是:
* 若無此信件的記錄,則將發信地址記錄起來,并將信件退回;
* 若有此信件的記錄,但是記錄的時間尚未超過指定的時間 (預設 5 分鐘),則依舊退回信件;
* 若有信件的記錄,且記錄時間已超過指定的時間,則予以通過;
整個過程簡單的來說就是這樣而已。不過為了要快速的達成 postgrey 的『記錄』能力,所以數據庫系統又是不可避免的東西。 且 postgrey 是由 perl 寫成的,你可能也需要加入很多相依的 perl 模塊才行。總的來說,你需要的軟件至少要有:
* BerkeleyDB: 包括 db4, db4-utils, db4-devel 等軟件:
* Perl: 使用 yum install perl 即可;
* Perl 模塊: perl-Net-DNS 是 CentOS 本身有提供的,其他沒有提供的可以到 [http://rpmfind.net/](http://rpmfind.net/)去搜尋下載。
* 安裝流程:
因為 CentOS 官方已經提供了一個連結可以找到所有的在線 yum 安裝方式,你可以參考:
* 官網介紹:[http://wiki.centos.org/HowTos/postgrey](http://wiki.centos.org/HowTos/postgrey)
* 在線安裝軟件:[http://wiki.centos.org/AdditionalResources/Repositories/RPMForge](http://wiki.centos.org/AdditionalResources/Repositories/RPMForge)
鳥哥假設你已經下載了 http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm 這個軟件且放置到 /root 底下,然后這樣做:
```
[root@www ~]# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
[root@www ~]# rpm -ivh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
[root@www ~]# yum install postgrey
```
上述的動作在進行數字簽名檔案的安裝、yum 配置文件的建置,以及最終將 postgrey 透過網絡安裝起來而已! 整個流程簡單到不行呢!最重要的是,找到適合你的 yum 配置文件軟件來安裝就是了!
* 啟動與設定方式:
因為 postgrey 是額外的一個軟件,因此我們還是得要將它視為一個服務來啟動,同時 postgrey 是本機的 socket 服務而非網絡服務,他只提供給本機的 postfix 來作為一個外掛,因此觀察的方式并不是觀察 TCP/UDP 之類的聯機喔!底下讓我們來瞧瞧啟動與觀察的過程吧!
```
[root@www ~]# /etc/init.d/postgrey start
[root@www ~]# chkconfig postgrey on
[root@www ~]# netstat -anlp | grep postgrey
Active UNIX domain sockets (servers and established)
Proto RefCnt Type State PID/Program Path
unix 2 STREAM LISTENING 17823/socket /var/spool/postfix/postgrey/socket
```
上表中最重要的就是那個輸出的 path 項目啦!/var/spool/postfix/postgrey/socket 是用來做為程序之間的數據交換, 這也是我們的 postfix 要將信件交給 postgrey 處理的一個相當重要的接口!有了這個數據后,接下來我們才能夠開始修改 postfix 的 main.cf 啰!
```
[root@www ~]# vim /etc/postfix/main.cf
# 1\. 更改 postfix 的 main.cf 主配置文件資料:
# 一般來說,smtpd_recipient_restrictions 得要手動加入才會更動默認值:
smtpd_recipient_restrictions =
permit_mynetworks, <==默認值,允許來自 mynetworks 設定值的來源
reject_unknown_sender_domain, <==拒絕不明的來源網域 (限制來源 MTA )
reject_unknown_recipient_domain, <==拒絕不明的收件者 (限制目標 MTA)
reject_unauth_destination, <==默認值,拒絕不信任的目標
**check_policy_service unix:/var/spool/postfix/postgrey/socket**
# 重點是最后面那一行!就是指定使用 unix socket 來連接到 postgrey 之意。
# 后續我們還有一些廣告信的抵擋機制,特別建議您將這個 postgrey 的設定值寫在最后,
# 因為他可以算是我們最后一個檢驗的機制喔!
# 2\. 更改 postgrey 的抵擋秒數,建議將原本的 300 秒 (五分鐘) 改為 60 秒較佳:
[root@www ~]# vim /etc/sysconfig/postgrey <==預設不存在,請手動建立
OPTIONS="--unix=/var/spool/postfix/postgrey/socket --delay=60"
# 重點是 --delay 要抵擋幾秒鐘,默認值為 300 秒,我們這里改為 60 秒等待。
[root@www ~]# /etc/init.d/postfix restart
[root@www ~]# /etc/init.d/postgrey restart
```
由于過往的經驗指出,等待 5 分鐘有時候會讓某些正常的 mail server 也會被拒絕好久,對于緊急的信件來說,這樣有點不妥。 因此,CentOS 官網也建議將這個數值改小一點,例如 60 秒即可。反正,不正常的信件第一次寄就會被拒絕, 等多久似乎也不是這么重要了。然后,在 postfix 的設定中,默認值僅有允許本機設定 (permit_mynetworks) 以及拒絕非信任的目標 (reject_unauth_destination),鳥哥根據經驗,先加入拒絕發件人 (MTA) 的不明網域以及拒絕收件者的不明網域的信件了, 這樣也能夠減少一堆不明的廣告信件。最終才加入 postgrey 的分析。
要注意的是,smtpd_recipient_restrictions 里面的設定是有順序之分的!以上面的流程來說, 只要來自信任用戶,該封信件就會被收下會轉遞,然后不明的來源與目標會被拒絕,不受信任的目標也會被拒絕, 這些流程完畢之后,才開始正常信件的 postgrey 機制處理!這樣其實已經可以克服一堆廣告信了! 接下來,讓我們測試看看 postgrey 有沒有正常運作!請在外部寄一封信到本機來吧!例如寄給 dmtsai@www.centos.vbird, 然后查一下 /var/log/maillog 的內容看看:
```
Aug 10 02:15:44 www postfix/smtpd[18041]: NOQUEUE: reject: RCPT from vbirdwin7[192.168.100.30]: 450 4.2.0 <dmtsai@www.centos.vbird>: Recipient address rejected: Greylisted, see http://postgrey.schweikert.ch/help/www.centos.vbird.html; from=<dmtsai@www.centos.vbird> to=<dmtsai@www.centos.vbird> proto=ESMTP helo=<[192.168.100.30]>
```
鳥哥事先取消 permit_mynetworks 之后才開始測試,測試完畢后又將 permit_mynetworks 加回來才好!這樣才能看到上述的資料。 這表示 postgrey 已經開始順利運作了!并且來源主機的相關記錄也已經記載在 /var/spool/postfix/postgrey/ 目錄下啰!如此一來您的 postfix 將可以透過 postgrey 來擋掉一些莫名其妙的廣告信啰!
* 設定不受管制的白名單:
不過 postgrey 也是有缺點的,怎么說呢?因為 postgrey 預設會先將信件退回去,所以你的信件就可能會發生延遲的問題, 延遲的時間可能是數分鐘到數小時,端看你的 MTA 設定而定。如果你想要讓『某些信任的郵件主機不需要經過 postgrey 的抵擋機制』時,就得要開放白名單啰!
白名單的開啟也很簡單啊,直接編寫 /etc/postfix/postgrey_whitelist_clients 這個檔案即可。 假設你要讓鳥哥的郵件服務器可以自由的將信寄到你的 MTA 的話,那么你可以在這個檔案內加入這一行:
```
[root@www ~]# vim /etc/postfix/postgrey_whitelist_clients
mail.vbird.idv.tw
www.centos.vbird
# 將主機名寫進去吧!
[root@www ~]# /etc/init.d/postgrey restart
```
如果你還有更多信任的 MTA 服務器的話,將他寫入這個檔案當中!那他就可以略過 postgrey 的分析啰! 更進階的用法就得要靠您自己去發掘啰! ^_^
* * *
### 22.5.2 郵件過濾二:關于黑名單的抵擋機制
還記得 22.1.5 講到的 [Open Relay](#whatmail_relay) 的問題吧?你的 MTA 可千萬不能成為 Open Relay 的狀況,否則對你的網絡與『信用』影響很大喔!一般來說,只要是 Open Relay 的郵件 MTA 都會被列入黑名單當中, 例如臺灣地區的學術網絡黑名單以及因特網社會上提供的黑名單數據庫:
* [http://rs.edu.tw/tanet/spam.html](http://rs.edu.tw/tanet/spam.html)
* [http://cbl.abuseat.org/](http://cbl.abuseat.org/)
既然黑名單數據庫里面的 mail server 本身就是有問題的郵件主機,那么當黑名單里面的主機想要跟我的 mail server 聯機時,我當然可以『合理的懷疑該信件是有問題的!』您說是吧! 所以來自黑名單或者是要送至黑名單的信件最好是不要接受啦!
您當然可以自行前往該網站將有問題的主機列表給他加入自己的郵件主機抵擋機制當中, 不過就是不太人性化!既然因特網社會已經提供了黑名單數據庫了,我們就可以利用這個數據庫來抵擋嘛! 在決定是否進行 Relay 之前,先要求我們的 postfix 前往追蹤黑名單的數據庫, 若目標的 IP 或主機名是黑名單的一員,則我們就將該信件拒絕啰!
Postfix 設定黑名單檢驗真的很簡單,你只要這樣做即可:
```
[root@www ~]# vim /etc/postfix/main.cf
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
reject_unauth_destination,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client cblless.anti-spam.org.cn,
reject_rbl_client sbl-xbl.spamhaus.org,
check_policy_service unix:/var/spool/postfix/postgrey/socket
# 請注意整個設定值的順序才好!在 postgrey 之前先檢查是否為黑名單!
smtpd_client_restrictions =
check_client_access hash:/etc/postfix/access,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client cblless.anti-spam.org.cn,
reject_rbl_client sbl-xbl.spamhaus.org
# 這個設定項目則是與客戶端有關的設定!拒絕客戶端本身就是黑名單的一員!
smtpd_sender_restrictions = reject_non_fqdn_sender,
reject_unknown_sender_domain
# 此項目則在抵擋不明的送件者主機網域啰!與 DNS 有關系的哪!
[root@www ~]# /etc/init.d/postfix restart
```
上表當中的特殊字體部分『reject_rbl_client』是 postfix 內的一個設定項目,后面可以接因特網上提供的黑名單! 您得要注意的是,這個黑名單數據庫可能會持續的變動,請您先以 dig 的方式檢查每個數據庫是否真的存在, 如果存在才加以設定在您的主機上頭啊!(因為因特網上頭很多文獻所提供的黑名單數據庫似乎已經不再持續服務的樣子!)
* 檢查你的郵件服務器是否在黑名單當中?
既然黑名單數據庫所記錄的是不受歡迎的來源與目標 MTA ,那么您的 MTA 當然最好不要在該數據庫中嘛! 同時這些數據庫通常也都有提供檢測的功能,所以你也可以用該功能來檢查你的主機是否『記錄有案』呢? 你可以這樣處理的:
1. 是否已在黑名單數據庫中:
確認的方法很簡單,直接到『[http://cbl.abuseat.org/lookup.cgi](http://cbl.abuseat.org/lookup.cgi) 』輸入您的主機名或者是 IP ,就可以檢查是否已經在黑名單當中;
2. 是否具有 Open Relay:
如果要測試你的主機有沒有 Open Relay ,直接到『[http://rs.edu.tw/tanet/spam.html](http://rs.edu.tw/tanet/spam.html) 』這個網頁, 在這個網頁的最下方可以輸入你的 IP 來檢查,注意喔,不要使用別人的 email IP 吶! 此時該主機會發出一封 mail 的測試信看看你的 mail server 會不會主動的代轉, 然后將結果回報給您。要注意的是,回傳的網頁可能有編碼的問題,如果出現亂碼時,請調整為 big5 編碼即可。
3. 如何移除:
如果被檢查出,您的主機已經在黑名單當中,那么請立刻將 Open Relay 的功能關閉,改善你的 Mail Server 之后,你可能還要到各個主要的 Open Relay 網站進行移除的工作。如果是學術網絡的話, 請與您單位的管理員聯絡。至于一般常見的黑名單數據庫則通常會主動的幫您移除,只不過需要一些時間的測試就是了。
總之您必須要確定你不在黑名單當中,且最好將黑名單的來源給拒絕掉!搞定! ^_^
* * *
### 22.5.3 郵件過濾三:基礎的郵件過濾機制
在整封信的傳送流程當中,客戶端若通過主機的重重限制后,最終應該可以到達郵件隊列當中。 而由隊列當中要送出去或者是直接送到 mailbox 就得要透過 MDA 的處理。MDA 可以加掛很多機制呢! 尤其是他可以過濾某些特殊字眼的廣告信件或病毒信件呢! MDA 可以透過分析整封信件的內容 (包括標頭以及內文) 來擷取有問題的關鍵詞,然后決定這封信的『命運』說!
咱們的 postfix 已經有內建可以分析標頭或者是內文的過濾機制了,那就是 /etc/postfix/ 目錄下的 header_checks 以及 body_checks 這兩個檔案啊!在預設的情況下這兩個檔案不會被 postfix 使用, 你必需要用底下的設定來啟用他:
```
[root@www ~]# vim /etc/postfix/main.cf
header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
# 那個 regexp 代表的是『使用正規表示法』的意思啦!
[root@www ~]# touch /etc/postfix/header_checks
[root@www ~]# touch /etc/postfix/body_checks
[root@www ~]# /etc/init.d/postfix restart
```
接下來你必需要自行處理 header_checks 以及 body_checks 的規則設定,在設定前請您確認『 你對于[正規表示法](http://linux.vbird.org/linux_basic/0330regularex.php)是熟悉的 』才行!因為很多信息都必需要透過正規表示法來處理啦!然后開始設定的依據是:
* 只要是 # 代表該行為批注,系統或直接略過;
* 在默認的規則當中,大小寫是視為相同的;
* 規則的設定方法為:
> ```
> /規則/ 動作 顯示在登錄文件里面的訊息
> ```
請注意,要使用兩個斜線『 / 』將規則包起來喔!舉個例子來說明:例如我想要 (1)抵擋掉標題為 A funny game 的信件,(2)并且在登錄文件里面顯示 drop header deny,則可以在 header_chekcs 檔案中可以這樣寫:
> ```
> /^Subject:.*A funny game/ DISCARD drop header deny
> ```
* 關于動作有底下幾個動作:
* REJECT :將該封信件退回給原發信者;
* WARN :將信件收下來,但是將該封信的基本數據記錄在登錄文件內;
* DISCARD:將該封信件丟棄,并不給予原發信者回應!
鳥哥自己有作一些規則的比對,只不過.....效能不好!如果您有興趣的話,可以自行下載來看看, 不過,使用的后果請自行評估!因為每個人的環境都不一樣嘛!
* header: [http://linux.vbird.org/linux_server/0380mail/header_checks](http://linux.vbird.org/linux_server/0380mail/header_checks)
* body: [http://linux.vbird.org/linux_server/0380mail/body_checks](http://linux.vbird.org/linux_server/0380mail/body_checks)
記得,如果你自行修改過這兩個檔案后,務必要檢查一下語法才行!
```
[root@www ~]# postmap -q - regexp:/etc/postfix/body_checks \
> < /etc/postfix/body_checks
```
如果沒有出現任何錯誤,那就表示您的設定值應該沒有問題啦!另外,你也可以使用 procmail 這個抵擋的小程序來處理。 不過,鳥哥覺得 procmail 在大型郵件主機當中,分析的過程太過于繁雜,會消耗很多 CPU 資源,因此后來都沒有使用這玩意兒了。
* * *
### 22.5.4 非信任來源的 Relay:開放 SMTP 身份認證
在[圖 22.1-1](#fig22.1-1) 的流程當中,由 MUA 透過 MTA 來寄發信件時 (具有 Relay 的動作時),理論上 MTA 必需要開放信任用戶來源才行,這就是為啥我們必需要在 main.cf 里頭設定 smtpd_recipient_restrictions 那個設定項目的原因了 (mynetworks)!不過人總有不方便的時候,舉例來說,如果你的客戶端使用的是撥接制的 ADSL 所以每次取得的 IP 都非固定,那如何讓你的用戶使用你的 MTA ?很麻煩是吧?這個時候 SMTP 認證或許有點幫助。
什么是 SMTP 呢?就是讓你在想要使用 MTA 的 port 25 (SMTP 協議) 時,得要輸入賬號密碼才能夠使用的意思!既然有了這個認證的功能,于是乎,你就可以不用設定 MTA 的信任用戶項目!舉例來說,在本章提到的環境下,你可以不用設定 mynetworks 這個設定值啊!啟動 SMTP 認證,讓你的用戶需要輸入賬密才能 Relay 啰!那如何讓 SMTP 支持身份認證?咱們的 CentOS 已經有提供內建的認證模塊,那就是 Cyrus SASL 這個軟件的幫忙啦!
Cyrus SASL ([http://cyrusimap.web.cmu.edu/](http://cyrusimap.web.cmu.edu/)) 是 Cyrus Simple Authentication and Security Layer 的縮寫,他是一個輔助的軟件。在 SMTP 認證方面,Cyrus 主要提供了 saslauthd 這個服務來進行賬號密碼的比對動作!也就是說:當有任何人想要進行郵件轉遞功能時, Postfix 會聯絡 saslauthd 請其代為檢查賬號密碼,若比對通過則允許客戶端開始轉寄信件。
好了,如果你想要使用最簡單的方式,就是直接透過 Linux 自己的帳密來進行 SMTP 認證功能,而不使用其他如 SQL 數據庫的身份認證時,在 CentOS 當中你應該要這樣做:
1. 安裝 cyrus-sasl, cyrus-sasl-plain, cyrus-sasl-md5 等軟件;
2. 啟動 saslauthd 這個服務;
3. 設定 main.cf 讓 postfix 可以與 saslauthd 聯系;
4. 客戶端必需要在寄信時設定『郵件主機認證』功能。
如此一來客戶端才能夠啟動 SMTP AUTH 喔!關于軟件安裝方面,請使用 yum 直接安裝吧!不再多啰唆!底下我們由啟動 saslauthd 這個服務開始談起吧!
* 啟動 saslauthd 服務:進行 SMTP 明碼身份驗證功能
saslauthd 是 Cyrus-SASL 提供的一個賬號密碼管理機制,他能夠進行挺多的數據庫驗證功能, 不過這里我們僅使用最單純簡單的明碼驗證 (PLAIN)!如果我們想要直接使用 Linux 系統上面的用戶信息, 也就是 /etc/passwd, /etc/shadow 所記載的賬號密碼相關信息時,可以使用 saslauthd 提供的『 shadow 』這個機制, 當然也能使用『 pam 』啦!更多的 saslauthd 聯機至 MTA 的機制請『 man saslauthd 』來查閱吧。 由于我們的帳密可能來自網絡其他類似 NIS 服務器,因此這里建議可以使用 pam 模塊喔!
saslauthd 的啟動真是好簡單,首先你必需要選擇密碼管理機制,這個可以使用底下的方式處理:
```
# 1\. 先了解你的 saslauthd 有支持哪些密碼管理機制:
[root@www ~]# saslauthd -v
saslauthd 2.1.23
authentication mechanisms: getpwent kerberos5 <u>pam</u> rimap <u>shadow</u> ldap
# 上列的特殊字體部分就是有支持的!我們要直接用 Linux 本機的用戶信息,
# 所以用 pam 即可,當然也能夠使用 shadow 啦。
# 2\. 在 saslauthd 配置文件中,選定 pam 的驗證機制:
[root@www ~]# vim /etc/sysconfig/saslauthd
MECH=pam <==其實這也是默認值啊!
# 這也是默認值,有的朋友喜歡單純的 shadow 機制,也可以啦!
# 3\. 那就啟動吧!
[root@www ~]# /etc/init.d/saslauthd start
[root@www ~]# chkconfig saslauthd on
```
之后我們必需要告知 Cyrus 這個咚咚使用來提供 SMTP 服務的程序為 saslauthd 才行,設定的方法很簡單:
```
[root@www ~]# vim /etc/sasl2/smtpd.conf
log_level: 3 <==登錄文件信息等級的設定,設定 3 即可
pwcheck_method: saslauthd <==就是選擇什么服務來負責密碼的比對啊
mech_list: plain login <==那么支持的機制有哪些之意!
```
我們可以使用 mech_list 列出特定支持的機制。而且 saslauthd 是個很簡單的賬號密碼管理服務,你幾乎不需要進行什么額外的設定,直接啟動他就生效了!真是好方便! ^_^
* 更改 main.cf 的設定項目:讓 postfix 支持 SMTP 身份驗證
那我們的 postfix 該如何處理呢?其實設定真的很簡單,只要這樣做就好了:
```
[root@www ~]# vim /etc/postfix/main.cf
# 在本檔案最后面增加這些與 SASL 有關的設定資料:
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
# 然后找到跟 relay 有關的設定項目,增加一段允許 SMTP 認證的字樣:
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated, <==重點在這里!注意順序!
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
reject_unauth_destination,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client cblless.anti-spam.org.cn,
reject_rbl_client sbl-xbl.spamhaus.org,
check_policy_service unix:/var/spool/postfix/postgrey/socket
[root@www ~]# /etc/init.d/postfix restart
```
上面關于 SASL 的各個項目的意義是這樣的:
* smtpd_sasl_auth_enable
就是設定是否要啟動 sasl 認證的意思,如果設定啟動后 postfix 會主動去加載 cyrus sasl 的函式庫, 而該函式庫會依據 /etc/sasl2/smtpd.conf 的設定來連結到正確的管理賬號與密碼的服務。
* smtpd_sasl_security_options
由于不想要讓匿名者可以登入使用 SMTP 的 Relay 功能,于是這個項目中只要設定 noanonymous 即可。
* broken_sasl_auth_clients
這個是針對早期非正規 MUA 的設定項目,因為早期軟件開發商在開發 MUA 時沒有參考通訊協議標準, 所以造成在 SMTP 認證時可能會發生的一些困擾。這些有問題的 MUA 例如 MS 的 outlook express 第四版就是這樣! 后來的版本應該沒有這個問題。所以這個設定值你也可以不要設定!
* smtpd_recipient_restrictions
最重要的就是這里啦!我們的 sasl 認證可以放在第二行,在局域網絡這個可信任區域的后面加以認證。 上表的設定意義是:局域網絡內的 MUA 不需要認證也能夠進行 relay ,而非區網內的其他來源才需要進行 SMTP 認證之意。
設定完畢也重新啟動 postfix 之后,我們先來測試看看是否真的提供認證了?
```
[root@www ~]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 www.centos.vbird ESMTP Postfix
ehlo localhost
250-www.centos.vbird
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN <==你得要看到這兩行才行呦!
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
```
* 在客戶端啟動支持 SMTP 身份驗證的功能:以 thunderbird 設定為例
既然已經在 MTA 設定了 SMTP 身份驗證,那么我們 MUA 當然要傳送賬號、密碼給 MTA 才能通過 SMTP 的驗證嘛! 所以,在 MUA 上面就得要加上一些額外的設定才行。我們依舊以 Thunderbird 來作為介紹,請打開 thunderbird,選擇『工具』-->『賬號設定』后會出現如下畫面:

圖 22.5-1、在 Thunderbird 軟件中設定支持 SMTP 驗證的方式
請依據上圖的箭頭號碼來指定,先選擇 (1)SMTP 寄件服務器;,然后選擇所需要的寄件 SMTP 服務器后,點選 (3)編輯, 就會出現上圖中的窗口項目。選擇 (4)不安全傳輸的密碼后,在 (5)填入你要使用的賬號即可。 如果要測試的話,記得此客戶端不要在局域網絡內,否則將不會經過認證的階段,因為我們的設定以信任網域為優先嘛!
如果一切都順利的話,那么當客戶端以 SMTP 來驗證時,你的登錄檔應該會出現類似底下的訊息才是:
```
[root@www ~]# tail -n 100 /var/log/maillog | grep PLAIN
Aug 10 02:37:37 www postfix/smtpd[18655]: 01CD43712: client=vbirdwin7
[192.168.100.30], sasl_method=PLAIN, sasl_username=dmtsai
```
* * *
### 22.5.5 非固定 IP 郵件服務器的春天: relayhost
我們上面提到,如果你要架設一部合法的 MTA 最好還是得要申請固定的 IP 以及正確對應的反解比較恰當。 但如果你一定要用浮動 IP 來架設你的 MTA 的話,也不是不可以啦,尤其今年 (2011) 光纖到府已經可達 50M/5Mbps 的下載/上傳速度了!你當然可以用家庭網絡來架站啊!只不過你就得要透過上層 ISP 所提供的 relay 權限啰!這是怎么回事啊?讓我們來看看一個實際的案例:

圖 22.5-2、Relayhost:利用 ISP 的 MTA 進行郵件轉遞
當你的 MTA 要傳信件給目標 MTA 時,如果直接傳給目標 MTA,由于你的 IP 可能是非固定的,因此對方 MTA 恐怕會把你當成是垃圾來源!那如果我們可以透過 ISP 進行轉遞呢?從上面的圖示來看,當你要傳給目標 MTA 時: (1)先將信件交給妳的 ISP,因為你是 ISP 的客戶,通常來信都會被 ISP 接受,因此這個時候這封信就會被你的 ISP 給 relay 出去; (2)被 ISP 所 relay 的信件到目標 MTA 時,對方會判斷是來自那部 ISP 的 MTA,當然是合法的 mail server, 所以該封信件就毫無疑問的被收下啰! ^_^
不過想要以此架構來架設你的 MTA 仍有許多需要注意的地方:
* 你還是得要有一個合法的主機名,若要省錢,可以使用 DDNS 來處理;
* 你上層的 ISP 所提供的 MTA 必需要有提供你所在 IP 的 relay 權限;
* 你不能使用自定義的內部 DNS 架構了,因為所有 relay 的信都會被送至 ISP 的 MTA
尤其是最后一點,因為所有外送的信件全部都會被送到 ISP 處,所以像我們之前自己玩的 centos.vbird 這種非合法的領域數據就沒用了!為什么呢?你想想看,如果你要將信件送給 www.centos.vbird, 但由于上述 relayhost 的功能,所以這封信會被傳到 ISP 的 MTA 來處理,但 ISP 的 MTA 會不會認識你的 centos.vbird?這樣說,可以理解了吧?
說是挺難的,做起來卻很簡單,只要在 main.cf 里面加設一段數據即可。 假設你的環境是臺灣地區的 hinet 所提供的用戶,而 hinet 提供的郵件主機為 ms1.hinet.net , 則你可以直接這樣設定:
```
[root@www ~]# vim /etc/postfix/main.cf
# 加入底下這一行就對啦!注意那個中括號!
relayhost = [ms1.hinet.net]
[root@www ~]# /etc/init.d/postfix restart
```
之后你只要嘗試寄一封信出去看看,就會了解這封信是如何寄送的了。看一下登錄檔的內容會像這樣:
```
[root@www ~]# tail -n 20 /var/log/maillog
Aug 10 02:41:01 www postfix/smtp[18775]: AFCA53713: to=<qdd@mail.ksu.edu.tw>,
relay=ms1.hinet.net[168.95.4.10]:25, delay=0.34, delays=0.19/0.09/0.03/0.03,
dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as F0528233811)
```
是吧!經由上層 ISP 來轉寄啦!如此一來,你的 MTA 感覺上就似乎是部合法的 MTA 啰! 不過,可別利用這個權限來濫發廣告信啊!因為您所透過的那個 ISP 郵件主機可是有記錄你的 IP 來源, 如果你亂來的話,后果可是不堪設想喔!切記切記!
* * *
### 22.5.6 其他設定小技巧
除了之前談到的幾個主要的設定之外, postfix 還有提供一些不錯的設定要給大家使用的喔! 我們可以一個一個來來看看:
* 單封信件與單個郵件信箱的大小限制
在預設的情況下,postfix 可接受的單封信件最大容量為 10MBytes ,不過這個數值我們是可以更改的, 動作很簡單:
```
[root@www ~]# vim /etc/postfix/main.cf
message_size_limit = 40000000
[root@www ~]# postfix reload
```
上面的單位是 bytes,所以我將單封信件可接受大小改為 40MByte 的意思啦!請按照你的環境來規定這個數值。 而從前我們要管制 /var/spool/mail/account 大多是使用文件系統內的 quota 來達成, 現在的 postfix 不需要啦!可以這樣做:
```
[root@www ~]# vim /etc/postfix/main.cf
mailbox_size_limit = 1000000000
[root@www ~]# postfix reload
```
我給每個人 1GB 的空間啊!^_^
* 寄件備份:SMTP 自動轉寄一份到備份匣
收件備份我們知道可以使用 /etc/aliases 來處理的,但是如果想要送件也備份呢?利用底下的方式即可:
```
[root@www ~]# vim /etc/postfix/main.cf
always_bcc = some@host.name
[root@www ~]# postfix reload
```
如此一來任何人寄出的信件都會復制一份給 some@host.name 那個信箱。不過,除非您的公司很重視一些商業機密, 并且已經公告過所有同仁,否則進行這個設定值,鳥哥個人認為侵犯隱私權很嚴重!
* 配置文件的權限問題:權限錯誤會不能啟動 postfix
這部份我們以 Sendmail 官方網站的建議來說明喔!其實也適用于 postfix 的啦! 其中,大部分是在于『目錄與檔案權限』的設定要求上面:
* 請確定 /etc/aliases 這個檔案的權限,僅能由系統信任的賬號來修改,通常其權限為 644 ;
* 請確定 Mail server 讀取的數據庫 (多半在 /etc/mail/ 或 /etc/postfix/ 底下的 *.db 檔案),例如 mailertable, access, virtusertable 等等,僅能由系統信任的用戶讀取,其他一概不能讀取,通常權限為 640 ;
* 系統的隊列目錄 (/var/spool/mqueue 或 /var/spool/postfix) 僅允許系統讀取,通常權限為 700 ;
* 請確定 ~/.forward 這個檔案的權限也不能設定成為任何人均可查閱的權限,否則您的 e-mail 數據可能會被竊取~
* 總之,一般用戶能夠不用 ~/.forward 與 aliases 的功能,就不要使用!
不過整體的使用上還是需要身為網站管理員的您多費心!多多觀察登錄檔啊!
* 備份資料:與 mail 有關的目錄是哪些?
不管什么時候,備份總是重要的!那么如果我是單純的 Mail Server 而已,我需要的備份數據有哪些呢?
* /etc/passwd, /etc/shadow, /etc/group 等與賬號有關的資料;
* /etc/mail, /etc/postfix/ 底下的所有檔案數據;
* /etc/aliases 等等 MTA 相關檔案;
* /home 底下的所有用戶數據;
* /var/spool/mail 底下的檔案與 /var/spool/postfix 郵件隊列檔案;
* 其他如廣告軟件、病毒掃瞄軟件等等的設定與定義檔。
* 錯誤檢查:查出不能啟動 postfix 的問題流程
雖然 Mail 很方便,但是仍然會有無法將信件寄出的時候!如果您已經設定好 MTA 了,但是總是無法將郵件寄出去,那可能是什么問題呢?你可以這樣追蹤看看:
1. 關于硬件配備:
例如,是否沒有驅動網卡?是否調制解調器出問題?是否 hub 熱當啦?是否路由器停止服務等等的!
2. 關于網絡參數的問題:
如果連不上 Internet ,那么哪里來的 Mail Server 呢?所以請先確認你的網絡已經正常的啟用了! 關于網絡的確認問題,請查閱[第六章網絡偵錯](http://linux.vbird.org/linux_server/0150detect_network.php)來處理。
3. 關于服務的問題:
請務必確認與 mail server 有關的埠口已經順利啟動!例如 port 25, 110, 143, 993, 995 等等,使用 netstat 指令即可了解是否已經啟動該服務!
4. 關于防火墻的問題:
很多時候,很多朋友使用 Red Hat 或者其他 Linux distribution 提供的防火墻設定軟件,結果忘了啟動 port 25 與 port 110 的設定,導致無法收發信件!請特別留意這個問題喔!可以使用 iptables 來檢查是否已經啟用該 port 呢!其余請參考[第九章防火墻設定](http://linux.vbird.org/linux_server/0250simple_firewall.php)喔!
5. 關于配置文件的問題:
在啟動 postfix 或者是 sendmail 之后,在登錄檔當中仔細看看有無錯誤訊息發生? 通常如果設定數據不對,在登錄文件當中都會有記載錯誤的地方。
6. 其他檔案的設定問題:
(1)如果發現只有某個 domain 可以收信,其他的同一主機的 domain 無法收信,需要檢查 $mydestination 的設定值才行; (2)如果發現郵件被擋下來了!而且老是顯示 reject 的字樣,那么可能被 access 擋住了; (3)如果發現郵件隊列 (mailq) 存在很多的郵件,可能是 DNS 死掉了,請檢查 /etc/resolv.conf 的設定是否正確!
7. 其他可能的問題:
最常發生的就是認證的問題了!這是由于使用者沒有在 MUA 上面設定『我的郵件需要認證』的選項啦! 請叫你的用戶趕緊勾選吧!
8. 還是不知道問題的解決方案:
如果還是查不出問題的話,那么請務必檢查您的 /var/log/maillog (有的時候是 /var/log/mail ,這個要看 /etc/syslog.conf 的設定),當你寄出一封信的時候,例如 dmtsai 寄給 bird2@www.centos.vbird 時,那么 maillog 檔案里面會顯示出兩行,一行為 from dmtsai 一行為 to bird2@www.centos.vbird, 也就是『我由哪里收到信,而這封信會寄到哪里去!』的意思,由這兩行就可以了解問題了!尤其是 to 的那一行,里面包含了相當多的有用信息,包括郵件無法傳送的錯誤原因的紀錄! 如果您對于登錄檔不熟,請拿出『基礎學習篇』里面的『第十九章、認識登錄檔』一文吧!
* * *
- 鳥哥的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 參考數據與延伸閱讀