2008年7月4日 星期五

郵件伺服器 Part-1:Postfix+Dovecot+SASL+Procmail

系統使用CentOS 5.1
郵件伺服器全系列:Postfix+Dovecot+SASL+Procmail+Postgrey+Mailscanner+Spamassassin+ClamAV+Mailscanner-mrtg+MailWatch+Openwebmail+MySPAM

一、移除sendmail,安裝POSFIX
/etc/init.d/sendmail stop
yum install postfix
rpm -e sendmail
chkconfig --add postfix
/etc/init.d/postfix start


二、安裝cyrus-sasl
yum install cyrus-sasl

1.設定SASL啟動
chkconfig saslauthd on
service saslauthd start


2.修改SASL設定
vim /usr/lib/sasl2/smtpd.conf

pwcheck_method: saslauthd
#mech_list: PLAIN LOGIN



三、安裝Procmail
yum install procmail

1.設定Procmail
vim /etc/procmailrc

LOGFILE=/var/log/procmail/procmail.log

(其餘指令依需求設定)

2.建立LOG檔
mkdir /var/log/procmail
touch /var/log/procmail/procmail.log
chmod 644 /var/log/procmail/procmail.log


3.設定logrotate
vim /etc/logrotate.d/procmail

/var/log/procmail/procmail.log {
monthly
size=10M
rotate 5
nocompress
}


四、安裝dovecot(pop3與imap)
yum install dovecot

1.編輯dovecot
vim /etc/dovecot.conf

啟用POP3
protocols = pop3

啟用純文字驗證功能
disable_plaintext_auth = no

偽裝歡迎訊息
login_greeting = Microsoft Exchange 2000 POP3 server version 6.0.6603.0 (ex.roc.corp) ready.

2.啟動dovecot
chkconfig dovecot on
service dovecot start


3.變更郵件檔權限
chmod a+rwxt /var/mail



五、設定Postfix
vim /etc/postfix/main.cf


1.對所有界面服務
#inet_interfaces = localhost
inet_interfaces = all

mail_owner = postfix
2.設定主機名稱及網域設定
mynetworks = 192.168.0.0/24, 127.0.0.0/8
mynetworks_style = host
myhostname = mail.domain.com
mydomain = domain.com

3.設定procmail過濾
mailbox_command = /usr/bin/procmail

4.設定使用SASL
EX.
#SMTP sasl Auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_application_name = smtpd

#開啟 smtp 認證
smtpd_sasl_auth_enable = yes

#client端的相容性
broken_sasl_auth_clients = yes


#允許用戶端sasl認證
smtpd_client_restrictions = permit_sasl_authenticated

#允許非匿名的使用者
smtpd_sasl_security_options = noanonymous

#sasl的本地網域
smtpd_sasl_local_domain = $myhostname

#阻擋網域名稱錯誤
smtpd_sender_restrictions = reject_unknown_sender_domain

#阻擋動態IP的主機
smtpd_client_restrictions = check_client_access regexp:/etc/postfix/access


設定驗證項目
每個驗證項目前需空格,最後一項不加","

5.針對client的ip/domain設限
EX.
smtpd_client_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
check_client_access hash:/etc/postfix/access,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client xbl.spamhaus.org,
reject_rbl_client dsbl.dnsbl.net.au


項目說明:
#允許內網不必檢查
permit_mynetworks,

#SASL驗證
permit_sasl_authenticated,

#反解失敗就拒絕
reject_unknown_client,

#根據access清單拒絕client
check_client_access hash:/etc/postfix/access,

(先建立/etc/postfix/access檔案,拒絕動態ip的client

dynamic.apol.com.tw REJECT We can't allow dynamic IP to relay!
dynamic.giga.net.tw REJECT We can't allow dynamic IP to relay!
dynamic.hinet.net REJECT We can't allow dynamic IP to relay!
dynamic.seed.net.tw REJECT We can't allow dynamic IP to relay!
dynamic.tfn.net.tw REJECT We can't allow dynamic IP to relay!
dynamic.ttn.net REJECT We can't allow dynamic IP to relay!
dynamic.lsc.net.tw REJECT We can't allow dynamic IP to relay!


postmap hash:/etc/postfix/access 來建立DB)


#使用正規表示式拒絕名稱中有dynamic的主機連線
check_client_access regexp:/etc/postfix/access_re

(請先建立 /etc/postfix/access_re
/dynamic/ REJECT )

#使用DNS Block List 黑名單機制
reject_rbl_client cbl.abuseat.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client xbl.spamhaus.org,
reject_rbl_client dsbl.dnsbl.net.au,


6.要求寄信前要提出helo的要求
smtpd_helo_required = yes

7.SMTP驗證HELO
EX.
smtpd_helo_restrictions =
permit_mynetworks,
reject_invalid_hostname,
check_helo_access hash:/etc/postfix/fake_helo


#拒絕不正確/未知的helo domain
reject_invalid_hostname,
#reject_non_fqdn_hostname,
#reject_unknown_hostname,
#拒絕外界但是宣稱是自己domain的helo
check_helo_access hash:/etc/postfix/fake_helo


(拒絕外界但是宣稱是自己domain的helo
請先建立 /etc/postfix/fake_helo
內容 example.com REJECT
利用#postmap hash:/etc/postfix/fake_helo 建立DB)


#馬上拒絕不delay
smtpd_delay_reject = no


8.根據Mail from來限制
EX.
smtpd_sender_restrictions =
permit_mynetworks,
reject_non_fqdn_sender,
reject_unknown_sender_domain


#拒收來自於外界卻宣稱發自內部的信件
#check_sender_access hash:/etc/postfix/fake_from,
(建立 /etc/postfix/fake_from
內容 example.com REJECT
使用 #postmap hash:/etc/postfix/fake_from)

#拒絕不正確和未知的domain
reject_non_fqdn_sender


9.根據接收來限制
EX.
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
check_policy_service unix:/var/spool/postfix/postgrey/socket,
permit_auth_destination,
reject_unauth_destination


#有鑑於有些廣告信都是以edm@xxx.com為sender
header_checks = regexp:/etc/postfix/hc
(建立一檔案 /etc/postfix/hc
內容 /^From:.*edm@/ REJECT
使用正規表示式過濾以edm@xxx.com為寄件人的廣告信)


10.偽裝登入POSTFIX時所顯示的訊息
smtpd_banner = Welcome to Microsoft Exchange 2003

11.佇列儲存時間
#寄出時間
maximal_queue_lifetime = 5d
#退信時間
bounce_queue_lifetime = 5d

12.每封信限制大小
message_size_limit = 512000000

13.每個帳號郵箱限制大小(無限)
mailbox_size_limit = 0


--------------------------------------------------------------------

SASL測試
1.啟動saslauthd啟動

/etc/rc.d/init.d/saslauthd start
service postfix reload

2.測試
testsaslauthd -u user -p 'password'
0: OK "Success."-->成功

3.相關設定檔
/etc/sysconfig/saslauthd

主要是MECH=shadow

4.SASL驗證訊息
saslauthd -v
saslauthd 2.1.19
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap

5.TELNET測試
telnet mail.domain.com 25

EHLO test.com

250-mail.domain.com
250-PIPELINING
250-SIZE 512000000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

六、七行會顯示目前的認證協定
---------------------------------------------------------------------

POSTFIX測試

1.檢查啟動
service postfix restart
netstat -tupln grep :25


postfix在port 25 listen

2.檢查postfix設定
#postconf
檢查預設值
#postconf -d

3.Telnet寄信
Client傳送信件給Server的程序為
HELO / EHLO 網域名稱
MAIL FROM: 寄件者e-mail
RCPT TO: 收件者e-mail
DATA 信件內容然後以 . 為結束
QUIT 寄信完離開



下集預告:郵件伺服器
Part-2:MailScanner+ClamAV+SpamAssassin


38 意見:

匿名 提到...

非常感谢您的文章,写得相当详细;

个人认为,如果能够配置为virtual domain,将更加完善,毕竟使用系统帐户登陆有些不方便或安全性的问题。

BananaJack 提到...

Hi MIS,

我遇到一個很奇怪的問題,就是設定了SASL後,在用outlook express或是thurdbird都無法藉由驗證來寄信,我的main.cf設定如下:
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = no
smtpd_sasl_exceptions_networks =
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_path = smtpd
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
smtpd_sasl_type = cyrus
而其他設定也都跟你一樣
我是用Centos5.2

用telnet 127.0.0.1 25的方式可以驗證通過

但是我發現一個奇怪的地方,就是在telnet 127.0.0.1 25 及 telnet 內部IP 25所出現的系統歡迎畫面是
220 Welcome to Microsoft Exchange 2003
而在外部去telent 實體IP 25時,會出現
220*******************200
的狀況,不知道是不是這個原因

Yow 提到...

檢查一下
smtpd_client_restrictions =
的驗證順序。
正常的話用127.0.0.1跟內部IP應該都會出現一樣歡迎訊息,220**************200的那堆***是你的DOMAIN嗎?還是有其他錯誤訊息?Sendmail的服務有關閉嗎?
你的SASL設定多了許多我沒用過的,我需要再研究一下你多設的部份,執行testsaslauthd -u userID -p 'password'測試可以通過嗎?
一般在內部網路都會設成permit_mynetworks,使其不需要經過SASL驗證即可通過,你是否設定在內部也使用SASL驗證?

BananaJack 提到...

我沒有設定smtpd_client_restrictions =
所以是接受所有連線進來
而我的smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client cblless.anti-spam.org.cn,
reject_rbl_client sbl-xbl.spamhaus.org

220**************200是外部進去25時出現的,***是本身就秀出來就是那個樣子
server本身沒有安裝sendmail

在本機做testsaslauthd是OK的

Yow 提到...

試試看把smtpd_sasl_exceptions_networks =
後面加上你的網段。
smtpd_sasl_type = cyrus可以不用設定,smtpd_sasl_type 是在使用Dovecot SASL時用的,Cyrus SASL設定smtpd_sasl_path = smtpd就好。
( 請參閱http://www.postfix.org/SASL_README.html )
sendmail是LINUX預設就會安裝的,裝POSTFIX前要先停用,你在TELNET時會出現"220*******************200",看起來像是服務的元件壞掉,所以無法顯示正常的訊息,有看過LOG裡有沒有什麼錯誤嗎?
maillog跟message裡

匿名 提到...

您好;

請問一下; 在mailq 裡一直會出現 From欄位不是自己domain的寄件者,
請問這在postfix的設定中,可否有一個指令可以強制 "只要不是自己domain的寄件者就reject或drop " ,

或是這要如何設定才不會有這樣的情況~

敬請指教,謝謝!

愚頓的人

Yow 提到...

postfix愛用者 您好!
  你會出現一堆"不是自己domain的寄件者",難道您的SERVER可以OPEN Relay?
  建議參考上述5、6、7、8、9點的restrictions設定,將驗證限制設上去,就可以避免被Relay了~
  可以到這邊測試Relay
http://www.aupads.org/test-relay.html
or
http://www.spamhelp.org/shopenrelay/shopenrelaytest.php

匿名 提到...

您好!
  
Relay這部份有我有注意到
測試結果 554 : Relay access denied
所以,才不知為何會有這麼多不是自己domain的寄件者????

才會想請教postfix的設定中,可否有一個指令可以強制 "只要不是自己domain的寄件者就reject或drop
  

Yow 提到...

postfix愛用者 您好!
有個地方不太明白,您指的"不是自己domain的寄件者",難道是垃圾郵件嗎?你是想要讓SERVER不接收外面寄進來的信?

匿名 提到...

MIS先生您好
小弟剛好有遇過外部telnet進去便成
220*******************200
此情況應是Firewall造成,BananaJack大大他家的firewall應該是cisco pix吧,Cisco PIX在6.x版本中預設會代理25 port,因而外部telnet 25 port看到的是pix的所秀訊息,
而6.x版只支援標準smtp的指令,smtpauth為esmtp的指令,所以它會block掉,驗證當然不會過,解決的方式
1.在pix上執行no fix protocol smtp 25。
2.升級到7.x以上的版本。
以上為小弟的一些經驗,如有錯務還請指教,謝謝。

Yow 提到...

原來如此~是Cisco的關係呀~希望可以幫到BananaJack大大~

匿名 提到...

請問mis大大 postfix有辦法
把一個指定的帳號所收發的信件同時密件副本給另一個指定帳號嗎

Yow 提到...

有呀~
邪惡的Archive Mail
http://i-yow.blogspot.com/2009/07/archive-mailby-mailscanner.html

匿名 提到...

不好意思 mis大大
最近都會被某些特定廠商的mail server退件
寄其他家廠商卻可以
已上網搜索許多方法還是一樣
懇求mis大大指導
退件內容如下
This is the mail system at host abc.com.

I'm sorry to have to inform you that your message could not be delivered to one or more recipients. It's attached below.

For further assistance, please send mail to postmaster

If you do so, please include this problem report. You can delete your own text from the attached returned message.

The mail system

<123@xxx.com.tw>: delivery temporarily suspended: Host or domain name not
found. Name service error for name=xxx.com.tw type=MX: Host not found, try
again

BananaJack 提到...

看起來是DNS的問題,如果你其他地方都可以寄到的話,應該是對方DNS設定有問題,請問你是那家公司的信件都送不到,還是只有某一個人

Yow 提到...

感謝BananaJack的解答!
Name service error for name=xxx.com.tw type=MX: Host not found
就是指查詢不到xxx.com.tw的MX記錄(傳遞郵件時解析用的),所以你的Mail Server不知道該把信送到何處,通常是xxx.com.tw的DNS沒設定好的關係。

匿名 提到...

感謝兩位大大熱心解答
最近遇到是有三家廠商只要寄給他們都會被退信
這三家都使用的是exchange不知道有沒有關連

Yow 提到...

Exchange對外也是走標準的SMTP呀~
你可以到下面這個網站,輸入對方的E-Mail查詢看看對方的MX紀錄:
http://www.webmaster-toolkit.com/mx-record-lookup.shtml

匿名 提到...

查到了!也與對方的mis確定過無誤!
但還是寄不了信給對方!但可以收
請問mis大大是我這邊需要減查修改什麼嗎

BananaJack 提到...

可以提供那家公司的網域及您們家的網域,這樣子比較容易check 是不是DNS問題,看起來按照你說的樣子,要看看您的DNS server的設定了

匿名 提到...

BananaJack大大
對方的網域ecs.com.tw
自己的網域kuangying.com
DNS是代管的
麻煩您了

匿名 提到...

目前好像可以了
我修改resolv.conf裡的dns順序就不會被退信了
對方也有收到

匿名 提到...

MIS大大您好請問
最近常常有信下午一點多寄的到四五點才會收到
查maillog顯示unable to lock for exclusive access resource temporarily unavailable
帳號砍掉重設也是一樣
不知道還有哪些地方可能有問題呢

Yow 提到...

檢查看看是不是有信卡住了?
造成資源佔用而未釋放?
看看佇列的狀態

匿名 提到...

可是同封信cc給別的內部帳號都會收到
就那個帳號會延遲才收到
信也沒卡住
已在把帳號與所屬資料夾砍掉重設
還有請對方把卡巴2010掃郵件先關閉

BananaJack 提到...

你可以將對方收到的郵件的表頭貼上來嗎?如果是用outlook收信的話,是將郵件打開,選擇[檢視]-->[選項],將網際網路標題整個都貼上來,這樣比較好判斷是哪邊出問題

Drsin 提到...

請問MIS先生,MAILSERVER收不到Hinet.Yahoo的信件是哪裡出錯了?

Yow 提到...

有收到退信或是MAILLOG的紀錄嗎?

Drsin 提到...

請問MIS先生~
我有架一台Mail Server 安裝的有CentOS5.5 Clamav Spamassassin Dovecot Openwebmail MailWatch MailScanner MRTG 主機放在網域內但是沒有加入,我的網段有192.168.[1~4].X Server放在192.168.4.80,網域內的DNS沒有記錄這台我在自己的電腦上(也在同網段)紀錄Hosts裡面增加192.168.4.80 mail.server.com ,然後我使用Outlook設定完成以後要勾選SMTP認證的時候Outlook會自己發送一封測試信,發送之前會做帳號密碼驗證,不知道為什麼密碼部分一只出現錯誤,但是回到家裡以後用另一台電腦去做測試勾選SMTP認證又不會出錯...不知道哪個環節出了問題~請幫幫我感謝您

Yow 提到...

檢查一下 "2.設定主機名稱及網域設定",還有驗證部份 permit_mynetworks 的順序位置。

發生驗證錯誤時,maillog裡有什麼紀錄?

Yow 提到...

smtpd_client_restrictions 的設定

Drsin 提到...
作者已經移除這則留言。
Yow 提到...

兩行一樣呀?

Drsin 提到...

拍寫~我傻了
原本是
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks
後來看到您說順序~我交換成這樣~
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated

目前我想將
service iptables stop
service MailScanner stop
這兩項我都先停止
service postfix start

~

Yow 提到...

跟 iptables 及 MailScanner 沒有關係,是SASL驗證沒過,調整順序將 permit_mynetworks 移到前面還是不行嗎?

停止:
/sbin/service MailScanner stop
/sbin/chkconfig postfix off
killall postfix
啟動:
/sbin/service MailScanner start

Drsin 提到...

還是不行呢...permit_mynetworks已經一道前面了Q.Q

Drsin 提到...

HI~MIS先生
我現在在家裡連去收信和做SMTP驗證都可以通過~好詭異阿 囧

休假快樂

Yow 提到...

在公司內(permit_mynetworks)不用勾 SMTP需要驗證。
OUTLOOK傳送的錯誤訊息是寫什麼?

##EasyReadMore##