postfix小結

 

 
postfix簡介
 
1、postfix是使用最廣泛的sendmail的成功的一個替代品,在Internet世界中,大部分的電子郵件都是通過sendmail來投遞的,大約有100萬用戶使用sendmail,每天投遞上億封郵件。這真是一個讓人吃驚的數字。Postfix試圖更快、更容易管理、更安全,同時還與sendmail保持足夠的兼容性。
2、postfix的特點
(1)postfix是免費的
(2)性能好,更快,性能比sendmail快三倍
(3)兼容性好  postfix是sendmail兼容的,從而使sendmail用戶可以很方便地遷移到postfix
(4)更健壯  重負荷可正常工作,當超出可用內存時,postfix會自動減少進程數目
(5)更靈活 postfix由許多小程序組成,每程序完成特定功能
(6)postfix具有多層防禦結構,可以有效地抵禦惡意***者
這些postfix進程是可以配置的,我們可以配置每個進程運行的數目,可重用的次數,生存的時間等等。通過靈活的配置特性可以使整個系統的運行成本大大降低。
  1.2.1 postfix的郵件隊列(mail queues)
  postfix有四種不同的郵件隊列,並且由隊列管理進程統一進行管理:
  1. maildrop:本地郵件放置在maildrop中,同時也被拷貝到incoming中。
  2. incoming:放置正在到達或隊列管理進程尚未發現的郵件。
  3. active:放置隊列管理進程已經打開了並正準備投遞的郵件,該隊列有長度的限制。
  4. deferred:放置不能被投遞的郵件。
  隊列管理進程僅僅在內存中保留active隊列,並且對該隊列的長度進行限制,這樣做的目的是爲了避免進程運行內存超過系統的可用內存。
 
  1.2.3 postfix對無法投遞的郵件的處理
  當一封郵件第一次不能成功投遞時,postfix會給該郵件貼上一個將來的時間郵票。郵件隊列管理程序會忽略貼有將來時間郵票的郵件。時間郵票到期時,postfix會嘗試再對該郵件進行一次投遞,如果這次投遞再次失敗,postfix就給該郵件貼上一個兩倍於上次時[間郵票的時間郵票,等時間郵票到期時再次進行投遞,依此類推。當然,經過一定次數的嘗試之後,postfix會放棄]對該郵件的投遞,返回一個錯誤信息給該郵件的發件人。
  1.2.4 postfix對不可到達的目的地郵件的處理
  postfix會在內存中保存一個有長度限制的當前不可到達的地址列表。這樣就避免了對那些目的地爲當前不可到達地址的郵件的投遞嘗試。從而大大提高了系統的性能。
 
 
postfix對郵件的處理過程?
 
  2.1 接收郵件的過程
  當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信息;爲將地址重寫成標準的[email protected]格式進行排列;重信頭中抽出收件人的地址;將郵件投入incoming隊列中,並請求郵件隊列管理進程處理該郵件;請求trivial-rewrite進程將地址轉換成標準的[email protected]格式。
  2.2 投遞郵件的過程
 
      郵件隊列管理進程是整個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是postfix調用外部命令處理郵件的機制.
 
 
      郵件用戶代理MUA(Mail User Agent)是用於發送或許接收電子郵件的客戶端順序。MUA 也可以是一個順序或許腳原模擬了一個典型MUA 正在發送或許接收Email 時的行爲。MUA 正在發送電子郵件時運用SMTP/ESMTP 協議來與一個MTA 對話,正在接收郵件時,運用POP3 協議或許IMAP4 協議。常用的MUA 客戶端軟件有Outlook、Outlook Express、Foxmail、ThunderBird、The Bat!等。
       郵件傳送代理MTA(Mail Transport Agent)的作用是正在不同的主機之間傳送電子郵件,它運用SMTP 協議,罕見的MTA 效勞軟件有sendmail、qmail、Postfix、exim。MTA 接收來自MUA(Mail User Agent 郵件用戶代理)或許是其他MTA、MDA(MailDelivery Agent 郵件投遞代理)的郵件,它解析郵件頭來絕議郵件的接收者。一般,MTA 需求重寫郵件頭,然先查找DNS 一定收件人信箱所正在的遠程主機,並經過網絡發送給其他MTA 或許MDA。
       郵件獲取代理MRA(Mail Retrieval Agent)提求了使MUA 可以遠程獲取電子郵件的效勞,如qpoper、cyrus-imap、courier-imap、dovecot 等,爲了使得郵件存取格式兼容,正在MRA 順序中經常都提求了郵件投遞代理順序MDA。MRA 運用的協議有POP3 和IMAP4 等。POP3 可以運用戶從效勞器下載郵件並離線閱讀。IMAP4 運用於那些沒有外地信箱的用戶,具有遠程操作信箱的才幹。IMAP4 容許多個客戶機器同時訪問一個信箱。原文想象的系統中,Webmail 正在先臺便是經過IMAP4 協議來訪問用戶信箱的。
 
 
 
一、安裝前的準備工作:
 
1、安裝以下開發所用到的rpm包組:
Development Libraries
Development Tools
Legacy Software Development
X Software Development
 
方法:
# yum groupinstall "packge_group_name"
 
2、安裝所需的rpm包,包括以下這些:
httpd, tcl, tcl-devel, libart_lgpl, libart_lgpl-devel, libtool-ltdl, libtool-ltdl-devel, expect
 
3、關閉sendmail,並將它的隨系統自動啓動功能關閉:
# service sendmail stop
# chkconfig sendmail off
 
4、啓動saslauthd服務,並將其加入到自動啓動隊列:
# service saslauthd start
# chkconfig saslauthd on
 
 
5、安裝bind軟件,這樣方便以後域名解析
可在網絡上下載,這裏以本地yum源安裝爲例
yum install bind
yum install caching-nameserver 提供了一些數據文件
rpm -q bind-chroot 確保它沒裝,否則需改路徑
dns服務器比較瞭解了,這裏不過多介紹
提供三個文件,如/etc/named.conf /var/named/wl.com.zone /var/named/172.16.zone
(1)/etc/named.conf內容如下
options {
directory "/var/named";
 forwarders { 172.16.0.1; };
};
 
 
zone "." IN {
type hint;
file "named.ca";
};
 
zone "localhost" IN {
type master;
file "localhost.zone";
};
 
 
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
};
zone "wl.com" IN {
type master;
file "wl.com.zone";
forwarders {};
};
zone "16.172.in-addr.arpa" IN {
type master;
file "172.16.zone";
forwarders {};
};
 
(2)/var/named/wl.com.zone內容如下
$TTL 600
$ORIGIN wl.com.
@          IN      SOA      ns.wl.com.   admin.wl.com. (
   2012032901
   2H  
   20M 
   7D  
   1D) 
      IN       NS        ns  
      IN       MX  10    mail
ns    IN       A        172.16.23.7
mail  IN      A        172.16.23.7
www   IN      CNAME  mail
pop3  IN      CNAME   mail
imap  IN      CNAME   mail
}
 
(3)/var/named/172.16.zone內容如下
 
$TTL 600
@          IN      SOA      ns.wl.com.   admin.wl.com. (
   2012032901
   2H  
   20M 
   7D  
   1D) 
      IN       NS        ns.wl.com.
7.23  IN       PTR       mail.wl.com.
7.23  IN       PTR       ns.wl.com.
}
 
(4)改屬組
 chown  -R :named  /etc/named.conf  /var/named/wl.com.zone /var/named/172.16.zone
(5)啓動測試
  service named configtest
  service named start
 
 
 
 
二、安裝mysql-5.5.20
 
1、準備數據存放的文件系統
 
新建一個邏輯卷,並將其掛載至特定目錄即可。這裏不再給出過程。
 
這裏假設其邏輯卷的掛載目錄爲/mydata,而後需要創建/mydata/data目錄做爲mysql數據的存放目錄。
 
2、新建用戶以安全方式運行進程:
 
# groupadd -r mysql
# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
# chown -R mysql:mysql /mydata/data
 
3、安裝並初始化mysql-5.5.20
 
首先下載平臺對應的mysql版本至本地,這裏是32位平臺,因此,選擇的爲mysql-5.5.19-linux2.6-i686.tar.gz,其下載位置爲ftp://172.16.0.1/pub/Sources/mysql-5.5。
 
# tar xf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local
# cd /usr/local/
# ln -sv mysql-5.5.20-linux2.6-i686  mysql
# cd mysql 
 
# chown -R mysql:mysql  .
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
# chown -R root  .
 
4、爲mysql提供主配置文件:
 
# cd /usr/local/mysql
# cp support-files/my-large.cnf  /etc/my.cnf
 
並修改此文件中thread_concurrency的值爲你的CPU個數乘以2,比如這裏使用如下行:
thread_concurrency = 2
 
另外還需要添加如下行指定mysql數據文件的存放位置:
datadir = /mydata/data
 
 
5、爲mysql提供sysv服務腳本:
 
# cd /usr/local/mysql
# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld
 
添加至服務列表:
# chkconfig --add mysqld
# chkconfig mysqld on
 
而後就可以啓動服務測試使用了。
 
 
爲了使用mysql的安裝符合系統使用規範,並將其開發組件導出給系統使用,這裏還需要進行如下步驟:
 
6、輸出mysql的man手冊至man命令的查找路徑:
 
編輯/etc/man.config,添加如下行即可:
MANPATH  /usr/local/mysql/man
 
7、輸出mysql的頭文件至系統頭文件路徑/usr/include:
 
這可以通過簡單的創建鏈接實現:
# ln -sv /usr/local/mysql/include  /usr/include/mysql
 
8、輸出mysql的庫文件給系統庫查找路徑:
 
# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
 
而後讓系統重新載入系統庫:
# ldconfig
 
9、修改PATH環境變量,讓系統可以直接使用mysql的相關命令。具體實現過程這裏不再給出。
 
 
三、安裝配置postfix
注:添加postfix用戶的id號與組id號一般要大於1000,要記着以方便後面調用
# groupadd -g 2525 postfix
# useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
# groupadd -g 2526 postdrop
# useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop
注:id postfix 確定下
    可到網上載最新的編譯安裝,這裏以postfix-2.9.1.tar.gz爲例:
# tar zxvf postfix-2.9.1.tar.gz   Source/postfix
# cd postfix-2.9.1 編譯器參數     
注:yum list all | grep sasl sasl sasl-devel lib 確保這幾個包已經安裝上
 
# make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl  -DUSE_TLS ' 'AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2  -lssl -lcrypto'
注:這裏是給編譯時指定參數變量,要與mysql結合來指定mysql的一些頭文件和庫文件,如果mysql是yum安裝,路徑要改爲相應目錄,確定下:
ls /usr/include | grep sasl        
yum list all | grep openssl devel裝過
-DUSE_SASL_AUTH                       指定啓用sasl誰功能
-DUSE_CYRUS_SASL -I/usr/include/sasl  指定sasl頭文件安裝位置
AUXLIBS                               指定一些庫文件位置,以便postfix安裝時可找到
-lz -lm                               啓用壓縮功能,和mcrpty功能
 
# make
# make install
 
 
按照以下的提示輸入相關的路徑([]號中的是缺省值,”]”後的是輸入值,省略的表示採用默認值)
 
  install_root: [/] /
  tempdir: [/usr/local/src/ postfix-2.9.1] /tmp/postfix
  config_directory: [/etc/postfix] /etc/postfix
  daemon_directory: [/usr/libexec/postfix] 
  command_directory: [/usr/sbin] 
  queue_directory: [/var/spool/postfix]
  sendmail_path: [/usr/sbin/sendmail]
  newaliases_path: [/usr/bin/newaliases]
  mailq_path: [/usr/bin/mailq]
  mail_owner: [postfix]
  setgid_group: [postdrop]   
    html_directory: [no]            
    manpages: [/usr/local/man]
    readme_directory: [no]
 
   html_directory: [no]  /var/www/html/postfix 如果想使用幫助文檔,httpd服務啓用時可用
    
生成別名二進制文件:
#  newaliases
 
2.進行一些基本配置,測試啓動postfix並進行發信 
# vim /etc/postfix/main.cf
修改以下幾項爲您需要的配置
myhostname = mail.magedu.com
myorigin = magedu.com
mydomain = magedu.com
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.1.0/24, 127.0.0.0/8
 
說明:
myorigin參數用來指明發件人所在的域名,即做發件人地址僞裝;
mydestination參數指定postfix接收郵件時收件人的域名,即您的postfix系統要接收到哪個域名的郵件;定義本地負責解析的域,是否中繼
myhostname 參數指定運行postfix郵件系統的主機的主機名,默認情況下,其值被設定爲本地機器名;
mydomain參數指定您的域名,默認情況下,postfix將myhostname的第一部分刪除而作爲mydomain的值;
mynetworks 參數指定你所在的網絡的網絡地址,postfix系統根據其值來區別用戶是遠程的還是本地的,如果是本地網絡用戶則允許其訪問;
inet_interfaces 參數指定postfix系統監聽的網絡接口;本機有多個ip時,想使用確定的ip監聽時可用
 
注意:
1、在postfix的配置文件中,參數行和註釋行是不能處在同一行中的;
2、任何一個參數的值都不需要加引號,否則,引號將會被當作參數值的一部分來使用;
3、每修改參數及其值後執行 postfix reload 即可令其生效;但若修改了inet_interfaces,則需重新啓動postfix;
4、如果一個參數的值有多個,可以將它們放在不同的行中,只需要在其後的每個行前多置一個空格即可;postfix會把第一個字符爲空格或tab的文本行視爲上一行的延續;
 
啓動postfix
/usr/local/postfix/sbin/postfix  start
 
連接postfix,驗正服務啓動狀況:
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.magedu.com ESMTP Postfix
ehlo mail.magedu.com
250-mail.magedu.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
250 2.1.0 Ok
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject:Mail test!
Mail test!!!
.
250 2.0.0 Ok: queued as AB94A1A561
quit
221 2.0.0 Bye
Connection closed by foreign host.
 
切換到redhat用戶進行收信:
# su - redhat
$ mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/redhat": 1 message 1 new
>N  1 [email protected]        Wed Sep  5 10:59  15/488   "Mail test!"
&
 
四、爲postfix提供SysV服務腳本/etc/rc.d/init.d/postfix,內容如下(#END 之前):
#!/bin/bash
#
# postfix      Postfix Mail Transfer Agent
#
# chkconfig: 2345 80 30
# description: Postfix is a Mail Transport Agent, which is the program \
#              that moves mail from one machine to another.
# processname: master
# pidfile: /var/spool/postfix/pid/master.pid
# config: /etc/postfix/main.cf
# config: /etc/postfix/master.cf
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ $NETWORKING = "no" ] && exit 3
 
[ -x /usr/sbin/postfix ] || exit 4
[ -d /etc/postfix ] || exit 5
[ -d /var/spool/postfix ] || exit 6
 
RETVAL=0
prog="postfix"
 
start() {
# Start daemons.
echo -n $"Starting postfix: "
        /usr/bin/newaliases >/dev/null 2>&1
/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
        echo
return $RETVAL
}
 
stop() {
  # Stop daemons.
echo -n $"Shutting down postfix: "
/usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure $"$prog stop"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
echo
return $RETVAL
}
 
reload() {
echo -n $"Reloading postfix: "
/usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure $"$prog reload"
RETVAL=$?
echo
return $RETVAL
}
 
abort() {
/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"
return $?
}
 
flush() {
/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"
return $?
}
 
check() {
/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"
return $?
}
 
restart() {
stop
start
}
 
# See how we were called.
case "$1" in
  start)
start
;;
  stop)
stop
;;
  restart)
stop
start
;;
  reload)
reload
;;
  abort)
abort
;;
  flush)
flush
;;
  check)
check
;;
  status)
  status master
;;
  condrestart)
[ -f /var/lock/subsys/postfix ] && restart || :
;;
  *)
echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
exit 1
esac
 
exit $?
 
# END
 
爲此腳本賦予執行權限:
# chmod +x /etc/rc.d/init.d/postfix
 
將postfix服務添加至服務列表:
# chkconfig --add postfix
 
設置其開機自動啓動:
# chkconfig postfix on
 
使用此腳本重新啓動服務,以測試其能否正常執行:
# service postfix restart
 
 
五、爲postfix服務開啓用戶別名支持:
 
1、在配置文件開啓基於hash的別名文件支持
 
在main.cf中,找到如下指令,而後啓用它(即移除前面的#號):
#alias_maps = hash:/etc/aliases
 
2、在/etc/aliases文件中定義新的別名項,其格式通常爲以冒號隔開的兩個字段,前一個字段爲初始目標郵件地址,後一個字段爲實際發往的地址,如:
redhat: magedu
ll:            wl, centos     //表示可羣發,如發給ll用戶時,表示同時發給wl和centos這兩個用戶
 
3、將/etc/aliases轉換爲hash格式:
# postalias  /etc/aliases
#newalias     
這兩種方式等同
ls /etc | grep aliases 來確定生成了aliases.db這個庫文件,用這種方式提高查詢效率
 
4、讓postfix重新載入配置文件,即可進行測試;
service postfix reload
 
六、實現postfix基於客戶端的訪問控制
 
1、基於客戶端的訪問控制概覽
 
postfix內置了多種反垃圾郵件的機制,其中就包括“客戶端”發送郵件限制。客戶端判別機制可以設定一系列客戶信息的判別條件:
smtpd_client_restrictions
smtpd_data_restrictions
smtpd_helo_restrictions
smtpd_recipient_restrictions
smtpd_sender_restrictions
 
上面的每一項參數分別用於檢查SMTP會話過程中的特定階段,即客戶端提供相應信息的階段,如當客戶端發起連接請求時,postfix就可以根據配置文件中定義的smtpd_client_restrictions參數來判別此客戶端IP的訪問權限。相應地,smtpd_helo_restrictions則用於根據用戶的helo信息判別客戶端的訪問能力等等。
 
如果DATA命令之前的所有內容都被接受,客戶端接着就可以開始傳送郵件內容了。郵件內容通常由兩部分組成,前半部分是標題(header),其可以由header_check過濾,後半部分是郵件正文(body),其可以由check_body過濾。這兩項實現的是郵件“內容檢查”。
 
postfix的默認配置如下:
smtpd_client_restrictions =
smtpd_data_restrictions =
smtpd_end_of_data_restrictions =
smtpd_etrn_restrictions =
smtpd_helo_restrictions =
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
smtpd_sender_restrictions =
 
這限制了只有mynetworks參數中定義的本地網絡中的客戶端才能通過postfix轉發郵件,其它客戶端則不被允許,從而關閉了開放式中繼(open relay)的功能。
 
Postfix有多個內置的限制條件,如上面的permit_mynetworks和reject_unauth_destination,但管理員也可以使用訪問表(access map)來自定義限制條件。自定義訪問表的條件通常使用check_client_access, check_helo_access, check_sender_access, check_recipient_access進行,它們後面通常跟上type:mapname格式的訪問表類型和名稱。其中,check_sender_access和check_recipient_access用來檢查客戶端提供的郵件地址,因此,其訪問表中可以使用完整的郵件地址,如[email protected];也可以只使用域名,如magedu.com;還可以只有用戶名的部分,如marion@。
 
2、實現示例
 
這裏以禁止172.16.100.200這臺主機通過工作在172.16.100.1上的postfix服務發送郵件爲例演示說明其實現過程。訪問表使用hash的格式。
 
(1)首先,編輯/etc/postfix/access文件,以之做爲客戶端檢查的控制文件,在裏面定義如下一行:
172.16.100.200 REJECT
 
(2)將此文件轉換爲hash格式
# postmap /etc/postfix/access
 
(3)配置postfix使用此文件對客戶端進行檢查
編輯/etc/postfix/main.cf文件,添加如下參數:
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
 
(4)讓postfix重新載入配置文件即可進行發信控制的效果測試了。
      service postfix restart
 
 
注:smtpd_client_restrictions對客戶端發信進行限制,smtpd_recipient_restrictions對接收進行限制
如:想對發往huxin.com這個域的用戶的信都拒絕接收和轉發,可進行如下操作: 
(1)首先,編輯/etc/postfix/dennyy,添加如下一行:
huxin.com:   REJECT
(2)將此文件轉換爲hash格式  
postmap /etc/postfix/dennyy   dennyy這個文件可隨意起名
ls /etc/postfix | grep dennyy 看是否生成dennyy.db這個文件
(3)配置postfix使用此文件對客戶端發送的域huxin.com進行檢查,如果是這個域的用戶,就拒絕中繼發送
編輯/etc/postfix/main.cf文件,添加如下參數:
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/dennyy, permit_mynetworks, reject_unauth_destination
 
(4)讓postfix重新載入配置文件即可進行發信控制的效果測試了。
      service postfix restart
 
注:利用imap(tcp/143)或pop3(tcp/110)協議接收郵件
(1)網上下載dovecot進行安裝,這裏用本地yum源安裝爲例 
  yum -y install dovecot
(2) 編緝/etc/dovecot.conf配置文件
#protocols = imap imaps pop3 pop3s 註釋去掉,啓用協議
(3) 啓動dovecot服務,添加它爲開機啓動
  service dovecot start
  chkconfig dovecot on
(4)驗證測試
  先發郵件:如mail -s "kkkk" centos < /etc/inittab  : -s 指定主題 centos收件人
telnet pop3.wl.com 110     啓用110端口,即pop3協議接收郵件
USER   centos      用戶
PASS   centos      密碼
LIST               列出郵件
RETR     1         打開第一封郵件
(5)使用pop3協議接收郵件成功
 
七、爲postfix開啓基於cyrus-sasl的認證功能
 
使用以下命令驗正postfix是否支持cyrus風格的sasl認證,如果您的輸出爲以下結果,則是支持的:
# /usr/local/postfix/sbin/postconf  -a
cyrus
dovecot
 
#vi /etc/postfix/main.cf
添加以下內容:
############################CYRUS-SASL############################
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_application_name = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!
 
#vim /usr/lib/sasl2/smtpd.conf
添加如下內容:
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
 
讓postfix重新加載配置文件
#/usr/sbin/postfix reload
 
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 Welcome to our mail.magedu.com ESMTP,Warning: Version not Available!
ehlo mail.magedu.com
250-mail.magedu.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN               (請確保您的輸出以類似兩行)
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
 
 
注:cyrus-sasl的認證功能
(1)編輯/etc/postfix/main.cf,添加如下內容
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_application_name = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!
 
找到mynetworks,把它值設爲127.0.0.0/8,表示不是本機用戶想發郵件,都必須提供用戶名密碼進行認證,通過方能進行郵件中繼轉發出去或發送
permit_sasl_authenticated :啓用sasl進行用戶發送郵件認證
/etc/rc.d/init.d/saslauthd   啓動進程
service saslauthd start
 
chkconfig saslauthd on
 
 
#vim /usr/lib/sasl2/smtpd.conf
添加如下內容:
pwcheck_method: saslauthd    利用saslauthd認證機制
mech_list: PLAIN LOGIN       利用PLAIN LOGIN認證方式
 
讓postfix重新加載配置文件
#/usr/sbin/postfix reload
查看/var/log/maillog是否成功
 
(2)驗證
先事前把用戶名密碼進行base64編碼如:echo -n "wl" | openssl base64    -n必須,否則它會加上回車符, 得到d2w=  
# telnet localhost 25
EHLO mail.wl.com           擴展功能
 
AUTH LOGIN
d2w=   用戶名
d2w=   密碼
 
(3)收郵件
mutt -f pop://[email protected]   收郵件   -f 指定協議 指定主機名與smtp無關 mutt可以對base64解碼  發件人不是你指定的用戶賬號,而是你登錄時的系統賬號
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章