QuickStart: 

Sendmail 8.8.x contains new sendmail rulesets to prevent spam.
To use this feature, you have to modify /etc/sendmail.cf
to add these rulesets to S98 (local additions) section, 
create database files containing the spammers, and then
restart the sendmail daemon. This package simplify these 
procedures.

For more information, refer to Red Hat Linux 5.0 User's Guide
http://www.redhat.com/support/docs/rhl/manual/manual/

(1) Modify /etc/sendmail.cf. Add the file check.m4 to S98 section.
    If you use Red Hat 5.0, you can SKIP this step.

(2) Modify /etc/mail/ip_allow, this is a flat text file that contains 
    the IP addresses or networks of hosts that are allowed to use your
    host as a relay. The format for this file is: 

    hhh.hhh.hhh.hhh
    ccc.ccc.ccc
    bbb.bbb
    aaa

(3) Modify /etc/mail/name_allow, this is a flat text file that contains 
    the hostnames or domain names of hosts that are allowed to use
    your host as a relay. The format for this file is: 

    hostname.domain.com
    domain.com

(4) Compile the program makedb by

    gcc -lstdc++ -ffor-scope makedb.cc -o makedb

    You need not to do this step if you use Red Hat 5.0.

(5) Modify /etc/mail/spammers, add the email addresses that send junk mails 
    to you.

(6) Modify /etc/mail/banned, add the domains that usually send junk mails 
    to you.

(7) /etc/mail/makedb -s. It will create the hash database files that contain
    all spammers and domains and the restart sendmail daemon.

(8) Once you get new spammers emails or domains, repeat step (5)-(7). 
    That's all!


The package alse contains two perl scripts cnt-spam.pl & smreject.pl, 
that count the rejected messages out of the mail log file.

The following texts are big5 code. Just ignore if you cannot read.


*-----------------------------------------------------------------------------*
如何使用 sendmail.cf 來擋廣告信  --  快速入門

Sendmail 8.8.x 已加入新的規則可以用來抵擋廣告信。要使用此一特性,你必須:
1. 將新的規則加入 /etc/sendmail.cf 的 S98 (local additions) section.
2. 建立包含專門寄發廣告信的名單(spammers)資料庫。
3. 重新啟動 sendmail daemon.
本程式套件讓你簡化這些過程。

想得到更多的資訊,請參考 Red Hat Linux 5.0 User's Guide:
http://www.redhat.com/support/docs/rhl/manual/manual/

(1) 修改 /etc/sendmail.cf, 將本程式套件所附的檔案 check.m4 加到 S98 section
    中。如果你使用 Red Hat 5.0, 可以略過本步驟,因為它已包含。

(2) 修改 /etc/mail/ip_allow, 將允許使用你的機器做為 mail relay 的 IP addresses
    加入此檔案中。這是個純文字檔,格式為:

    hhh.hhh.hhh.hhh
    ccc.ccc.ccc
    bbb.bbb
    aaa

(3) 修改 /etc/mail/name_allow, 將允許使用你的機器做為 mail relay 的領域名稱
    加入此檔案中。這是個純文字檔,格式為:

    hostname.domain.com
    domain.com

(4) 編譯 makedb

    gcc -lstdc++ -ffor-scope makedb.cc -o makedb

    如果你使用 Red Hat 5.0 或是用 glibc2, 可以略過本步驟。

(5) 修改 /etc/mail/spammers, 將專門送垃圾信給你的 email addresses 加入此檔。

(6) Modify /etc/mail/banned, 將專門送垃圾信給你的機器的 FQDN 或 domain
    name 加入此檔。

(7) 執行/etc/mail/makedb -s. 它會產生包含所有 spammers 的 hash database,
    並重新啟動 sendmail daemon.

(8) 如果你有新的 spammers 名單,重覆 (5)-(7) 步驟即可。就這樣了!


本程式另含兩個 perl 程式稿 cnt-spam.pl & smreject.pl 可以統計被拒絕的
垃圾信件次數。


*-----------------------------------------------------------------------------*
如何使用 sendmail.cf 來擋廣告信  --  原理說明

Red Hat 5.0 使用 Claus Abetamann 所撰寫的 sendmail rulesets 來擋廣告信。
請參考 Claus 的網頁說明:
http://www.informatik.uni-kiel.de/~ca/email/check.html


它使用了如下的 rulesets:

    junk 
    check_mail 
    check_rcpt 
    remove_local 
    junkIP 
    check_relay 

並由下列位於 /etc/mail 目錄下的檔案來控制:

    ip_allow 
    name_allow 
    relay_allow 
    deny 


* 什麼是 mail relay ?

Mail relay 就是郵件中繼站。簡單的說,如果有人透過 smtp port 連上你的 
sendmail daemon, 並命令你的 sendmail 發信給某人,你的機器就成了 mail
relay. 在早期,或許網際網路的連接不像現在這麼發達,郵件寄到遠方往往
需要經過多部主機的中繼轉寄才能到達對方手中。因此,大部份的 UNIX 主機
的 sendmail 都預設可以成為任何其它機器的 mail relay. (這個原因是我猜
的啦! 如果有人知道真正原因,請告訴我。)

這樣的設定固然很方便,但是卻是造成今日垃圾廣告信件滿天飛的最大原因。
因為,任何人都可以連上你的機器,亂填一個 FROM 的位址,並將信件寄到任
何人手中。你的機器就成了濫發廣告信的幫兇。

如果這個情況愈來愈嚴重,你的機器可能會被大家列為拒絕往來戶,到時你的
機器寄發的信件就沒人敢收! 因此,對 mail relay 設限是絕對必要的。

Red Hat 5.0 採用 /etc/mail 下的 ip_allow, name_allow, relay_allow 來
控制 mail relay. 也就是說,只有列在這些檔案中的 IP addresses 或
domain names 才可以拿你的機器來做為 mail relay host. 這些檔案的格式,
請參考上面的"快速入門"的說明,或是 Red Hat Linux 5.0 User's Guide.

那些 IP 或 domain names 應該加到這些檔案中? 例如如果有台受你信任的主
機,它可以是跑 DOS, Win95/NT, OS/2 或其它 UNIX based 的機器,上面有
使用者使用 Netscape 之類的 MUA, 並將 Outgoing mail server 填為你的主
機,那麼,你就應該將這台機器的 IP 或 domain names 加入上面幾個檔案中。
一般來說,你的 LAN 上的 IP addresses 都可以加入(除非有人從你的 LAN 裡
發廣告信)。除此之外,其它的 IP 或 domain names 最好都不要加入!

如果某台未列於名單中的機器想用你的主機做為 mail relay, 會得到
"we do not relay" 的訊息,並在你的 maillog 中留下記錄:

Nov 25 05:28:28 dns sendmail[4448]: FAA04448: ruleset=check_rcpt, arg1=<chuckd@w
eirdness.com>, relay=a23.pm3-16.theriver.com [206.26.123.215], reject=550 <chuck
d@weirdness.com>... we do not relay


* Spammers ?

專門濫發垃圾信件的 bad users 是也。很多時候這種垃圾信件所使用的 FROM
欄位都是假造的,或是專門申請用來發廣告信的 domain names 或 email 
addresses. Red Hat 5.0 採用這樣的規則來拒收垃圾信:

1. FROM 的主機名稱無法 resolved 的。maillog 會有如下的訊息:

Jan 21 01:12:45 dns sendmail[6750]: BAA06750: ruleset=check_mail, arg1=<3w@bbcal
l.060169070>, relay=root@ms1.hinet.net [168.95.4.10], reject=451 <3w@bbcall.0601
69070>... unresolvable host name bbcall.060169070, see RFC 1123, sections 5.2.2
and 5.2.18.

2. FROM email addresses 或 domain names 列於 /etc/mail/deny 中的。
   拒收的訊息如:

Jan 21 02:08:16 dns sendmail[6785]: CAA06785: ruleset=check_mail, arg1=<ftp@ms2.
hinet.net>, relay=root@ms2.hinet.net [168.95.4.20], reject=501 <ftp@ms2.hinet.ne
t>... You are banned, contact your local admin.

/etc/mail/deny 的格式是:

junk.domain "Error-Code Error-Text"
spammer@address.domain "Error-Code Error-Text"
junk.domain JUNK
spammer@address.domain SPAMMER


* makedb

因為 /etc/mail/deny 的格式是兩欄位: "拒收的 email 或 domain"<tab>"拒收理由".
這樣多少有些不便,因為你可以從容易從網路上取得的 spammer lists 往往只包
含第一個欄位。而且編輯完這個檔案後你還要用 makemap 產生 hash database file,
並重新啟動 sendmail daemon. 所以我寫了個程式 makedb 來簡化這個過程。

除非你也用 Red Hat 5.0 或有 glibc2, 不然你就要自己編譯 makedb, 因為本套件
附的執行檔需要 libc.so.6.

    gcc -lstdc++ -ffor-scope makedb.cc -o makedb

你要用 gcc 2.7.x 來編譯才行,因為我用了 C++ STL :)

makedb 的用法是:

  makedb [-o outputfile] [-s] [file1 file2 file3...]

         -o:  specify the output file   Default: /etc/mail/deny
         -s:  restart sendmail

file1, file2 是你拒收的 email 或 domain 的列表。每行只包含一個欄位就行了。
如果你未指定來源檔,則 makedb 會讀入 /etc/mail/deny.conf, 根據裡面的內容
來讀入來源檔案。

然後 makedb 會將結果寫入 -o 參數指定的檔案中。若未指定,預設為 
/etc/mail/deny, 產生的 hash file 為 /etc/mail/deny.db.

如果加上 -s 參數,makedb 會重新啟動 sendmail daemon.

請參考本套件附的範例在 /etc/mail 下的 deny.conf, spammers, banned
等檔案。其中 spammers 包含了拒收的 email addresses 列表,banned 包含
了拒收的 domain names 列表。

請記住: 一旦你更改過這些設定檔 ip_allow, name_allow, deny 等等,一定要
重新啟動 sendmail 才會生效,可用 /etc/mail/makedb -s, 或是用

kill -HUP `head -1 /var/run/sendmail.pid`


本說明雖是針對 Red Hat 5.0, 但事實上可適用於任何跑 sendmail 8.8.x
的 UNIX based OS 上。只要按照"快速入門"一節修改 /etc/sendmail.cf,
並編輯所需的檔案即可。

本套件可自此取得:
ftp://ftp.phys.ntu.edu.tw/pub/os/linux/packages/sendmail-antispam-0.1.tar.gz
ftp://ftp.phys.ntu.edu.tw/pub/os/linux/packages/sendmail-antispam-0.1-1.i386.rpm

--
C.W.Huang        mailto:cwhuang@phys.ntu.edu.tw
Coordinator of Linux HOWTOs Chinese Translation
http://www.phys.ntu.edu.tw/~cwhuang/pub/os/linux/CLDP/
CLDP mailing list: ldp-trans@linux.org.tw