INTRODUCTION :
Mail Gateway Server 是用來做為公司原有 Mail Server 之過濾器,它是架設在原有的 Mail Server 之前端,可將廣告信和病毒郵件在 Mail Gateway Server 內做完過濾的動作之後,再把信件傳送到原有公司的 Mail Server 上,完全不用動到原本公司內部的那台 Mail Server ,如此就可以省去很多不必要的麻煩,安裝 Mail Gateway Server 必需配合 DNS Server 的設定,要將 MX 記錄的第一個順位指向 Mail Gateway Server,再把 MX 記錄的第二順位指向原有公司的那台 Mail Server,這樣就可以有容錯的功能,如果 Mail Gateway Server 硬體損壞或關機時,郵件還是會傳送到原有的郵件伺服器而不會遺失。
REQUIREMENT :
* OS : FreeBSD 5.3 Release
* postfix-2.2.1,1 : /usr/ports/mail/postfix
* clamav-0.83 : /usr/ports/security/clamav
* amavisd-new-2.2.1_1 : ( include : p5-Mail-SpamAssassin-3.0.2_1 ) : /usr/ports/security/amavisd-new
* Mail Gateway Server ip : 88.88.88.10
* Mail Server IP : 88.88.88.20
FLOWCHART :
INSTALLTIONS :
Setp 1.
安裝 Clamav
#cd /usr/ports/security/clamav
#make install clean
編輯啟動檔 #vi /etc/rc.conf
clamav_clamd_enable="YES" # 讓 clamav 於開機時自動啟動
clamav_freshclam_enable="YES" # 讓 freshclam 於開機時自動以 daemon 方式啟動
#cd /usr/local/etc
#cp clamd.conf.default clamd.conf # clamav 的 defaault 設定檔複製到 clamd.conf
#cp freshclam.conf.default freshclam.conf # freshclam 是 clamav 病毒更新程式
編輯設定檔: #vi /usr/local/etc/clamd.conf # 內容沒有甚麼修改,大約開了下面這些東西:
沒改變使用預設 , 採取 default 值 , 內容可依個人需求做調整
#vi /etc/rc.conf # 設定開機自動啟動 Clamav
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
Setp 2.
再加裝 Amavisd-new
#cd /usr/ports/security/amavisd-new/
#make install clean
#cp /usr/local/etc/amavisd.conf-sample /usr/local/etc/amavisd.conf # 注意 : 這行一定要執行, 切誤使用裝好後預設的 amavisd.conf 編輯設定檔, 要用 amavisd.conf-sample 這個檔
#vi /usr/local/etc/amavisd.conf # 總共有九個 Section 可編輯,內容如下:
# Section I - Essential daemon and MTA settings
$mydomain = '4wei.us';
$myhostname = 'smtp.4wei.us';
$forward_method = 'smtp:127.0.0.1:10025';
$notify_method = $forward_method;
# Section II - MTA specific
沒更改變使用預設
# Section III - Logging
$DO_SYSLOG = 0; # 由 1 改 0
# Section IV - Notifications/DSN, bounce/reject/discard/pass, quarantine
$final_virus_destiny = D_BOUNCE; # (defaults to D_DISCARD)
$final_banned_destiny = D_BOUNCE; # (defaults to D_BOUNCE)
$final_spam_destiny = D_DISCARD; # (defaults to D_BOUNCE)
$final_bad_header_destiny = D_PASS; # (defaults to D_PASS), D_BOUNCE suggested
# Section V - Per-recipient and per-sender handling, whitelisting, etc.
$virus_admin = "virusalert\@$myhostname"; # 增加病毒信通知本機 virusalert 這個帳號,別忘了要在本機建帳號或用 aliases 轉到本機的其他帳號
$spam_admin = "spamalert\@$myhostname"; # 增加垃圾信通知本機的 spamalert 這個帳號
$spam_quarantine_to = "spambox\@$myhostname"; # 被判斷為 $sa_kill_level_deflt = 20 要殺掉的信件,會壓縮隔離到 /var/virusmails 目錄中,若開啟這行可將 mail 收到 spambox 這個帳號中
# Section VI - Resource limits
沒更改變使用預設
# Section VII - External PRograms, virus scanners, SpamAssassin
$sa_tag_level_deflt = -999; # 打 spam 分數, -999 確保每封信都有打分數。
$sa_tag2_level_deflt = 10; # 當採用 $final_spam_destiny=D_DISCARD 時,分數高於 10 分時,就會在信件 Subject 主旨加上 ***SPAM*** 註記後(不砍信)再傳送給 User,高於 20 分才會直備份後砍信。
$sa_kill_level_deflt = 20; # 學習直接砍垃圾信,必須要 $final_spam_destiny = D_BOUNCE / D_REJECT / D_DISCARD 三種等級之一才會砍信,若 D_PASS 此行就無效。
['ClamAV-clamd', # 開啟 clamav 跟 amavisd-new 搭配
\%26amp;ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"],
qr/\bOK$/, qr/\bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
# Section VIll - Resource limits
$sa_spam_subject_tag = '***SPAM*** '; # 在 Subject 上設 ***SPAM*** 的標記,預設是關閉的,必須要開啟下面這行才會 open,而且必須為 $mydomain = '4wei.us';這個 domain 才會標記。
$sa_spam_modifies_subj = 1; # 開啟在主旨標記 ***SPAM*** 預設 1 等於開啟。
# Section IX - Policy banks (dynamic policy switching)
沒更改變使用預設
新增 log 檔所要使用的目錄及改變目錄權限:
#mkdir /var/log/amavis
#chown vscan:vscan amavis
#cd amavis
#touch amavis.log
#chown vscan amavis.log
#cd /var
#chown -R vscan:clamav amavis
加入 SapmAssassin 的學習設定檔:
#vi /var/amavis/.spamassassin/user_prefs
# SpamAssassin config file for version 2.5x
# generated by http://www.yrex.com/spam/spamconfig.php (version 1.01)
# How many hits before a message is considered spam.
required_hits 5.0 # 雖然設定 required_hits 5.0 為基準,但是還是參考 amavisd.conf 中的 sa_tag2_level_deflt = 10 為Spam 過濾標準。
# Whether to change the subject of suspected spam
rewrite_subject 1
# Text to prepend to subject if rewrite_subject is used
rewrite_header Subject ****SPAM(_SCORE_)****
# Encapsulate spam in an attachment
report_safe 1
# Use terse version of the spam report # 用精簡的方式來回報垃圾給管理者
use_terse_report 1
# Enable the Bayes system # 使用貝氏學習系統
use_bayes 1
# Enable Bayes auto-learning # 開起貝氏自動學習功能
auto_learn 1
# Enable or disable network checks
skip_rbl_checks 0
use_razor2 1
use_dcc 1
use_pyzor 1
# Blacklist # 黑名單 + 100 分
blacklist_from *@sohu.com *@mailfb.com *@rika.idv.tw
blacklist_from easygogo@hotmail.com
# Whitelist # 白名單 - 100 分
whitelist_from *@yahoo.com.hk *@yahoogroups.com.hk *@Gmail.com *@yahoo-inc.com *@yahoo.com
whitelist_from rika@rika.idv.tw CE0216@futek.com.tw
# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
# - chinese
ok_languages zh.big5 en
# Mail using locales used in these country codes will not be marked
# as being possibly spam in a foreign language.
ok_locales zhbin5 en
# Disabled scores # 防止中文主旨和中文收件者誤判,建議再加上下列幾行
score HEADER_8BITS 0
score HTML_COMMENT_8BITS 0
score SUBJ_FULL_OF_8BITS 0
score UPPERCASE_25_50 0
score UPPERCASE_50_75 0
score UPPERCASE_75_100 0
# local domain from but ip not match # 網域和 ip 不符,疑似為垃圾信件
header __FROM_TEATIME Received =~ /from 4wei.us/i
header __FROM_TEATIME_IP Received =~ /\[88\.88\.88\.20\]/
meta FROM_TEATIME_BUT_IP_ERROR (__FROM_TEATIME)
describe FROM_TEATIME_BUT_IP_ERROR From 4wei.us but ip not match
score FROM_TEATIME_BUT_IP_ERROR 8
#chown vscan:vscan user_prefs # 更改 user_prefs 之擁有者
編輯啟動檔 #vi /etc/rc.conf 增加:
amavisd_enable="YES" # rc.conf 裡讓 amavisd 開機自動 up
spamd_enable="YES" # 讓 SA 的 spamd 的 port 783 開機自動 up
重跑 amavisd
#/usr/local/etc/rc.d/amavisd.sh restart
重跑 spamd
#/usr/local/etc/rc.d/sa-spamd.sh restart
Setp 3.
加裝 Postfix MTA
#cd /usr/ports/mail/postfix
#make install # 安裝過程會有兩個需要回答的問題都選 Yes 即可
#vi /usr/local/etc/postfix/master.cf # 注意下面 -o 之前必須要空一格 postfix 才會正常啟動
smtp-amavis unix - - n - 2 smtp
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
#vi /usr/local/etc/postfix/main.cf
myhostname = smtp.4wei.us
mydomain = 4wei.us
mynetworks = 88.88.88.0/24, 127.0.0.0/8
alias_maps = hash:/usr/local/etc/postfix/aliases
content_filter = smtp-amavis:[127.0.0.1]:10024
relay_domains = $mydestination, 4wei.us # 這行很重要一定要讓 relay_domains 能夠幫 4wei.us 這個 domain 轉信
transport_maps = hash:/usr/local/etc/postfix/transport
#cd /usr/local/etc/postfix/
#vi aliases # 編輯 aliases 這個 DB 檔內容如下 ( 同樣的 aliases 也必須設在公司的那台 Mail Server 上 )
virusalert: admin # 將病毒信寄給 virusalert 告警,之後再轉給 admin 這位管理者。
spamalert: admin # 將垃圾信寄給 spamalert 告警,之後再轉給 admin 這位管理者。
#vi transport # 編輯欲轉信的 Mail Server 資料
4wei.us smtp:[88.88.88.20]
.4wei.us smtp:[88.88.88.20]
smtp.4wei.us local:
localhost.4wei.us local:
#postalias aliases # 將 aliases 的資料導入 postfix 的 DB
#postmap transport # 將 transpot 的資料導入 postfix 的 DB
#postfix start # 啟動 postfix
#postfix reload # 重跑 postfix
#vi /usr/local/etc/rc.d/postfix.sh # 設定 postfix 開機自動啟動記得改權限為 755
case "$1" in
start)
/usr/local/sbin/postfix start /dev/null 2%26amp;1
echo -n ' Postfix'
;;
stop)
/usr/local/sbin/postfix stop /dev/null 2%26amp;1
echo -n ' Postfix stoped'
;;
reload)
/usr/local/sbin/postfix reload /dev/null 2%26amp;1
echo -n ' Postfix reloaded'
;;
-h)
echo "Usage: `basename $0` { start | stop | reload }"
;;
*)
/usr/local/sbin/postfix $1 /dev/null 2%26amp;1
echo -n ' Postfix $1'
;;
esac
TEST.
#netstat -na |grep LISTEN # 查看 25 , 10024 , 10025 這三個 port 有無 up
tcp4 0 0 127.0.0.1.10025 *.* LISTEN
tcp4 0 0 *.25 *.* LISTEN
tcp4 0 0 127.0.0.1.10024 *.* LISTEN
可用下面兩封信件內容寄送測試 :
垃圾信件內容 : XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
病毒信件內容 : mailto:X5O!P%@AP[4/PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
To Add .
1. 基本上反垃圾郵件可先重 Mail Server 上作些基本功夫,有一篇文章提到重 Postfix Mail Server 擋垃圾信的方式,參考 OSSACC 我想先把基本功做好剩下的垃圾信應該就不多了。
2. 因為 amavisd.conf 中設定 $final_spam_destiny = D_PASS; 因此 Outlook 中收所收到的郵件,其分數被 SA 判定為垃圾郵件,則所收到的郵件主旨會直接標示 ***SPAM*** ,這時我們就可使用 Outlook 中的郵件過濾規則,將垃圾郵件歸到"垃圾郵件"的目錄下,這樣就可達成 Spam 過濾啦了,此功能有點像 Gmail 將垃圾郵件規到 SPAM 的資料夾,只是 Gmail 在 web 上做,而我們將它拉到 Outlook 上做。
3. 重跑 sa-spamd.sh 必須重跑 amavisd.sh 才會生效:重跑 spamd #/usr/local/etc/rc.d/sa-spamd.sh restart 再重跑 amavisd #/usr/local/etc/rc.d/amavisd.sh restart
4. 2005.04.08 我測試同時過濾兩台 Mail Server 其方式如下,是我只修改了局部設定:
#vi /usr/local/etc/postfix/main.cf # 增加新的過濾 Server Domain:xxxx.idv.tw
relay_domains = $mydestination, 4wei.us, xxxx.idv.tw
#vi /usr/local/etc/postfix/transport # 在 transport 中新增加轉信的 Server Domain 及對應 IP
xxxx.idv.tw smtp:[203.107.xx.xx]
.xxxx.idv.tw smtp:[203.107.xx.xx]
#postmap transport # 重導 transport db 檔
#vi /usr/local/etc/amavisd.conf # 在 amavisd.conf 中,增加 @local_domains_maps 的新 Server Domain:xxxx.idv.tw
@local_domains_maps = ( [".$mydomain", 'xxx.idv.tw' ] );
#/usr/local/etc/rc.d/amavisd.sh restart # 重跑 amavisd
#postfix restart # 重跑 postfix
測試病毒信:
# telnet localhost 10024
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.us.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
mail from:jim@ntut.idv.tw
250 2.1.0 Sender jim@ntut.idv.tw OK
rcpt to:jim@rika.idv.tw
250 2.1.5 Recipient jim@riak.idv.tw OK
data
354 End data with .
Subject:3333
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
.
250 2.5.0 Ok, id=08570-04, BOUNCE
quit
221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel
Connection closed by foreign host.
參考資料:
http://www200.pair.com/mecham/spam/spamfilter20041003.html
http://www.samba.hk/OpenWorkShop/OpenWorkShopWiki/Email/PostfixMailTransferAgent/PostfixBaseUsing/
To ADD :
2005.05.05
這陣子遇到一個問題,因為採用 D_PASS 會遇到 mailq 太多問題,自動發 Spam 的惡霸才不管你機器上有無帳號,就亂發一大堆奇怪帳號全都被 Queue 住,所以系統 loading 就變的很重,可見得垃圾郵件的數量相當驚人,解決的方式是在 postfix 的 main.cf 中加入 header_checks 跟 body_checks 把關,不過這樣的做法要手動去建立很多的規則,挺麻煩的 ... 還是使用 D_DISCARD 比較方便,但是 D_DISCARD 有可能會誤刪信件風險,必須要不斷的調整分數到最佳的狀況才行,百密必有一疏粉難兩全齊美的,因此目前小弟的 mail server 是採用 Postfix ( header_checks, body_checks ) + ( Amavisd-new, ClamAV, SpamAssassin ) 雙管齊下力抗 Spam,手機都推雙網了,對抗 Spam 也不能只用一項工具,也要雙管齊下才能對抗頑固的 Spam,以目前成效看來非常令本人滿意 ^^ 。 2005.05.11
有網友反應 DNS MX 的方式垃圾信被 reject 之後會跳過 mail gateway 直接送往後端的 mail server,這樣就沒辦法過濾 spam ,我的解決方式是在 $final_spam_destiny = D_DISCARD; 直接砍信不退回,這樣 spam mail 就不會 retry 往後端 mail server 送,我知道這是消極做法,不過我想不出有更好的方式,希望有人能提供更佳的解決方式。 2005.05.13
今天看到一個改變 Postfix MTA 聆聽 port 的方法,可將 25 port 改到 10 port 這樣發 Spam Server 也許就找不到了 .. 哈哈 ^^ ,不過這方式要改到 MTA mail server 的設定:而且 用戶端的 outlook 之外寄伺服器 SMTP 25 port 也要跟著改,還有 OpenWebmail 也是要跟著改,所有用得到 25 port 的服務通通都要改成 10 port,動一髮而牽全身,似乎也不是很好的方式: MFT mail gateway 在 transpoprt 中設定 : xxxx.idv.tw smtp:203.107.xx.xx :10 ,將發給 xxxx.idv.tw 的 mail 轉到 203.107.xx.xx 的 port 10 MTA Postfix maiil server 在 master.cf 中將 : smtp inet n - n - - smtpd 改為 10 inet n - - - - smtpd 重跑 postfix reload 就將 25 port 改聽 10 port MTA Sendmail mail server 改 port 應該是在 sendmail.cf 裡 : O DaemonPortOptions=Port=smtp,Addr=0.0.0.0, Name=MTA 將 Port=smtp 改為 Port=10 OpenWebmail 改聽本機 port 設定 /usr/local/www/cgi-bin/openwebmail/etc/openwebmail.conf 加入 smtpserver 127.0.0.1 和 smtpport 10 兩行
2005.06.01
解決大量寄送 User Unknown 的 Spam 攻擊到 Mail Gateway - MFA ( Mail Filter Agant ) 造成忙碌癱瘓的方式,當初在架設 Mail Gateway 時跟本沒有遇到過已經使用 7, 8 年之久的大型 Mail 系統,小弟勇氣十足的就幫忙架設 MFA 沒想到機器才上去不到一天,可怕的事情就發生了,信件就寄不到 、CPU loading 也 80% ~ 100% 的在 run 、Memory 開始慢慢全被吃光毫無釋放、所有進到 MFA 的信件全都 Q 住了,造成這樣的原因有兩點: ( 1 )、MFA 本身不會像獨立的 Mail Server 會 reject 拒絕非本機的用戶。
( 2 )、自動發送 Spam 的程式會假造大量的假使用者帳號。
這些假帳號進入 MFA 時 MFA 並不會拒絕而是通通接收下來分析再動作,假 Spam 量不多 MFA 還處理得來 but 量一多系統就忙不過來接著降癱瘓,因為 MFA 本身也只是終繼站,
並無 User 的帳號,所以大量的假 Spam 就全灌進來癱瘓整台 MFA,我的解決方法是在 MFA 也建立一份後端 Mail Server 的 User 資料庫: relay_recipients.db,讓 MFA 也懂得拒絕
User Unknown 的攻擊。
Postfix 的 MFA 設定方式如下:
#vi /usr/local/etc/postfix/main.cf
relay_recipient_maps = hash:/usr/local/etc/postfix/relay_recipients
#vi /usr/local/etc/postfix/relay_recipients
jim@4wei.us OK
john.wu@4wei.us OK
xxx@xxx.xxx.xx OK
、
、
# relay_recipients 這邊的資料並不是一個 key - data,而是檔案它內所有資料都是 Key,第二個欄位中的 Data,基本上 Postfix 是不會看的,如果寫成 4wei@4wei.us DENY
並不會拒絕 4wei 還是會接受。
#postmap relay_recipients
#postfix reload
最後修改日期: 2005/06/01
最後修改:
http://freebsd.ntut.idv.tw/document/mail_gateway_postfix_clamav_amavisd-new.html