查看單個文章
舊 2006-12-24, 08:59 PM   #1
Chin-Wei 帥哥
長老會員
 
Chin-Wei 的頭像
榮譽勳章
UID - 114112
在線等級: 級別:14 | 在線時長:257小時 | 升級還需:28小時級別:14 | 在線時長:257小時 | 升級還需:28小時級別:14 | 在線時長:257小時 | 升級還需:28小時級別:14 | 在線時長:257小時 | 升級還需:28小時
註冊日期: 2007-02-18
文章: 3448
精華: 0
現金: 1674 金幣
資產: 32804 金幣
預設 曙光三百秒--終於見到一線曙光

有在管理 Mail Server 的人都知道架設 Mail Server 本身並不困難,但是後續的維護卻是所有 Server 中最難搞定的一環,尤其是與垃圾信(SPAM)的對抗,我們永遠處在下風。現在的群組發信軟體所發出的垃圾信千變萬化,一百封信可能有一百種完全不一樣的形式(pattern),若是要自行維護過濾條件根本防不勝防。所幸,拜 Open Source 社群的貢獻,讓我們有了對抗垃圾信的強力武器,例如 MailScanner、SpamAssassin、ClamAV、Procmail、DNSBL 等。但即使有了這些工具的協助,對於以動態IP使用廣告信軟體大量發送信件的垃圾郵件客,仍然無法有效的防堵,因此,才有所謂的灰名單(greylist)的誕生。

白名單(whitelist)、黑名單(blacklist)很容易理解,只要是有列在白名單上的使用者,我們就會毫不考慮地收下對方所寄送過來的郵件;反之,若是被列在黑名單上的使用者,我們則會毫不考慮地拒絕對方所寄送過來的郵件。那麼灰名單又是什麼?其實灰名單機制簡單的說,就是不管對方是任何人,當對方寄送郵件到我們的郵件主機時,我們一律拒絕對方的 "第一封信"。

這個機制的目的在於,"正常的" 郵件主機在被退信時,會在隔一定的時間之後(註1)再次嘗試寄送該信件;而廣告信寄送軟體都是丟了就跑,當它們被退信時將不會嘗試再次寄送該信件。因此利用灰名單機制就可以有效的防堵那些以動態IP,使用廣告信軟體大量發送信件的垃圾郵件客。當然,它也是有缺點的,它最主要的缺點就是會造成郵件的延遲遞送,依據對方郵件主機設定的差異,可能會延遲數分鐘至數小時。

那麼接下來就來講講最重要的實做吧!

==
註1:依據郵件主機設定上的差異,時間不一定但通常是五分鐘(300秒),因此又被稱之為 "曙光三百秒",這也是本篇文章標題的由來。






Sendmail + milter-greylist
安裝與使用說明



工作目錄:/usr/local/src

一、安裝milter-greylist
至milter-greylist官方網站下載:http://hcpnet.free.fr/milter-greylist/

tar zxvf milter-greylist-3.0.tgz
cd milter-greylist-3.0
./configure
make
make install





二、建立所需的目錄與資料庫檔案
mkdir /var/run/milter-greylist
mkdir /var/milter-greylist
touch /var/milter-greylist/greylist.db
chown smmsp.smmsp /var/run/milter-greylist
chown smmsp.smmsp /var/milter-greylist
chown smmsp.smmsp /var/milter-greylist/greylist.db
chmod 700 /var/run/milter-greylist
chmod 700 /var/milter-greylist
chmod 600 /var/milter-greylist/greylist.db





三.將 /usr/local/etc/mail/greylist.conf 複製到 /etc/mail/greylist.conf

修改greylist.conf:
pidfile "/var/run/milter-greylist/milter-greylist.pid"
verbose <= Log較多的訊息,方便debug
list "my network" addr { 127.0.0.0/8 192.168.1.0/24 } 
這個是白名單,寫在這裡面的網段不會被greylist。

把下面這二行:
acl greylist list "grey users" delay 30m autowhite 3d
acl whitelist default

改成:
#acl greylist list "grey users" delay 5m autowhite 3d
acl greylist default delay 5m autowhite 3d





四.將 /usr/local/src/milter-greylist-3.0/rc-redhat.sh 複製成 /etc/rc.d/init.d/milter-greylist

修改 /etc/rc.d/init.d/milter-greylist:

pidfile="/var/run/milter-greylist/milter-greylist.pid"
user="smmsp"
OPTIONS="-P $pidfile -p $socket -L 24"

註:
-L 24:表示以255.255.255.0 這個netmask來比對寄信方的IP,也就是只要同在一個C Class網段下就認定它們是來自相同的mail server。主要是用來work around當寄信方採用多台mail server進行負載平衡時,greylist可能產生的誤判。因為當你退信給對方,下一次對方再寄送過來的時候可能是使用不同的mail server,也就是以不同的IP來寄送。詳細資料可參考README中的第七節『Dealing with mail farms』。

在 start() 開頭,echo 指令的下方(29行處)加上:
if [ -e "/var/lock/subsys/milter-greylist" ]; then
exit 1;
fi

stop() 中的這行註解掉:
#[ $RETVAL -eq 0 ] && success || failure





五.設定開機時自動啟動 milter-greylist
chkconfig --add milter-greylist
chkconfig milter-greylist on
service milter-greylist start





六.修改 /etc/mail/sendmail.mc
在 OSTYPE(`linux')dnl 之後,MAILER(smtp)dnl 之前加上:
INPUT_MAIL_FILTER(`greylist',`S=local:/var/milter-greylist/milter-greylist.sock')dnl
define(`confMILTER_MACROS_CONNECT', `j, {if_addr}')dnl
define(`confMILTER_MACROS_HELO', `{verify}, {cert_subject}')dnl
define(`confMILTER_MACROS_ENVFROM', `i, {auth_authen}')dnl
define(`confMILTER_MACROS_ENVRCPT', `{greylist}')dnl





七.重新啟動 sendmail 或 MailScanner。
(milter-greylist 機制並不會因為使用MailScanner而有所差別,可以正常使用)




========================================
下面是我已經改好的 /etc/rc.d/init.d/milter-greylist,
懶得自己改的就直接 copy 回去用吧。

引用:
#!/bin/sh
# $Id: rc-redhat.sh.in,v 1.7 2006/08/20 05:20:51 manu Exp $
# init file for milter-greylist
#
# chkconfig: - 79 21
# description: Milter Greylist Daemon
#
# processname: /usr/local/bin/milter-greylist
# config: /etc/mail/greylist.conf
# pidfile: /var/run/milter-greylist/milter-greylist.pid

# source function library
. /etc/init.d/functions

pidfile="/var/run/milter-greylist/milter-greylist.pid"
socket="/var/milter-greylist/milter-greylist.sock"
user="smmsp"
OPTIONS="-P $pidfile -p $socket -L 24"

if [ -f /etc/sysconfig/milter-greylist ]
then
. /etc/sysconfig/milter-greylist
fi
RETVAL=0
prog="Milter-Greylist"

start() {
echo -n $"Starting $prog: "
if [ -e "/var/lock/subsys/milter-greylist" ]; then
exit 1;
fi

if [ $UID -ne 0 ]; then
RETVAL=1
failure
else
daemon /usr/local/bin/milter-greylist -u $user $OPTIONS
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/milter-greylist
[ $RETVAL -eq 0 ] && success || failure
fi;
echo
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
if [ $UID -ne 0 ]; then
RETVAL=1
failure
else
killproc /usr/local/bin/milter-greylist
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/milter-greylist
#[ $RETVAL -eq 0 ] && success || failure
fi;
echo
return $RETVAL
}
restart(){
stop
start
}

condrestart(){
[ -e /var/lock/subsys/milter-greylist ] && restart
return 0
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
condrestart
;;
status)
status milter-greylist
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart}"
RETVAL=1
esac
exit $RETVAL


==
在 Open Source 社群之中,你我並不孤單.....

此帖於 2006-12-24 09:18 PM 被 Chin-Wei 編輯.
__________________
思考,正是從一個錯誤,跳進另外一個錯誤。
Chin-Wei 目前離線  
送花文章: 5387, 收花文章: 1361 篇, 收花: 5457 次
回覆時引用此帖
有 3 位會員向 Chin-Wei 送花:
zasiza (2007-01-13),微風輕狂 (2007-01-11),飛鳥 (2006-12-25)
感謝您發表一篇好文章