4.1 postfix的配置文件結(jié)構(gòu)
postfix的配置文件位于/etc/postfix下,安裝完postfix以后,我們可以通過(guò)ls命令查看postfix的配置文件:
[root@mail postfix]# ls
install.cf main.cf master.cf postfix-script
這四個(gè)文件就是postfix最基本的配置文件,它們的區(qū)別在于:
mail.cf:是postfix主要的配置文件。
Install.cf:包含安裝過(guò)程中安裝程序產(chǎn)生的postfix初始化設(shè)置。
master.cf:是postfix的master進(jìn)程的配置文件,該文件中的每一行都是用來(lái)配置postfix的組件進(jìn)程的運(yùn)行方式。
postfix-script:包裝了一些postfix命令,以便我們?cè)趌inux環(huán)境中安全地執(zhí)行這些postfix命令。
4.2 postfix的基本配置
postfix大約有100個(gè)配置參數(shù),這些參數(shù)都可以通過(guò)main.cf 指定。配置的格式是這樣的,用等號(hào)連接參數(shù)和參數(shù)的值。如:
myhostname = mail.mydomain.com
等號(hào)的左邊是參數(shù)的名稱,等號(hào)的右邊是參數(shù)的值; 當(dāng)然,我們也可以在參數(shù)的前面加上$來(lái)引用該參數(shù),如:
myorigin = $myhostname
雖然postfix有100個(gè)左右的參數(shù),但是 postfix為大多數(shù)的參數(shù)都設(shè)置了缺省值,所以在讓postfix正常為你服務(wù)之前,你只需要配置為數(shù)不多的幾個(gè)參數(shù)。下面我們一起來(lái)看一看這些基本的postfix參數(shù)。需要注意的是,一旦你更改了main.cf文件的內(nèi)容,則必須運(yùn)行 postfix reload命令使其生效。
1. myorigin
myorigin參數(shù)指明發(fā)件人所在的域名。如果你的用戶的郵件地址為user@domain.com,則該參數(shù)指定@后面的域名。缺省地, postfix使用本地主機(jī)名作為myorigin,但是建議你最好使用你的域名,因?yàn)檫@樣更具有可讀性。比如:安裝postfix的主機(jī)為 mail.domain.com則我們可以這樣指定myorigin:
myorigin = domain.com
當(dāng)然我們也可以引用其他參數(shù),如:
myorigin = $mydomain
2. mydestination
mydestination參數(shù)指定postfix接收郵件時(shí)收件人的域名,換句話說(shuō),也就是你的postfix系統(tǒng)要接收什么樣的郵件。比如:你的用戶的郵件地址為user@domain.com, 也就是你的域?yàn)閐omain.com, 則你就需要接收所有收件人為user_name@domain.com的郵件。與myorigin一樣,缺省地,postfix使用本地主機(jī)名作為 mydestination。如:
mydestination = $mydomain
mydestination = domain.com
3. notify_classes
在postfix系統(tǒng)中,必須指定一個(gè)postfix系統(tǒng)管理員的別名指向一個(gè)用戶,
只有這樣,在用戶遇到問(wèn)題時(shí)才有報(bào)告的對(duì)象,postfix也才能將系統(tǒng)的問(wèn)題報(bào)告給管理員。notify_classes參數(shù)就是用來(lái)指定向postfix管理員報(bào)告錯(cuò)誤時(shí)的信息級(jí)別。共有以下幾種級(jí)別:
bounce:將不可以投遞的郵件的拷貝發(fā)送給postfix管理員。出于個(gè)人隱私的緣故,該郵件的拷貝不包含信頭。
2bounce:將兩次不可投遞的郵件拷貝發(fā)送給postfix管理員。
delay:將郵件的投遞延遲信息發(fā)送給管理員,僅僅包含信頭。
policy:將由于UCE規(guī)則限制而被拒絕的用戶請(qǐng)求發(fā)送給postfix管理員,包含整個(gè)SMTP會(huì)話的內(nèi)容。
protocol:將協(xié)議的錯(cuò)誤信息或用戶企圖執(zhí)行不支持的命令的記錄發(fā)送給postfix管理員。同樣包含整個(gè)SMTP會(huì)話的內(nèi)容。
resource:將由于資源錯(cuò)誤而不可投遞的錯(cuò)誤信息發(fā)送給postfix管理員,比如:隊(duì)列文件寫錯(cuò)誤等等。
software:將由于軟件錯(cuò)誤而導(dǎo)致不可投遞的錯(cuò)誤信息發(fā)送給postfix管理員。
缺省值為:
notify_classes = resource, software
4.myhostname
myhostname 參數(shù)指定運(yùn)行postfix郵件系統(tǒng)的主機(jī)的主機(jī)名。缺省地,該值被設(shè)定為本地機(jī)器名。你也可以指定該值,需要注意的是,要指定完整的主機(jī)名。如:
myhostname = mail.domain.com
5.mydomain
mydomain參數(shù)指定你的域名,缺省地,postfix將myhostname的第一部分刪除而作為mydomain的值。你也可以自己指定該值,如:
mydomain = domain.com
6.mynetworks
mynetworks 參數(shù)指定你所在的網(wǎng)絡(luò)的網(wǎng)絡(luò)地址,postfix系統(tǒng)根據(jù)其值來(lái)區(qū)別用戶是遠(yuǎn)程的還是本地的,如果是本地網(wǎng)絡(luò)用戶則允許其訪問(wèn)。你可以用標(biāo)準(zhǔn)的A、B、C類網(wǎng)絡(luò)地址,也可以用CIDR(無(wú)類域間路由)地址來(lái)表示,如:
192.168.1.0/24
192.168.1.0/26
7.inet_interfaces
inet_interfaces 參數(shù)指定postfix系統(tǒng)監(jiān)聽(tīng)的網(wǎng)絡(luò)接口。缺省地,postfix監(jiān)聽(tīng)所有的網(wǎng)絡(luò)接口。如果你的postfix運(yùn)行在一個(gè)虛擬的ip地址上,則必須指定其監(jiān)聽(tīng)的地址。如:
inet_interfaces = all
inet_interface = 192.168.1.1
4.3 postfix的UCE(unsolicited commercial email)控制
所謂UCE控制就是指控制postfix接收或轉(zhuǎn)發(fā)來(lái)自于什么地方的郵件。
缺省地,postfix轉(zhuǎn)發(fā)符合以下條件的郵件:
* 來(lái)自客戶端ip地址符合$mynetworks的郵件。
* 來(lái)自客戶端主機(jī)名符合$relay_domains及其子域的郵件。
* 目的地為$relay_domains及其子域的郵件。
缺省地,postfix接受符合以下條件的郵件:
* 目的地為$inet_interfaces的郵件。
* 目的地為$mydestination的郵件。
* 目的地為$virtual_maps的郵件。
但是我們也可以通過(guò)下面的規(guī)則來(lái)實(shí)現(xiàn)更強(qiáng)大的控制功能。
1. 信頭過(guò)濾
通過(guò)header_checks參數(shù)限制接收郵件的信頭的格式,如果符合指定的格式,則拒絕接收該郵件。可以指定一個(gè)或多個(gè)查詢列表,如果新郵件的信頭符合列表中的某一項(xiàng)則拒絕該接收郵件。如:
header_checks = regexp:/etc/postfix/header_checks
header_checks = pcre:/etc/postfix/header_checks
缺省地,postfix不進(jìn)行信頭過(guò)濾。
2.客戶端主機(jī)名/地址限制
通過(guò)smtpd_client_restrictions參數(shù)限制可以向postfix發(fā)起SMTP 連接的客戶端的主機(jī)名或ip地址。可以指定一個(gè)或多個(gè)參數(shù)值,中間用逗號(hào)隔開(kāi)。限制規(guī)則是按照查詢的順序進(jìn)行的,第一條符合條件的規(guī)則被執(zhí)行。可用的規(guī)則有:
reject_unknown_client:如果客戶端的ip 地址在DNS中沒(méi)有PTR記錄則拒絕轉(zhuǎn)發(fā)該客戶端的連接請(qǐng)求。可以用 unknown_client_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為450)。如果你有用戶沒(méi)有作DNS記錄則不要啟用該選項(xiàng)。
permit_mynetworks:如果客戶端的ip地址符合$mynetworks參數(shù)定義的范圍則接受該客戶端的連接請(qǐng)求,并轉(zhuǎn)發(fā)該郵件。
check_client_access maptype:mapname:根據(jù)客戶端的主機(jī)名、父域名、ip地址或?qū)儆诘木W(wǎng)絡(luò)搜索access數(shù)據(jù)庫(kù)。如果搜索的結(jié)果為REJECT 或者 '[45]XX text' 則拒絕該客戶端的連接請(qǐng)求;如果搜索的結(jié)果為OK、RELAY 或數(shù)字則接受該客戶端的連接請(qǐng)求,并轉(zhuǎn)發(fā)該郵件。。可以用access_map_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為 554)。
reject_maps_rbl:如果客戶端的網(wǎng)絡(luò)地址符合$maps_rbl_domains參數(shù)的值則拒絕該客戶端的連接請(qǐng)求。可以用maps_rbl_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為554)。
示例:
smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client
該參數(shù)的缺省值為:
smtpd_client_restrictions =
也即接收來(lái)自任何客戶端的SMTP連接。
3. 是否請(qǐng)求HELO命令
可以通過(guò)smtpd_helo_required參數(shù)指定客戶端在SMTP會(huì)話的開(kāi)始是否發(fā)送一個(gè)HELO命令。你可以指定該參數(shù)的值為yes或no。缺省值為:
smtpd_helo_required = no
4. HELO主機(jī)名限制
可以通過(guò)smtpd_helo_restrictions參數(shù)指定客戶端在執(zhí)行HELO命令時(shí)發(fā)送給postfix的主機(jī)名。缺省地, postfix 接收客戶端發(fā)送的任意形式的主機(jī)名。可以指定一個(gè)或多個(gè)參數(shù)值,中間用逗號(hào)隔開(kāi)。限制規(guī)則是按照查詢的順序進(jìn)行的,第一條符合條件的規(guī)則被執(zhí)行。可用的規(guī)則有:
reject_invalid_hostname:如果HELO命令所帶的主機(jī)名參數(shù)不符合語(yǔ)法規(guī)范則拒絕客戶機(jī)的連接請(qǐng)求。可以用invalid_hostname_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為501)。
permit_naked_ip_address:RFC要求客戶端的HELO命令包含的ip地址放在方括號(hào)內(nèi),你可以用permit_naked_ip_address參數(shù)取消該限制。因?yàn)橛械膍ail客戶端不遵守該RFC的規(guī)定。
reject_unknown_hostname:如果客戶端執(zhí)行HELO命令時(shí)的主機(jī)名在DNS中沒(méi)有相應(yīng)的A 或 MX 記錄則拒絕該客戶端的連接請(qǐng)求。可以用invalid_hostname_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為450)。
reject_non_fqdn_hostname:如果客戶端執(zhí)行HELO命令時(shí)的主機(jī)名不是RFC規(guī)定的完整的域名則拒絕客戶端的連接請(qǐng)求。可以用invalid_hostname_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為504)。
check_helo_access maptype:mapname:根據(jù)客戶端HELO的主機(jī)名、父域名搜索access數(shù)據(jù)庫(kù)。如果搜索的結(jié)果為REJECT 或者 '[45]XX text' 則拒絕該客戶端的連接請(qǐng)求;如果搜索的結(jié)果為OK、RELAY 或數(shù)字則接受該客戶端的連接請(qǐng)求。可以用access_map_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為554)。
示例:
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname
5. RFC 821信頭限制
RFC 821對(duì)郵件的信頭做了嚴(yán)格的規(guī)定,但是廣泛使用的sendmail并不支
持該規(guī)定,所以對(duì)于該參數(shù)我們只能說(shuō)不,即:
strict_rfc821_envelopes = no
6. 通過(guò)發(fā)件人地址進(jìn)行限制
可以用smtpd_sender_restrictions參數(shù)通過(guò)發(fā)件人在執(zhí)行MAIL FROM命令時(shí)提供的地址進(jìn)行限制。可以指定一個(gè)或多個(gè)參數(shù)值,中間用逗號(hào)隔開(kāi)。限制規(guī)則是按照查詢的順序進(jìn)行的,第一條符合條件的規(guī)則被執(zhí)行。可用的規(guī)則有:
reject_unknown_sender_domain:如果MAIL FROM命令提供的主機(jī)名在DNS中沒(méi)有相應(yīng)的A 或 MX 記錄則拒絕該客戶端的連接請(qǐng)求。可以用unknown_address_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為450)。
check_sender_access maptype:mapname:根據(jù)MAIL FROM命令提供的主機(jī)名、父域搜索access數(shù)據(jù)庫(kù)。如果搜索的結(jié)果為REJECT 或者 '[45]XX text' 則拒絕該客戶端的連接請(qǐng)求;如果搜索的結(jié)果為OK、RELAY 或數(shù)字則接受該客戶端的連接請(qǐng)求。可以用access_map_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為554)。可以通過(guò)該參數(shù)過(guò)濾來(lái)自某些不受歡迎的發(fā)件人的郵件。
reject_non_fqdn_sender:如果MAIL FROM命令提供的主機(jī)名不是RFC規(guī)定的完整的域名則拒絕客戶端的連接請(qǐng)求。可以用non_fqdn_reject_code 參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為504)。
缺省地,postfix接受來(lái)自任何發(fā)件人的郵件。
示例:
smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain
7. 通過(guò)收件人地址進(jìn)行過(guò)濾
可以用smtpd_recipient_restrictions參數(shù)通過(guò)發(fā)件人在執(zhí)行RCPT TO命令時(shí)提供的地址進(jìn)行限制。缺省值為:
smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains
可以指定一個(gè)或多個(gè)參數(shù)值,中間用逗號(hào)隔開(kāi)。限制規(guī)則是按照查詢的順序進(jìn)行的,第一條符合條件的規(guī)則被執(zhí)行。可用的規(guī)則有:
check_relay_domains:如果符合以下的條件,則接受SMTP連接請(qǐng)求,否則拒絕該連接,可以用relay_domains_reject_code 參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為504)。
* 客戶端主機(jī)名符合$relay_domains及其子域
* 目的地為$inet_interfaces、$mydestination或$virtual_maps
permit_auth_destination:不管客戶端的主機(jī)名,只要符合以下的條件,就
接受SMTP連接請(qǐng)求:
* 解析后的目標(biāo)地址符合$relay_domains及其子域
* 解析后的目標(biāo)地址符合$inet_interfaces、$mydestination或$virtual_maps
reject_unauth_destination:不管客戶端的主機(jī)名,只要符合以下的條件,就拒絕該客戶端SMTP連接請(qǐng)求:
* 解析后的目標(biāo)地址符合$relay_domains及其子域
* 解析后的目標(biāo)地址符合$inet_interfaces、$mydestination或$virtual_maps
check_recipient_access:根據(jù)解析后的目標(biāo)地址、父域搜索access數(shù)據(jù)庫(kù)。如果搜索的結(jié)果為REJECT 或者 '[45]XX text' 則拒絕該客戶端的連接請(qǐng)求;如果搜索的結(jié)果為OK、RELAY 或數(shù)字則接受該客戶端的連接請(qǐng)求。可以用access_map_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為554)。
reject_unknown_recipient_domain:如果收件人的郵件地址在DNS中沒(méi)有相應(yīng)的A 或 MX 記錄則拒絕該客戶端的連接請(qǐng)求。可以用unknown_address_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為450)。
reject_non_fqdn_recipient:如果發(fā)件人在執(zhí)行RCPT TO命令時(shí)提供的地址
不是完整的域名則拒絕其SMTP連接請(qǐng)求。可以用The non_fqdn_reject_code參數(shù)指定返回給客戶機(jī)的錯(cuò)誤代碼(缺省為504)。
4.4 posftfix的性能控制
之所以對(duì)postfix的性能進(jìn)行控制,是為了在遇到郵件風(fēng)暴時(shí)保證postfix可以正常運(yùn)行。通常,我們可以通過(guò)對(duì)下列postfix 參數(shù)的配置來(lái)調(diào)節(jié)postfix的性能,這些參數(shù)都是通過(guò)mail.cf配置文件進(jìn)行配置的,修改以后不要忘了運(yùn)行postfix reload命令來(lái)使配置生效。
1. 進(jìn)程數(shù)限制
可以通過(guò)default_process_limit 參數(shù)來(lái)控制postfix系統(tǒng)同時(shí)可以運(yùn)行的最大進(jìn)程數(shù)目。缺省值是50個(gè)。
2. 對(duì)同一目標(biāo)主機(jī)的并發(fā)連接限制
當(dāng)向同一目標(biāo)主機(jī)發(fā)出SMTP連接時(shí),postfix初始化發(fā)出兩個(gè)SMTP連接,如果投遞成功則增加并發(fā)的SMTP連接數(shù)目,遇到擁塞時(shí)又減少并發(fā)連接的數(shù)目。postfix中通過(guò)以下的參數(shù)對(duì)同一目標(biāo)主機(jī)的并發(fā)連接進(jìn)行控制:
* initial_destination_concurrency:控制對(duì)同一目標(biāo)主機(jī)的初始化并發(fā)連接數(shù)目。缺省值為2。
* default_destination_concurrency_limit:控制初始化連接后對(duì)同一目標(biāo)主機(jī)的最大并發(fā)連接數(shù)目。缺省值為10。
* local_destination_concurrency_limit:控制對(duì)同一本地收件人的最大同時(shí)投遞的郵件數(shù)目。缺省值為2,因?yàn)閷?duì)本地同一收件人投遞郵件時(shí)投遞工作只能一個(gè)接一個(gè)的進(jìn)行,所以設(shè)得在大也沒(méi)用。
3. 對(duì)同一封郵件的收件人數(shù)目限制
通過(guò)default_destination_recipient_limit參數(shù)來(lái)控制postfix的投遞代理(如
smtp進(jìn)程)可以將同一封郵件發(fā)送給多少個(gè)收件人。缺省值為50。也可以用明確指出該投遞代理的參數(shù)來(lái)覆蓋該缺省值。如用smtpd_recipient_limit來(lái)指定smtp投遞代理可以將同一封郵件發(fā)送給多少個(gè)收件人,該參數(shù)的缺省值為1000。
4. 推遲投遞控制
通過(guò)defer_transports參數(shù),我們可以推遲投遞該參數(shù)指定的郵件直到postfix明確的提出投遞要求。下面我們看一個(gè)例子:
有一個(gè)小型的局域網(wǎng),用戶都將郵件發(fā)送給局域網(wǎng)內(nèi)部的一臺(tái)postfix郵件服務(wù)器,然后通過(guò)在該服務(wù)器上撥號(hào)將郵件發(fā)送出去。這時(shí)我們可以這樣指定該參數(shù)的值:
defer_transports = smtp
該語(yǔ)句表示postfix推遲投遞所有的郵件直到執(zhí)行sendmail -q命令,這樣我們就可以在ppp的腳本中加上sendmail -q,以便在撥號(hào)成功后讓postfix開(kāi)始投遞郵件。