Postfix郵件架設詳解

 

前提:架設好dns服務 (linux.markcao.com /192.168.2.101)

chkconfig –level 2345 named on

chkconfig –list named

iptables –L

service iptables stop

需注意/etc/resolv.conf裏要有search  markcao.com對應。

如無法啓動postfix,可在文件/etc/hosts里加

127.0.0.1    localhost.localdomain localhost

 

需安裝:yum  install  postfix

        yum  install  dovecot

        yum  install  mysql*

        yum  install  perl*

 

postfix最基本的配置文件,它們的區別在於:

mail.cfpostfix主要的配置文件。

Install.cf包含安裝過程中安裝程序產生的postfix初始化設置。

master.cfpostfixmaster進程的配置文件,該文件中的每一行都是用來配置postfix的組件進程的運行方式。

postfix-script包裝了一些postfix命令,以便我們在linux環境中安全地執行這些postfix命令。

 

需更改:

vim /etc/postfix/main.cf

69   myhostname=linux.markcao.com     指向真正的域名

79   mydomain=markcao.com      地機郵件主機所在的域

95         myorigin=$myhostname     設置由本機寄出的郵件所使用的域名或主機名稱

96         myorigin=$mydomain

113  inet_interfaces=all      主機監聽的網絡接口

164  mydestination=$myhostnamelocalhost.$mydomainlocalhost$mydomain

                mail.$mydominwww.$mydomainftp.$mydomain

                          設置能夠收信的主機名稱”, 你的 postfix 只有在發現 mydestination 這個項目中有寫入 的主機名稱做爲收信主機時,纔會將該封信件收下來

248  mynetworks_style=subnet   # class =>與伺服器位於同一級IP網路的主機都可以使用代轉服務
# subnet =>
所在網域的任一個IP都可以使用代轉服務
# host =>
僅開放localhost爲信任可代轉的主機

262  mynetworks=192.168.2.0/24127.0.0.0/8     本地郵件服務器信賴的網絡

296  realy_domains=$mydestination        參數決定了Postfix 可以幫忙傳遞哪些域的郵件

314  relayhost=$mydomain

388  alias_maps=hash:/etc/aliases

399  alias_database=hash:/etc/aliases

421  home_mailbox=maildir/     指定postfix在進行郵件投遞時使用與Qmail類似的Maildir方式,此方式每封郵件是一個獨立的文件,比較易於管理,另外IMAP默認也是在用戶目錄的Maildir中訪問郵箱的。在選Maildir方式時,mailbox_command選項應該置空。

429  mail_spool_directory=/var/spool/mail

 notify_classes = resource, software  缺省值

postfix系統中,必須指定一個postfix系統管理員的別名指向一個用戶,

只有這樣,在用戶遇到問題時纔有報告的對象,postfix也才能將系統的問題報告給管理員。notify_classes參數就是用來指定向postfix管理員報告錯誤時的信息級別。共有以下幾種級別:

bounce:將不可以投遞的郵件的拷貝發送給postfix管理員。出於個人隱私的緣故,該郵件的拷貝不包含信頭。

2bounce:將兩次不可投遞的郵件拷貝發送給postfix管理員。

delay:將郵件的投遞延遲信息發送給管理員,僅僅包含信頭。

policy:將由於UCE規則限制而被拒絕的用戶請求發送給postfix管理員,包含整個SMTP會話的內容。

protocol:將協議的錯誤信息或用戶企圖執行不支持的命令的記錄發送給postfix管理員。同樣包含整個SMTP會話的內容。

resource:將由於資源錯誤而不可投遞的錯誤信息發送給postfix管理員,比如:隊列文件寫錯誤等等。

software:將由於軟件錯誤而導致不可投遞的錯誤信息發送給postfix管理員。

 

cat  /etc/postfix/main.cf |grep –v “#” |more   (等同於postconf -n

netstat –natp |grep 25

ps aux |grep postfix

 

 

vim /etc/dovecot.conf

17        protocols=imap pop3

38  protocol imap {

        listen=*:143

       }

protocol pop3 {

    listen=*:110

   }

129 login_dir=/var/run/dovecot/login

142 login_user=dovecot

208 mail_location=maildir:/maildir

 

service dovecot start

ps aux |grep dovecot

netstat –natp |grep 110/143

service postfix restart

service dovecot restart

如沒註冊到外網,客戶端要將網關設爲主機ip

 

postfixUCEunsolicited 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' 則拒絕該客戶端的連接請求;如果搜索的結果爲OKRELAY 或數字則接受該客戶端的連接請求,並轉發該郵件。。可以用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命令。你可以指定該參數的值爲yesno。缺省值爲:

smtpd_helo_required = no

4. HELO主機名限制

  可以通過smtpd_helo_restrictions參數指定客戶端在執行HELO命令時發送給postfix的主機名。缺省地, postfix 接收客戶端發送的任意形式的主機名。可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規則有:

reject_invalid_hostname:如果HELO命令所帶的主機名參數不符合語法規範則拒絕客戶機的連接請求。可以用invalid_hostname_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲501)。

permit_naked_ip_addressRFC要求客戶端的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' 則拒絕該客戶端的連接請求;如果搜索的結果爲OKRELAY 或數字則接受該客戶端的連接請求。可以用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' 則拒絕該客戶端的連接請求;如果搜索的結果爲OKRELAY 或數字則接受該客戶端的連接請求。可以用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' 則拒絕該客戶端的連接請求;如果搜索的結果爲OKRELAY 或數字則接受該客戶端的連接請求。可以用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)。

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郵件服務器,然後通過在該服務器上撥號將郵件發送出去。這時我們可以這樣指定該參數的值:

defer_transports = smtp

  該語句表示postfix推遲投遞所有的郵件直到執行sendmail -q命令,這樣我們就可以在ppp的腳本中加上sendmail -q,以便在撥號成功後讓postfix開始投遞郵件

 

 

虛擬用戶:main.cf里加入virtual_maps = hash:/etc/postfix/virtual, 這個是虛擬域的位置,還要往這個文件里加入內容,格式爲:

  markcao.net           anything

  [email protected]      root

  之後,用postmap命令生成虛擬域數據庫:

  postmap /etc/postfix/virtual

  前面是虛擬用戶,後面是系統用戶,其實收郵件還是系統用戶收發的,只是允許虛擬用戶對其操作而已

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章