<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 22.2 MTA 服務器: Postfix 基礎設定 ## 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. 若這封信的標頭數據都不合乎上述的規范,則終止聯機,并不會接受信件的內容數據的。 整個流程有點像底下這樣: ![](https://box.kancloud.cn/2016-05-13_5735da7fd3cac.gif) 圖 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 底下的建議動作去處理即可! ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) - 個人化的郵件轉遞: ~/.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 的讀取啰!簡單!搞定! - - - - - -
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看