原网址:http://www.php5.idv.tw/modules.php?mod=books&act=show&shid=926
无任何修改!
POSTFIX郵件伺服器設定(一)
郵件系統postfix安裝與配置(一)
一、 postfix概述
postfix是Wietse Venema在IBM的GPL協議之下開發的MTA(郵件傳輸
代理)軟件。下面一段話摘自postfix的官方站點(http://www.postfix.org):
“postfix是Wietse Venema想要為使用最廣泛的sendmail提供替代品的一個嘗試。在Internet世界中,大部分的電子郵件都是通過sendmail來投遞的, 大約有100萬用戶使用sendmail,每天投遞上億封郵件。 這真實一個讓人吃驚的數字。 Postfix 試圖更快、更容易管理、更安全,同時還與 sendmail 保持足夠的兼容性。 ”
1.1 postfix 的特點
1. postfix是免費的:
postfix想要作用的范圍是廣大的 Internet 用戶,試圖影響大多數的 Internet 上的電子郵件系統,因此它是免費的。
2. 更快:
postfix在性能上大約比sendmail快三倍。一部運行postfix的台式PC每天可以收發上百萬封郵件。
3. 兼容性好:
postfix是sendmail兼容的,從而使sendmail用戶可以很方便地遷移到postfix。Postfix支持/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 文件。
4. 更健壯:
postfix被設計成在重負荷之下仍然可以正常工作。當系統運行超出了可用的內存或磁盤空間時, postfix 會自動減少運行進程的數目。當處理的郵件數目增長時, postfix 運行的進程不會跟著增加。
5. 更靈活:
postfix是由超過一打的小程序組成的,每個程序完成特定的功能。你可以
通過配置文件設置每個程序的運行參數。
6. 安全性
postfix具有多層防御結構,可以有效地抵御惡意入侵者。如大多數的 postfix 程序可以運行在較低的權限之下,不可以通過網絡訪問安全性相關的本地投遞程序等等。
1.2 postfix的總體結構
postfix由十幾個具有不同功能的半駐留進程組成,並且在這些進程中並無特定的進程間父子關系。某一個特定的進程可以為其他進程提供特定的服務。
大多數的 postfix 進程由一個進程統一進行管理,該進程負責在需要的時候調用其他進程,這個管理進程就是 master 進程。該進程也是一個後台程序。
這些 postfix 進程是可以配置的,我們可以配置每個進程運行的數目,可重用的次數,生存的時間等等。通過靈活的配置特性可以使整個系統的運行成本大大降低。
1.2.1 postfix的郵件隊列(mail queues)
postfix有四種不同的郵件隊列,並且由隊列管理進程統一進行管理:
1. maildrop:本地郵件放置在maildrop中,同時也被拷貝到incoming中。
2. incoming:放置正在到達或隊列管理進程尚未發現的郵件。
3 . active :放置隊列管理進程已經打開了並正準備投遞的郵件,該隊列有
長度的限制。
4. deferred :放置不能被投遞的郵件。
隊列管理進程僅僅在內存中保留 active 隊列,並且對該隊列的長度進行限
制,這樣做的目的是為了避免進程運行內存超過系統的可用內存。
1.2.2 postfix對郵件風暴的處理
當有新的郵件到達時, postfix 進行初始化,初始化時 postfix 同時只接受兩個並發的連接請求。當郵件投遞成功後,可以同時接受的並發連接的數目 就會緩慢地增長至一個可以配置的值。當然,如果這時系統的消耗已到達系統不能承受的負載就會停止增長。還有一種情況時,如果 postfix 在處理郵件過程 中遇到了問題,則該值會開始降低。
當接收到的新郵件的數量超過 postfix 的投遞能力時, postfix 會暫時停止投遞 deferred 隊列中的郵件而去處理新接收到的郵件。這是因為處理新郵件的延遲要小於處理 deferred 隊列中的郵件。 Postfix 會在空閑時處理 deferred 中的郵件。
1.2.3 postfix對無法投遞的郵件的處理
當一封郵件第一次不能成功投遞時, postfix 會給該郵件貼上一個將來的時間郵票。郵件隊列管理程序會忽略貼有將來時間郵票的郵件。時間郵票到期時, postfix 會嘗試再對該郵件進行一次投遞,如果這次投遞再次失敗, postfix 就給該郵件貼上一個兩倍於上次時間郵票的時間郵票,等時間郵票到期時 再次進行投遞,依此類推。當然,經過一定次數的嘗試之後, postfix 會放棄對該郵件的投遞,返回一個錯誤信息給該郵件的發件人。
1.2.4 postfix對不可到達的目的地郵件的處理
postfix會在內存中保存一個有長度限制的當前不可到達的地址列表。這樣就避免了對那些目的地為當前不可到達地址的郵件的投遞嘗試。從而大大提高了系統的性能。
1.2.2 postfix的安全性
postfix通過一系列的措施來提高系統的安全性,這些措施包括:
1. 動態分配內存,從而防止系統緩沖區溢出;
2. 把大郵件分割成幾塊進行處理,投遞時再重組;
3. Postfix 的各種進程不在其他用戶進程的控制之下運行,而是運行在駐留
主進程 master 的控制之下,與其他用戶進程無父子關系,所有有很好的
絕緣性。
4. Postfix 的隊列文件有其特殊的格式,只能被 postfix 本身識別;
二、 postfix 對郵件的處理過程
2.1 接收郵件的過程
圖二、 postfix 對接收郵件的處理
當 postfix 接收到一封新郵件時,新郵件首選在 incoming 隊列處停留,然後針對不同的情況進行不同的處理:
1.對於來自於本地的郵件: sendmail 進程負責接收來自本地的郵件放在 maildrop 隊列中,然後 pickup 進程對 maildrop 中的郵件進行完整性檢測。 maildrop 目錄的權限必須設置為某一用戶不能刪除其他用戶的郵件。
2.對於來自於網絡的郵件: smtpd 進程負責接收來自於網絡的郵件,並且進行安全性檢測。可以通過 UCE ( unsolicited commercial email )控制 smtpd 的行為。
3.由 postfix 進程產生的郵件:這是為了將不可投遞的信息返回給發件人。這些郵件是由 bounce 後台程序產生的。
5. 由 postfix 自己產生的郵件:提示 postmaster (也即 postfix 管理員) postfix
運行過程中出現的問題。(如 SMTP 協議問題,違反 UCE 規則的記錄等等。)
關於 cleanup 後台程序的說明: cleanup 是對新郵件進行處理的最後一道工序
它對新郵件進行以下的處理:添加信頭中丟失的 Form 信息;為將地址重寫成標準的 user@fully.qualified.domain 格式進行排列; 重信頭中抽出收件人的地址;將郵件投入 incoming 隊列中,並請求郵件隊列管理進程處理該郵件;請求 trivial-rewrite 進程將地址轉換成 標準的 user@fully.qualified.domain 格式。
2.2 投遞郵件的過程
新郵件一旦到達 incoming 隊列,下一步就是開始投遞郵件, postfix 投遞郵件時的處理過程如圖三所示。相關的說明如下:
郵件隊列管理進程是整個 postfix 郵件系統的心臟。它和 local 、 smtp 、 pipe 等投遞代理相聯系,將包含有隊列文件路徑信息、郵件發件人地 址、郵件收件人地址的投遞請求發送給投遞代理。隊列管理進程維護著一個 deferred 隊列,那些無法投遞的郵件被投遞到該隊列中。除此之外,隊列管理進 程還維護著一個 active 隊列,該隊列中的郵件數目是有限制的,這是為了防止在負載太大時內存溢出。郵件隊列管理程序還負責將收件人地址在 relocated 表中列出的郵件返回給發件人,該表包含無效的收件人地址。
如果郵件隊列管理進程請求, rewrite 後台程序對收件人地址進行解析。但是缺省地, rewrite 只對郵件收件人是本地的還是遠程的進行區別。
如果郵件對你管理進程請求, bounce 後台程序可以生成一個郵件不可投遞的報告。
本地投遞代理local進程可以理解類似UNIX風格的郵箱,sendmail風格的系統別名數據庫和sendmail風格的.forward文件。 可以 同時運行多個 local 進程,但是對同一個用戶的並發投遞進程數目是有限制的。你可以配置 local 將郵件投遞到用戶的宿主目錄,也可以配置 local 將 郵件發送給一個外部命令,如流行的本地投遞代理 procmail 。在流行的 linux 發行版本 RedHat 中,我們就使用 procmail 作為最終的本地 投遞代理。
遠程投遞代理 SMTP 進程根據收件人地址查詢一個 SMTP 服務器列表,按照順序連接每一個 SMTP 服務器,根據性能對該表進行排序。在系統負載太大時,可以有數個並發的 SMTP 進程同時運行。
pipe是用於 UUCP 協議的投遞代理。
三、 postfix 的安裝過程
3.1源代碼包的安裝
1. 獲取 postfix 的源代碼包
從 postfix 官方站點 www.postfix.org 取得 postfix 的源代碼包 postfix-19991231-pl08.tar.gz 。將其拷貝到 /tmp
2 .解開源代碼包,將生成 /tmp/ postfix-19991231-pl08 目錄。
tar xvzf postfix-19991231-pl08.tar.gz
3.編譯源代碼包
cd /tmp/ postfix-19991231-pl08
make
4.建立一個新用戶 “postfix” ,該用戶必須具有唯一的用戶 id 和組 id 號,同時應該讓該用戶不能登錄到系統,也即不為該用戶指定可執行的登錄外殼 程序和可用的用戶宿主目錄。我們可以先用 adduser postfix 添加用戶再編輯 /etc/passwd 文件中的相關條目如下所示:
postfix:*:12345:12345ostfix:/no/where:/no/shell
5.確定 /etc/aliases 文件中包含如下的條目:
postfix: root
6. 以 root 用戶登錄,在 /tmp/ postfix-19991231-pl08 目錄下執行命令:
./INSTALL.sh
7. 啟動 postfix
# postfix start
8 .關於 maildrop 目錄權限的說明:
postfix可以使用一個所有用戶都可寫的(也即目錄權限為 1773 )的 maildrop
目錄來讓本地用戶提交郵件。這種方法避免了使用 set-uid 或 set-gid 軟件,並且在郵件系統不可用時,用戶仍然可以提交郵件。其他用戶沒有訪問該目錄中的隊列文件的權限。接收來自網絡的郵件時 postfix 不使用 maildrop 目錄。但是,由於該目錄的權限是 733 ,其他用戶可以建立一個硬連接到該目錄中的文件從而導致該郵件被投遞多次或無法刪除,也就是說這將 導致安全性問題。如果你想要使用這種方式來讓用戶提交郵件,就要在 INSTALL.sh 腳本問你是否需要 set-gid 時回答 no 。
如果你的系統有多個用戶的話,最好取消以上的方式而採用利用 set-gid 用
戶權限提交郵件的方式。這時,我們首先需要建立一個組 id 唯一的組 "maildrop" 並且確定該組中沒有用戶成員。然後在 INSTALL.sh 問你是否需要 set-gid 時指定 "maildrop" 。
提示:在安裝 postfix 之前,請刪除已經安裝的 sendmail 。
3.2 rpm包的安裝
1. 獲取postfix的rpm軟件包。
我們可以從http://www.alltrading.es/postfix/RPMS/i386/ 獲得postfix的rpm軟件包。當前的最新版本是postfix-20000531-2.i386.rpm。
2. 備份你的/etc/aliases和/etc/aliases.db,因為postfix要使用該別名數據庫。
3. 用以下命令查看系統是否安裝了sendmail:
[iyunv@mail /root]# rpm -qa |grep sendmail
sendmail-doc-8.9.3-15
sendmail-8.9.3-15
sendmail-cf-8.9.3-15
4. 用以下命令強行卸載sendmail:
[iyunv@mail /root]# rpm -e sendmail sendmail-cf sendmail-doc --nodeps
5. 用以下命令殺死運行中的sendmail進程:
[iyunv@mail /root]# killall sendmail
6. 安裝postfix:
[iyunv@mail /root]# rpm -Uvh postfix-20000531-2.i386.rpm
postfix ##################################################
postfix-script: warning: creating missing Postfix pid directory
postfix-script: warning: creating missing Postfix incoming directory
postfix-script: warning: creating missing Postfix active directory
postfix-script: warning: creating missing Postfix bounce directory
postfix-script: warning: creating missing Postfix defer directory
postfix-script: warning: creating missing Postfix deferred directory
postfix-script: warning: creating missing Postfix saved directory
postfix-script: warning: creating missing Postfix corrupt directory
postfix-script: warning: creating missing Postfix public directory
postfix-script: warning: creating missing Postfix private directory
[iyunv@mail /root]#
7. 啟動postfix
[iyunv@mail /root]# /etc/rc.d/init.d/postfix start
3.3 配置系統每次啟動時自動啟動postfix
1.如果你安裝的是postfix的源代碼包,可以在/etc/rc.d/rc.local文件中加入如下的語句讓系統每次啟動時自動啟動postfix:
if [ -f /usr/libexec/postfix ]; then
/usr/libexec/postfix start
fi
2.如果你安裝的是postfix的rpm包,可以通過setup命令來設置在系統啟動時啟動postfix。
四、 postfix的配置詳解
4.1 postfix的配置文件結構
postfix的配置文件位於/etc/postfix下,安裝完postfix以後,我們可以通過ls命令查看postfix的配置文件:
[iyunv@mail postfix]# ls
install.cf main.cf master.cf postfix-script
這四個文件就是postfix最基本的配置文件,它們的區別在於:
mail.cf:是postfix主要的配置文件。
Install.cf:包含安裝過程中安裝程序產生的postfix初始化設置。
master.cf:是postfix的master進程的配置文件,該文件中的每一行都是用來配置postfix的組件進程的運行方式。
postfix-script:包裝了一些postfix命令,以便我們在linux環境中安全地執行這些postfix命令。
4.2 postfix 的基本配置
postfix大約有 100 個配置參數,這些參數都可以通過 main.cf 指定。配置的格式是這樣的,用等號連接參數和參數的值。如:
myhostname = mail.mydomain.com
等號的左邊是參數的名稱,等號的右邊是參數的值; 當然,我們也可以在參數的前面加上 $ 來引用該參數,如:
myorigin = $myhostname
雖然 postfix 有 100 個左右的參數,但是 postfix 為大多數的參數都設置了缺省值,所以在讓 postfix 正常為你服務之前,你只需要配置為數 不多的幾個參數。下面我們一起來看一看這些基本的 postfix 參數。需要注意的是,一旦你更改了 main.cf 文件的內容,則必須運行 postfix reload 命令使其生效。
1. myorigin
myorigin參數指明發件人所在的域名。如果你的用戶的郵件地址為user@domain.com,則該參數指定@後面的域名。缺省地, postfix使用本地主機名作為myorigin,但是建議你最好使用你的域名,因為這樣更具有可讀性。比如:安裝postfix的主機為 mail.domain.com則我們可以這樣指定myorigin:
myorigin = domain.com
當然我們也可以引用其他參數,如:
myorigin = $mydomain
2. mydestination
mydestination參數指定postfix接收郵件時收件人的域名,換句話說,也就
是你的postfix系統要接收什麼樣的郵件。比如:你的用戶的郵件地址為user@domain.com, 也就是你的域為domain.com, 則你就需要接收所有收件人為user_name@domain.com的郵件。與myorigin一樣,缺省地,postfix使用本地主機名作為 mydestination。如:
mydestination = $mydomain
mydestination = domain.com
3. notify_classes
在postfix系統中,必須指定一個postfix系統管理員的別名指向一個用戶,
只有這樣,在用戶遇到問題時才有報告的對象,postfix也才能將系統的問題報告給管理員。notify_classes參數就是用來指定向postfix管理員報告錯誤時的信息級別。 共有以下幾種級別:
bounce:將不可以投遞的郵件的拷貝發送給 postfix 管理員。出於個人隱私的緣故,該郵件的拷貝不包含信頭。
2bounce:將兩次不可投遞的郵件拷貝發送給 postfix 管理員。
delay:將郵件的投遞延遲信息發送給管理員,僅僅包含信頭。
policy:將由於 UCE 規則限制而被拒絕的用戶請求發送給 postfix 管理員,包含整個 SMTP 會話的內容。
protocol:將協議的錯誤信息或用戶企圖執行不支持的命令的記錄發送給 postfix 管理員。同樣包含整個 SMTP 會話的內容。
resource:將由於資源錯誤而不可投遞的錯誤信息發送給 postfix 管理員,比如:隊列文件寫錯誤等等。
software:將由於軟件錯誤而導致不可投遞的錯誤信息發送給 postfix 管理員。
缺省值為:
notify_classes = resource, software
4.myhostname
myhostname 參數指定運行postfix郵件系統的主機的主機名。 缺省地,該值被設定為本地機器名。你也可以指定該值,需要注意的是,要指定完整的主機名。如:
myhostname = mail.domain.com
5. mydomain
mydomain 參數指定你的域名,缺省地, postfix 將 myhostname 的第一部分刪除而作為 mydomain 的值。你也可以自己指定該值,如:
mydomain = domain.com
6. mynetworks
mynetworks 參數指定你所在的網絡的網絡地址, postfix 系統根據其值來區別用戶是遠程的還是本地的,如果是本地網絡用戶則允許其訪問。你可以用標準的 A 、 B 、 C 類網絡地址,也可以用 CIDR (無類域間路由)地址來表示 , 如:
192.168.1.0/24
192.168.1.0/26
7. inet_interfaces
inet_interfaces 參數指定 postfix 系統監聽的網絡接口。缺省地, postfix 監聽
所有的網絡接口。如果你的 postfix 運行在一個虛擬的 ip 地址上,則必須指定其監聽的地址。如:
inet_interfaces = all
inet_interface = 192.168.1.1
4.3 postfix的 UCE ( unsolicited commercial email )控制
所謂 UCE 控制就是指控制 postfix 接收或轉發來自於什麼地方的郵件。
缺省地,postfix轉發符合以下條件的郵件:
* 來自客戶端ip地址符合$mynetworks的郵件。
* 來自客戶端主機名符合$relay_domains及其子域的郵件。
* 目的地為$relay_domains及其子域的郵件。
缺省地,postfix接受符合以下條件的郵件:
* 目的地為$inet_interfaces的郵件。
* 目的地為$mydestination的郵件。
* 目的地為$virtual_maps的郵件。
但是我們也可以通過下面的規則來實現更強大的控制功能。
1 . 信頭過濾
通過 header_checks 參數限制接收郵件的信頭的格式,如果符合指定的格式,則拒絕接收該郵件。可以指定一個或多個查詢列表,如果新郵件的信頭符合列表中的某一項則拒絕該接收郵件。如:
header_checks = regexp:/etc/postfix/header_checks
header_checks = pcre:/etc/postfix/header_checks
缺省地, postfix 不進行信頭過濾。
2.客戶端主機名/地址限制
通過smtpd_client_restrictions參數限制可以向postfix發起SMTP 連接的客戶端的主機名或ip地址。 可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規則有:
reject_unknown_client:如果客戶端的 ip 地址在 DNS 中沒有 PTR 記錄則拒絕轉發該客戶端的連接請求。可以用 unknown_client_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為 450 )。如果你有用戶沒有作 DNS 記錄則不要啟用該選項。
permit_mynetworks:如果客戶端的ip地址符合$mynetworks參數定義的范圍則接受該客戶端的連接請求,並轉發該郵件。
check_client_access maptype:mapname:根據客戶端的主機名、父域名、ip地址或屬於的網絡搜索access數據庫。 如果搜索的結果為 REJECT 或者 "[45]XX text" 則拒絕該客戶端的連接請求;如果搜索的結果為 OK 、 RELAY 或數字則接受該客戶端的連接請求,並轉發該郵件。。可以用 access_map_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為 554 )。
reject_maps_rbl:如果客戶端的網絡地址符合$maps_rbl_domains參數的值則拒絕該客戶端的連接請求。可以用maps_rbl_reject_code參數指定返回給客戶機的錯誤代碼(缺省為554)。
示例:
smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client
該參數的缺省值為:
smtpd_client_restrictions =
也即接收來自任何客戶端的SMTP連接。
3. 是否請求HELO命令
可以通過smtpd_helo_required參數指定客戶端在SMTP會話的開始是否發
送一個HELO命令。你可以指定該參數的值為yes或no。缺省值為:
smtpd_helo_required = no
4. HELO主機名限制
可以通過smtpd_helo_restrictions參數指定客戶端在執行HELO命令時發送
給postfix的主機名。 缺省地, postfix 接收客戶端發送的任意形式的主機名。可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規則有:
reject_invalid_hostname:如果 HELO 命令所帶的主機名參數不符合語法規范則拒絕客戶機的連接請求。可以用 invalid_hostname_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為 501 )。
permit_naked_ip_address:RFC要求客戶端的HELO命令包含的ip地址放在方括號內,你可以用permit_naked_ip_address參數取消該限制。 因為有的 mail 客戶端不遵守該 RFC 的規定。
reject_unknown_hostname:如果客戶端執行HELO命令時的主機名在DNS中沒有相應的A 或 MX 記錄則拒絕該客戶端的連接請求。可以用invalid_hostname_reject_code參數指定返回給客戶機的錯誤代碼(缺省為450)。
reject_non_fqdn_hostname:如果客戶端執行HELO命令時的主機名不是RFC規定的完整的域名則拒絕客戶端的連接請求。可以用invalid_hostname_reject_code參數指定返回給客戶機的錯誤代碼(缺省為504)。
check_helo_access maptype:mapname:根據客戶端HELO的主機名、父域名搜索access數據庫。 如果搜索的結果為 REJECT 或者 "[45]XX text" 則拒絕該客戶端的連接請求;如果搜索的結果為 OK 、 RELAY 或數字則接受該客戶端的連接請求。可以用 access_map_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為 554 )。
示例:
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname
5. RFC 821信頭限制
RFC 821對郵件的信頭做了嚴格的規定,但是廣泛使用的sendmail並不支
持該規定,所以對於該參數我們只能說不,即:
strict_rfc821_envelopes = no
6. 通過發件人地址進行限制
可以用smtpd_sender_restrictions參數通過發件人在執行MAIL FROM命令時提供的地址進行限制。 可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規則有:
reject_unknown_sender_domain:如果 MAIL FROM 命令提供的主機名在 DNS 中沒有相應的 A 或 MX 記錄則拒絕該客戶端的連接請求。可以用 unknown_address_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為 450 )。
check_sender_access maptype:mapname:根據MAIL FROM命令提供的主機名、父域搜索access數據庫。 如果搜索的結果為 REJECT 或者 "[45]XX text" 則拒絕該客戶端的連接請求;如果搜索的結果為 OK 、 RELAY 或數字則接受該客戶端的連接請求。可以用 access_map_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為 554 )。可以通過該參數 過濾來自某些不受歡迎的發件人的郵件。
reject_non_fqdn_sender:如果MAIL FROM命令提供的主機名不是RFC規定的完整的域名則拒絕客戶端的連接請求。可以用non_fqdn_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為504)。
缺省地, postfix 接受來自任何發件人的郵件。
示例:
smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain
7. 通過收件人地址進行過濾
可以用smtpd_recipient_restrictions參數通過發件人在執行RCPT TO命令
時提供的地址進行限制。缺省值為:
smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains
可以指定一個或多個參數值,中間用逗號隔開。 限制規則是按照查詢的順序
進行的,第一條符合條件的規則被執行。可用的規則有:
check_relay_domains:如果符合以下的條件,則接受 SMTP 連接請求,否則拒絕該連接,可以用 relay_domains_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為 504 )。
* 客戶端主機名符合$relay_domains及其子域
* 目的地為$inet_interfaces、$mydestination或$virtual_maps
permit_auth_destination:不管客戶端的主機名,只要符合以下的條件,就
接受SMTP連接請求:
* 解析後的目標地址符合$relay_domains及其子域
* 解析後的目標地址符合$inet_interfaces、$mydestination或$virtual_maps
reject_unauth_destination:不管客戶端的主機名,只要符合以下的條件,
就拒絕該客戶端SMTP連接請求:
* 解析後的目標地址符合$relay_domains及其子域
* 解析後的目標地址符合$inet_interfaces、$mydestination或$virtual_maps
check_recipient_access:根據解析後的目標地址、父域搜索access數據庫。 如果搜索的結果為 REJECT 或者 "[45]XX text" 則拒絕該客戶端的連接請求;如果搜索的結果為 OK 、 RELAY 或數字則接受該客戶端的連接請求。可以用 access_map_reject_code 參數指定返回給客戶機的錯誤代碼(缺省為 554 )。
reject_unknown_recipient_domain:如果收件人的郵件地址在DNS中沒有相應的A 或 MX 記錄則拒絕該客戶端的連接請求。可以用unknown_address_reject_code參數指定返回給客戶機的錯誤代碼(缺省為450)。
reject_non_fqdn_recipient:如果發件人在執行RCPT TO命令時提供的地址
不是完整的域名則拒絕其SMTP連接請求。可以用The non_fqdn_reject_code參數指定返回給客戶機的錯誤代碼(缺省為504)。
4.4 posftfix 的性能控制
之所以對 postfix 的性能進行控制,是為了在遇到郵件風暴時保証 postfix 可以正常運行。通常,我們可以通過對下列 postfix 參數的配置來調 節 postfix 的性能,這些參數都是通過 mail.cf 配置文件進行配置的,修改以後不要忘了運行 postfix reload 命令來使配置生效。
1. 進程數限制
可以通過default_process_limit 參數來控制postfix系統同時可以運行的最
大進程數目。 缺省值是 50 個。
2. 對同一目標主機的並發連接限制
當向同一目標主機發出 SMTP 連接時, postfix 初始化發出兩個 SMTP 連接,
如果投遞成功則增加並發的 SMTP 連接數目,遇到擁塞時又減少並發連接的數目。 postfix 中通過以下的參數對同一目標主機的並發連接進行控制:
* initial_destination_concurrency:控制對同一目標主機的初始化並發連接數目。缺省值為 2 。
* default_destination_concurrency_limit:控制初始化連接後對同一目標主機的最大並發連接數目。缺省值為 10 。
* local_destination_concurrency_limit:控制對同一本地收件人的最大同時投遞的郵件數目。缺省值為 2 ,因為對本地同一收件人投遞郵件時投遞工作只能一個接一個的進行,所以設得在大也沒用。
3. 對同一封郵件的收件人數目限制
通過default_destination_recipient_limit參數來控制postfix的投遞代理(如
smtp進程)可以將同一封郵件發送給多少個收件人。 缺省值為 50 。也可以用明確指出該投遞代理的參數來覆蓋該缺省值。如用 smtpd_recipient_limit 來指定 smtp 投遞代理可以將同一封郵件發送給多少個收件人,該參數的缺省值為 1000 。
4. 推遲投遞控制
通過defer_transports參數,我們可以推遲投遞該參數指定的郵件直到postfix明確的提出投遞要求。 下面我們看一個例子:
有一個小型的局域網,用戶都將郵件發送給局域網內燦始 � 系苀 postfix 安裝與配置
一、 postfix 概述
postfix是 Wietse Venema 在 IBM 的 GPL 協議之下開發的 MTA (郵件傳輸
代理)軟件。下面一段話摘自 postfix 的官方站點( http://www.postfix.org ):
“postfix是 Wietse Venema 想要為使用最廣泛的 sendmail 提供替代品的一個嘗試。在 Internet 世界中,大部分的電子郵件都是通過 sendmail 來投遞的, 大約有 100 萬用戶使用 sendmail ,每天投遞上億封郵件。這真實一個讓人吃驚的數字。 Postfix 試圖更快、更容易管理、更安全,同時還與 sendmail 保持足夠的兼容性。
5. 關於延遲郵件的再投遞控制
可以通過以下的幾個參數實現對延遲郵件的再投遞控制:
queue_run_delay:設置隊列管理進行掃描 deferred 郵件隊列的頻率,缺省值為 1000 秒。
maximal_queue_lifetime:設置postfix在放棄投遞而返回不可投遞信息前,被延遲郵件再deferred郵件隊列中的生存時間。
minimal_backoff_time :當一封郵件投遞失敗後,郵件隊列將在一段時間內忽視該郵件的存在,也就是我們前面講的時間郵票。該參數就是用來設置最小的時間郵票。缺省值為 1000 秒。
maximal_backoff_time:設置最大的時間郵票。
6. 對拒絕服務攻擊的處理
postfix對每一個 SMTP 會話都設置一個錯誤計數器,當該客戶端的請求未
被接受或違反那 UCE 規則時,該計數器就增 1 。隨著計數器的增加, postfix 將採取不同的措施來防止惡意用戶的拒絕服務攻擊。
smtpd_error_sleep_time:當該錯誤計數器的值還很小時,postfix將暫停
smtpd_error_sleep_time指定的時間,然後向客戶端報告一個錯誤。 該參數的缺省值為 5 秒。
smtpd_soft_error_limit:當錯誤計數器的值超過該參數指定的值時, postfix 在響應該客戶端請求前將沉睡一段時間。缺省值為 10 。
smtpd_hard_error_limit:當錯誤計數器的值超過該參數指定的值時, postfix
中斷同該客戶端的連接。缺省值為 100 。
郵件系統 postfix 安裝與配置 ( 二 )
4.5 postfix 對使用資源的控制
通過特定的 postfix 配置參數,我們可以實現 postfix 運行時對所消耗的資源的靈活控制。可以通過以下幾個方面來控制 postfix 消耗的資源:
1. 限制內存中的對象的大小
要控制對內存資源的消耗,必須控制內存中對象的大小。可以用以下的參數來進行對象大小的控制:
line_length_limit:控制讀入數據時每一行的大小,如果太長則強行將其分割成更短的行,太長的行在投遞時再重組。缺省值為 2048 bytes 。
header_size_limit:限制信頭長度。缺省值為 102400bytes 。
message_size_limit:限制 postfix 隊列文件的大小。缺省值為 10240000 bytes 。
queue_minfree:郵件隊列中可用的空間大小。缺省為無限制。建議該值最好時 message_size_limit 的數倍以便於處理大郵件。
bounce_size_limit:限制某一郵件不可投遞時,返回給發件人不可投遞報告的大小,缺省值為50000 bytes。
2. 限制內存中對象的數目
qmgr_message_recipient_limit:設置內存中收件人地址的最大數目。缺省值為10000。
qmgr_message_active_limit:設置active郵件隊列中郵件數目的最大值。缺省值為1000。
duplicate_filter_limit:設置需要local和cleanup後台程序記住的收件人地址的最大數目。缺省值為1000。
3.限制等待一個外部命令完成的時間
command_time_limit:設置local程序等待一個外部命令完成的時間。缺省值為1000秒。
4. 限制文件鎖定的操作時間
deliver_lock_attempts:設置鎖定一個文件的最大嘗試次數。缺省值為5次。
deliver_lock_delay:設置如果鎖定一個文件失敗後再次嘗試的等待時間,缺省值為1秒。
5 . 控制錯誤恢復
在某些情況下(如高負載), postfix 的某個進程可能會死掉,這時 master 進
程會試圖重新啟動該進程,我們可以通過下面的參數來控制這種行為:
fork_attempts:試圖重啟動一個進程的最大嘗試次數。缺省值為 5 次。
fork_delay:每兩次嘗試之間的等待時間,缺省值為 1 秒。
transport_retry_time:隊列管理進程每兩次嘗試連接一個不正常的投遞代理進程之間的等待時間。缺省為60秒。
4.6 postfix中的地址操作
1. 將地址改寫為標準格式
在cleanup進程進行表查詢之前,它首選請求trivial-rewrite進程將新
郵件地址改寫成標準的user@fully.qualified.domain格式。 改寫的目的是為了減少查詢表中的條目,從而提供查詢的效率。 trivial-rewrite 進程可以實現以下的地址改寫:
* 將包含源路由信息的地址 ?a href="mailto http://onexin.iyunv.com/source/plugin/onexin_bigdata/file:///C:%5CDOCUME~1%5CYANQIN~1.000%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.gif @hosta">p@hosta,@hostb:user@site 寫成 user@site ,因為 postfix 不支持包含源路由信息的地址格式。
* 將形如user%domain的地址改寫成user@domain的形式。該特性可通過allow_percent_hack參數進行控制,其缺省值為yes。
* 將只包含user的地址改寫成user@$myorigin。該特性可通過append_at_myorigin參數進行控制,其缺省值為yes。最好不要改動其缺省值,因為大多數的postfix進程更擅長處理地址形如user@$myorigin的郵件。
* 將形?a href="mailtohttp://onexin.iyunv.com/source/plugin/onexin_bigdata/file:///C:%5CDOCUME~1%5CYANQIN~1.000%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.gif user@host">puser@host的地址改寫成user@host.$mydomain。該特性可通過append_dot_mydomain參數進行控制,其缺省值為yes。
* 將形?a href="mailtohttp://onexin.iyunv.com/source/plugin/onexin_bigdata/file:///C:%5CDOCUME~1%5CYANQIN~1.000%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.gif user@site.">puser@site.的地址改寫成 user@site,也即除去了最後的點號。
2 . 規范地址映射
在 cleanup 進程將一封新郵件存入 incoming 郵件隊列之前, cleanup 進程
將根據查詢規范表來進行地址改寫,從而使之更具可讀性。主要是替換形如 Firstname.Lastname 風格的地址以及清除無效的域。缺省 postfix 是不進行規范地址改寫的,你可以通過指定 canonical_maps 參數的值來使其生效。如:
canonical_maps = hash:/etc/postfix/canonical
也可以分別為收件人和發件人地址分別指定不同的改寫規范,這時參數 sender_canonical_maps 和 recipient_canonical_maps 的優先級比 canonical_maps 高。如:
sender_canonical_maps = hash:/etc/postfix/sender_canonical
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical
3. 地址欺騙
就是將形 ?a href="mailto http://onexin.iyunv.com/source/plugin/onexin_bigdata/file:///C:%5CDOCUME~1%5CYANQIN~1.000%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.gif user@host.domain">puser@host.domain 的地址改寫成 user@domain 或 user@other.domain,
好像是從其他的郵件服務器發出的一樣。缺省該功能是被禁止的,可以用參數 masquerade_domains 使其生效,如:
masquerade_domains = $mydomain
也可以通過 masquerade_exceptions 參數對特定的用戶不進行地址欺騙,如:
masquerade_exceptions = root
注意:地址欺騙只對發件人地址有作用。
4. 虛擬地址映射
在運用了規范地址映射和地址欺騙之後, cleanup 將使用虛擬表映射將郵件
重定向到所有的收件人。注意,該操作僅僅作用於信頭上的收件人地址。這樣,我們就可以將發送到虛擬域的郵件投遞到真實用戶的郵箱。系統的別名數據庫同樣可以起到相同的作用。缺省該功能是被禁止的,可以用參數 virtual_maps 使其生效,如:
virtual_maps = hash:/etc/postfix/virtual
5. Relocated 數據庫查詢
Relocated表格提供如何將郵件發送給在系統中沒有帳號的用戶。缺省該功能是被禁止的,可以用參數 relocated_maps 使其生效,如:
relocated_maps = hash:/etc/postfix/relocated
6. 別名數據庫查詢
當郵件在本地投遞時, local 投遞代理進程會在別名數據庫( linux 下為
/etc/aliases)中查詢收件人的別名。該操作不會作用於郵件信頭中的地址。可以用 alias_maps 指定使用的別名數據庫。缺省地,該功能是有效的,如:
alias_maps = hash:/etc/aliases
可以通過 alias_database 參數控制別名數據庫的路徑,如:
alias_database = hash:/etc/aliases
五、 postfix 的配置實例
5.1為撥號用戶配置 postfix
假設有一個小公司使用撥號上網,公司通過 ISP 的 SMTP 服務器(假設其域名為 mail.isp.com , ip 地址為 201.110.1.100 )發送郵 件;公司內部的員工通過公司的 SMTP 服務器(運行 postfix )收發郵件,下面我們一起來配置公司內部的 SMTP 服務器。
1. 因為沒有自己的固定 ip 和域名,所以必須指定 ISP 的 SMTP 服務器作
為郵件網關(智能主機)。可以用如下的參數指定:
relayhost = [201.110.1.100]
注意: relayhost 的值可以是 domain 、 host 、 hostort 、 [address] 或 [addressort] 。
2. 當接收到新郵件時, postfix 就會嘗試投遞該郵件。如果將該公司內部的
SMTP服務器設置為按需撥號,也就是一有程序請求外聯就撥號,則會增加上網的費用。這時我們可以通過 postfix 的 defer_transports 參數推遲投遞新郵件直到 postfix 提出明確的要求,如指定:
defer_transports = smtp
這時如果我們在 ppp 的腳本(如 /etc/ppp/ip-up.local )加上如下命令,則 postfix 只在撥號成功後投遞新郵件:
/usr/sbin/sendmail
3. 因為我們是將郵件轉發到郵件網關( 201.110.1.100 )而不是自己進行投
遞,所以我們沒有必要使用 DNS ,因此我們通過如下的參數取消 DNS 查詢:
disable_dns_lookups = yes
4. 為了保証我們能收到回信,我們必須進行域偽裝。
masquerade_domains = isp.com
下面就是我們的配置文件mail.cf:
#指定郵件網關
relayhost = [201.110.1.100]
# 在撥號成功後才投遞郵件
defer_transports = smtp
#取消DNS查詢
disable_dns_lookups = yes
#一般常規配置
queue_directory = /var/spool/postfix
program_directory = /usr/libexec/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
default_privs = nobody
mail_spool_directory = /var/spool/mail
mailbox_command = /usr/bin/procmail
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10
debug_peer_level = 2
debugger_command=PATH=/usr/bin:/usr/X11R6/bin,xxgdb$
daemon_directory/$ process_name $process_id & sleep 5
# 假設本地網絡為192.168.1.1/24
mynetworks = 192.168.1.1/24
# host specific information
myhostname = yourhost.isp.com
mydomain = local.isp.com
myorigin = $mydomain
where do we receive mail and who do we accept/receive mail for?
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, $mydomain
default_transport = smtp
masquerade_domains = isp.com
需要注意的是:這裡的$mydomain、$myorigin、$mydestination不能為isp.com, 因為你如果設定為isp.com,內部SMTP服務器就會認為你的郵件是轉發給它的,故而在本地嘗試投遞郵件,結果只會返回“unknown user”的錯誤。 其次,該配置只實現了將郵件通過 SMTP 發送到 ISP 的 SMTP 服務器的手段,缺乏從 ISP 的郵件服務器取信的方法,這一點就只能通過 如 outlook 或 foxmail 等的 mail 客戶端軟件來實現了。
5.2為中小型企業用戶配置 postfix
假設有一家數千名員工的公司,該公司通過租用專線上網。現在公司決定
通過 postfix 來建立自己的郵件系統。在這裡我們假設該公司的域為 some.com, 郵件服務器的域名 mail.some.com ,地址為 202.200.180.2 , DNS 服務器的域名為 dns.some.com, 地址為 202.200.180.1 。
1. 配置 DNS 服務器,設置 MX 記錄指向 mail.some.com 。相關的配置文件
為 /var/named/some.com( 假設其 zone 文件就叫 some.com, 有關 DNS 配置的內容請參看本書的相關章節 ) 的內容如下:
@ IN SOA dns.some.com. root.dns.some.com (
2000011307 ; serial
28800 ; refresh, seconds
14400 ; retry, seconds
3600000 ; expire, seconds
86400 ; minimum, seconds
)
@ IN NS dns.some.com.
@ IN A 202.200.180.1
@ IN MX 10 mail.some.com.
localhost IN A 127.0.0.1
dns IN A 202.200.180.1
mail IN A 202.200.180.2
host1 IN A 202.200.180.3
host2 IN A 202.200.180.4
2. 配置postfix,其配置文件及相關的解釋如下:
#設置一般的路徑信息
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_spool_directory = /var/spool/mail
#設置郵件及郵件隊列的所有者為postfix
mail_owner = postfix
#設置郵件服務器的主機名
myhostname = mail.some.com
#設置mydomain、myorigin和mydomain參數
mydomain = some.com
myorigin =$mydomain
mydestination = $mydomain
#設置postfix服務監聽的端口
inet_interfaces = all
#設置本地收件人的用戶名查詢手段,缺省是查詢/etc/passwd文件
#和別名數據庫
local_recipient_maps = $alias_maps unixasswd.byname
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
#設置最終的本地投遞代理程序,在這裡我們使用流行的procmail
mailbox_command = /usr/bin/procmail
#設置該值為$mydomain以便客戶端的連接
relay_domains = $mydomain
mynetworks = 202.200.180.0/24
#設置向用戶顯示的主機名和版本信息
smtpd_banner = $myhostname ESMTP $mail_name
#對於並發進程的限制,保持系統缺省值就可以滿足要求了。
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10
#如果你不知道你在做什麼,最好不要改變下面的設置
debug_peer_level = 2
debugger_command =
PATH=/usr/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
3. 在RedHat中我們通常使用imap作為pop3服務器,可以通過rpm -q imap
命令查看系統有沒有安裝imap。如果沒有安裝則插入linux光盤,用rpm -ivh imap-4.5-4.rpm 進行安裝。
4. 缺省地,pop3服務器是由inet 啟動的,所以必須去掉/etc/inetd.conf文
件中有關pop3的一行注釋。如下所示:
pop-3 stream tcp nowait root /usr/sbin/ipop3d ipop3d
5. 重新啟動inet服務器,啟動postfix:
#/etc/rc.d/init.d/inet restart
#postfix start
5.3在防火牆內部配置postfix
假設一公司通過租用專線上網,公司內部使用192.168.0.0的私有ip, 然後通過防火牆(雙宿主主機)的ip欺騙上網,公司的郵件服務器(mail.some.com)也在內部網中,也使用私有ip。 我們假設在防火牆上進行了 端口轉發,可以將 Internet 對防火牆 25 端口的請求包轉發到內部的郵件服務器上,並且運行 DNS 服務的防火牆的 MX 記錄指向防火牆本身。
在這個例子中,我想著重說明的是有關映射文件的用法。 main.cf 配置文件和相關的解釋如下所示:
#表明自己的身份
myhostname = mail.some.com
mydomain = some.com
mydestination = $mydomain, $myhostname, localhost.$mydomain
myorigin = $mydomain
#讓 postfix 監聽所有接口
inet_interfaces = all
#通過 mynetworks 參數接受內部網用戶的 SMTP 連接請求
mynetworks = 192.168.0.0/8
#向 postfix 管理員報告的信息量
notify_classes = resource, software, bounce, policy
#如果客戶端的 ip 地址符合 $maps_rbl_domains 參數中列出的則拒絕之
maps_rbl_domains = rbl.maps.vix.com, dul.maps.vix.com
#對可以連接的客戶端進行嚴格的限制
smtpd_client_restrictions =
#客戶端 ip 符合 $mynetworks 定義的范圍則接受連接
permit_mynetworks,
#根據 access 的查詢結果判斷客戶端連接的合法性
check_client_access hash:/etc/postfix/access,
#拒絕 ip 符合 $maps_rbl_domains 定義范圍的連接
reject_maps_rbl,
#如果客戶端在 DNS 中沒有記錄則拒絕連接,要慎用
reject_unknown_hostname
#通過發件人的地址進行限制
smtpd_sender_restrictions =
permit_mynetworks,
check_sender_access hash:/etc/postfix/access
#設置虛擬主機數據庫,別忘了執行 "postmap virtual" 進行格式轉換
virtual_maps = hash:/etc/postfix/virtual
#對無系統帳號的郵件進行轉發設置,如離開公司的員工
relocated_maps = hash:/etc/postfix/relocated
#設置別名數據庫
alias_maps = hash:/etc/postfix/aliases
# 我們使用 smtp 投遞代理
default_transport = smtp
# 一些常規設置
mail_owner = postfix
default_privs = nobody
#設置路徑信息
queue_directory = /var/spool/postfix
program_directory = /usr/libexec/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_spool_directory = /var/spool/mail
mailbox_command = /usr/bin/procmail
#並發連接設置
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10
然後,我們執行以下命令:
#進入 postfix 配置目錄
cd /etc/postfix
#用 newaliases 初始化別名數據庫
newaliases
#用postmap分別建立virtual、access和relocated查詢數據庫
postmap virtual
postmap access
postmap relocated
#啟動postfix
/etc/rc.d/init.d/postfix start
現在我們來看看virtual、access和reloacted幾個查詢文件的格式,下面是這幾個文件的示例和注釋:
#virtual文件示例
#假設在這個例子中我們有個虛擬域為other.com
other.com
#access 文件示例
#如果符合前面的條件則進行後面操作,可以有三種操作:
#1. [45]XX $messag :拒絕接受並且向客戶端顯示預定義的信息
#2. REJECT:拒絕接受,不顯示信息
#3. OK允許連接
ispy99@noman.com.cn 550 Go away
friend.com OK
202.192 REJECT
#relocated 文件示例
#該文件主要是將發給無系統帳號的郵件進行轉發
who@some.com onetwo@newone.com
六、 postfix中的命令行工具及其它
下面我們來看一看postfix的命令行工具,通過這些工具的使用可能會使你
對postfix的管理更簡單。
6.1 sendmail 兼容的命令行工具
1. mailq 對郵件隊列文件進行列表。表中的每一個條目包含有以下信息:
隊列文件 ID 、郵件的大小、到達的時間、發件人、收件人和投遞延遲的原因(如果投遞有延遲的話)。該命令主要是與 showq 後台程序通信來獲取隊列文件的相關信息。該命令無參數。
2. newaliases 該工具進行別名數據庫的初始化。如果沒有指定數據庫的類
型,則使用系統默認的數據庫類型(在 linux 下為 hash )。該命令可以不帶參數執行。
6.2 postfix自帶的命令行工具
1. postcat 打印郵件隊列文件的內容。後面界要顯示的隊列文件名,可以
帶一個 -v 的參數進行冗余顯示。
2. postconf 打印配置參數設置後的值或postfix的其他信息。
-d 打印配置參數的缺省值。
-m 列出所有支持的查詢表類型。
不帶參數則打印配置參數設置後的值。
3. postmap 建立 postfix 查詢數據庫。在 linux 下可以直接跟上原始文件
而不帶任何參數來建立該數據庫。
6.3 postfix的日志
postfix的日志文件位於/etc/log/maillog, 文件中包含有postfix的啟動信息、出錯信息以及同其他SMTP服務器的會話等等。如下所示:
Sep 10 05:54:17 mail postfix/smtpd[5072]: disconnect from unknown[204.140.244.150]
Sep 10 06:06:00 mail postfix/qmgr[467]: 50D403DF8: from=, size=6591 (queue active)
Sep 10 06:11:06 mail postfix/smtp[5085]: connect to bjmx2.163.net[202.108.255.241]: read timeout (port 25)
Sep 10 06:16:07 mail postfix/smtp[5085]: connect to bjmx3.163.net[202.108.255.242]: read timeout (port 25)
Sep 10 06:21:08 mail postfix/smtp[5085]: connect to bjmx1.163.net[202.108.255.240]: read timeout (port 25)
6.4 在postfix中使用MySQL數據庫
Scott Cotton 和 Joshua Marcus寫了一段可以在postfix中添加mysql映射類型的代碼,從而我們可以將postfix查詢的別名數據庫等數據存儲在mysql數據庫 中,讓postfix進行mysql查詢來得到結果。 這樣做將有助於提供 postfix 的運行效率, 有其對需要不斷對映射數據的站點特別有用。
1.為 postfix 添加識別 mysql 數據庫映射的功能
a. 由於這段代碼使用了 mysql 客戶端庫,所以我們必須安裝 mysql 的開包。
可以到www.redhat.com等linux相關站點下載mysql?/a>}發包,也可以從某些linux的資源光盤中取得mysql的開發包,如MySQL-client-3.22.30-1.i386.rpm。
b. 安裝該開發包:
rpm -ivh MySQL-client-3.22.30-1.i386.rpm
c. 下載postfix的源代碼包,根據本章“3.1源代碼包的安裝”的提示進行
安裝,但是注意在執行make命令之前先執行以下命令:
make -f Makefile.init makefiles CCARGS=-DHAS_MYSQL -I /usr/include/mysql
AUXLIBS=/usr/lib/mysql/libmysqlclient.a -lm
6.5. 配置postfix使用mysql數據庫映射
我們以alias_maps進行說明。在main.cf中指定:
alias_maps = mysql:/etc/postfix/mysql-aliases.cf
6.6 編輯mysql-aliases.cf
#首先指定登錄到mysql服務器的用戶名和密碼
user = your_user_name
password = your_password
#連接的數據庫名稱
dbname = your_database_name
#查詢的表名
table = mytable
#添加表的字段名稱
#forward_addr為轉發地址
#alias為別名數據
select_field=forward_addr
where_field=alias
#添加附加的查詢條件
additional_conditions=and status=paid
#指定要連接的MySQL服務器
hosts=your.mysql.server
這樣,當發生一個查詢的時候,postfix是以這樣的SQL語句進行查詢的:
select forward_addr from mytable where alias=$lookup and status=paid
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com