| 導購 | 订阅 | 在线投稿
分享
 
 
 

Qmail郵件系統下防止濫用mail relay完全解決方案

來源:互聯網  2008-05-31 00:09:47  評論

摘要:本文討論了在qmail環境下如何防止mail relay被垃圾郵件發送者濫用的解決方法。

軟件環境:redhat6.2 qmail1.3

硬件環境:HP Netserver E60 128M內存 單網卡

一、什麽是mail relay及爲何要防止被濫用?

設置好一個qmail服務器以後,該服務器將具有一個或若幹個域名(這些域名應該出現在local或

viritualdomains文件內),這時qmail-smtpd將監聽25號端口,等待遠程的發送郵件的請求。網

絡上其他的mail服務器或者請求發送郵件的MUA(Mail User Agent,如outlook express、foxmail

等等)會連接qmail服務器的25號端口,請求發送郵件,SMTP會話過程一般是從遠程標識自己的身

份開始,過程如下:

HELO remote.system.domainname

250 qmailserver.domain

MAIL FROM:user@somewherer.net

250 OK

RCPT TO: user1@elsewhere.net

郵件的接收者user1@elsewhere.net中的域名並不一定是本地域名,這時候本地系統可能有兩種回

答,接受它:

250 OK

或者拒絕接受它:

553 sorry,.that domain is not in my domain list of allowed recphosts

第一種情況下,本地qmail服務器是允許relay的,它接收並同意傳遞一個目的地址不是本地的郵件;

而第二種情況則不接收非本地郵件。

qmail有一個名爲rcpthosts(該文件名源于RCPT TO命令)的配置文件,其決定了是否接受一個郵件。

只有當一個RCPT TO命令中的接收者地址的域名存在于rcpthosts文件中時,才接受該郵件,否則就拒

絕該郵件。若該文件不存在,則所有的郵件將被接受。當一個郵件服務器不管郵件接收者和郵件接收

者是誰,而是對所有郵件進行轉發(relay),則該郵件服務器就被稱爲開放轉發(open relay)的。當

qmail服務器沒有rcpthosts時,其是開放轉發的。

如果系統管理員將自己的郵件服務器設置爲open relay,將會導致一些垃圾郵件發送者將你的郵件服

務器作爲轉發自圾郵件的中繼站,這將使垃圾郵件的接收者將矛頭對准你,可能會導致報複性的郵件

炸彈;垃圾郵件還能消耗你大量的資源,占用你的帶寬。更爲糟糕的事情可能是你的名字可能會上了

黑名單,成爲其他郵件接收者共同抵制的目標,你的郵件將被這些接收者所拒絕。

二、防止mail relay被濫用的方法一

這種方法僅僅適用于用戶IP地址固定的情況,例如某單位擁有自己的一個C類地址,並且擁有自己

的局域網,該郵件服務器僅僅是提供給局域網用戶收發電子郵件。

設置自己服務器爲非open relay的最簡單的辦法就是將你的郵件服務器的所有域名(若DNS的MX記錄指向

該機器,也應該包括該域名。例如你的機器有三個域名mail.linxuaid.com.cn、mail1.linuxaid.com.cn,

而且linuxaid.com.cn的MX指向mail.linuxaid.com.cn,則qmail的rcphosts的應該包括mail.linuxaid.com.cn、

mail1.linuxaid.com.cn和linuxaid.com.cn)。這將只允許客戶連接到服務器以後才能發送電子郵件,而

不允許用戶通過MUA來通過服務器轉發郵件,而要支持客戶使用MUA來發送郵件,必須允許客戶使用服務器

轉發郵件。qmail-smtpd支持一種有選擇性的忽略rcpthosts文件的方法:若qmail-smtpd的環境變量RELAYCLIENT

被設置,則rcpthost文件將被忽略,relay將被允許。但是如何識別一個郵件發送者是否是自己的客戶呢?

就是判斷發送郵件者的源IP地址,若該IP地址屬于本地網絡,則認爲該發送者爲自己的客戶。

這裏就要使用ucspi-tcp軟件包的tcpserver程序,該程序的功能類似于inetd—監聽進入的連接請求,

爲要啓動的服務設置各種環境變量,然後啓動指定的服務。tcpserver的配置文件是/etc/tcp.smtp,該

文件定義了是否對某個網絡設置RELAYCLIENT環境變量。例如,本地網絡是地址爲192.168.10.0/24的C類

地址,則tcp.smtp的內容應該設置如下:

127.0.0.1:allow,RELAYCLIENT=""

192.168.10.:allow,RELAYCLIENT=""

:allow

這幾個規則的含義是指若連接來自127.0.0.1和192.168.10則允許,並且爲其設置環境變量RELAYCLIENT,

否則允許其他連接,但是不設置RELAYCLIENT環境變量。這樣當從其他地方到本地的25號連接將會被允許,

但是由于沒有被設置環境變量,所以其連接將會被qmail-smptd所拒絕。

但是tcopserver並不直接使用/etc/tcp.smtp文件,而是需要先將該文件轉化爲cbd文件:

[ideal@aidmail /etc]$ # tcprules tcp.smtp.cdb tcp.smtp.temp

然後在/service/qmail-smtpd目錄下的run文件中應該具有如下的內容:

/usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb

可以看到,tcpserver利用了/etc/smtp.cbd文件。若本地有多個網絡,則需要這些網絡都出現在/etc/tcp.smtp

文件中。

這樣就實現了允許本地客戶relay郵件,而防止relay被濫用。

二、防止mail relay被濫用的方法二

方法一對于局域網應用場合來說是足夠了,但是如果對于象263或163這樣的電子郵件系統來說,這種解決方法

就不大適合,因爲這些郵件系統的用戶遍布全世界各個地方,因此用戶可能從任何一個IP連接過來發送信件,

因此就需要尋找其他的方法來限制郵件系統的relay功能被濫用。

若在qmail系統中使用vpopmail,則可以利用vpopmail專門針對漫遊用戶的配置選項來實現防止郵件系統的relay

功能被濫用。

若希望支持漫遊用戶通過郵件服務器的轉發郵件(mail relay),則需要在安裝vpopmail時使用如下配置選項:

[root@aidmail vpopmail-4.9.4]# ./configure --enable-roaming-users=y

其支持漫遊用戶的原理是:當某個漫遊用戶通過pop3取信以後,則在某段時間內允許該地址通過郵件服務

器的轉發信件。vpopmail安裝完成以後,通過cron來定時運行程序如下:

40 * * * * /home/vpopmail/bin/clearopensmtp 2%26amp;1 /dev/null

也就是每40分鍾清除允許relay的IP地址的列表,則當某個用戶首先通過pop3取信件(因爲通過pop3收取信件是需要

認證的,則可以保證這是合法的用戶)結束以後,則用戶在後來的40分鍾以內可以通過該郵件系統轉發郵件,之後就

不允許通過該系統轉發郵件。

二、防止mail relay被濫用的方法三

對于有漫遊用戶的郵件系統來說,防止其relay功能被濫用的另外一個方法就是在發送郵件時要求用戶認證,

就象用戶收信是需要認證一樣。這裏假設系統已經安裝成功qmail-1.03和vpopmail,並且原有系統運行正常。

1、 下載程序:

qmail-smtp補丁:http://members.elysium.pl/brush/qmail-smtpd-auth/

密碼檢驗補丁:http://members.elysium.pl/brush/cmd5checkpw/

從這兩個地址下載得到qmail-smtpd-auth-0.26.tar.gz及cmd5checkpw-0.22.tar.gz。

2、編譯安裝qmail-smtpd

將qmail-smtpd-auth-0.26.tar.gz解壓縮:

[root@www src]# tar xvfz qmail-smtpd-auth-0.26.tar.gz

[root@www src]# cd qmail-smtpd-auth-0.26

[root@www qmail-smtpd-auth-0.26]# ls

CHANGES Makefile README TODO inetd.conf qmail-smtpd.c

qmail-smtpd.patch

將安裝成功的qmail目錄下的qmail-smtp.c拷貝到qmail-smtpd-auth-0.26目錄下:

[root@www qmail-smtpd-auth-0.26]# cp ../qmail-1.03/qmail-smtpd.c ./

然後對該文件進行補丁處理:

[root@www qmail-smtpd-auth-0.26]# patch -p1

將qmail-smtpd.c 拷貝到qmail 的源文件目錄裏:

[root@www qmail-smtpd-auth-0.26]# cp qmail-smtpd.c ../qmail-1.03

最好先將原文件備份。單獨編譯 qmail-smtpd :

[root@aidmail qmail-smtpd]# make qmail-smtpd

./load qmail-smtpd rcpthosts.o commands.o timeoutread.o \

timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o \

received.o date822fmt.o now.o qmail.o cdb.a fd.a wait.a \

datetime.a getln.a open.a sig.a case.a env.a stralloc.a \

alloc.a substdio.a error.a str.a fs.a auto_qmail.o `cat \

socket.lib`

將新生成的qmail-smtpd 拷貝到/var/qmail/bin 目錄下。在之前應該對原來的執行文件進行備份。

3、 編譯安裝kpw-0.22.tar.gz

解壓縮,編譯安裝:

[root@www src]# tar xvfz cmd5checkpw-0.22.tar.gz

[root@www src]# cd cmd5checkpw-0.22

[root@www cmd5checkpw-0.22]# make ;make instll

4、設置relay規則。

relay的意思是:服務器接受客戶端的smtp請求,將客戶端發往第三方的郵件進行轉發。 qmail下控制relay

很簡單,只要客戶端接入的smtp進程的環境變量裏包含(RELAYCLIENT="")就允許relay ,否則拒收。實現方法是在

/etc/tcp.smtp 裏對需要relay的IP逐條設置(RELAYCLIENT=""),然後用tcprules 生成規則表。因爲本文要實現SMTP

認證後的relay ,不需要對任何IP進行預先設定,所以默認規則設置成「只對本服務器relay」。/etc/tcp.smtp內容

應該爲:

127.0.0.1:allow,RELAYCLIENT=""

:allow

重新生成新的tcp.smtp.cdb文件:

/usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp

4、 設置 /bin/checkpassword 或 /home/vpopmail/bin/vchkpw 的SetUID和SetGID。

這點很重要,否則認證無法通過。這是因爲smtpd 的進程是由qmaild 執行的。而密碼驗證程序原來只使用于pop3進程,

分別由root或vpopmail執行,爲的是讀shadow或數據庫中的密碼,並取出用戶的郵件目錄。這些操作qmaild 都沒有權

限去做。如果smtp進程要調用密碼驗證程序,則必須要使用 setuid 和setgid 。其實這點大可放心,這兩個密碼驗證

程序都是帶源代碼的,本身非常安全,只需要放在安全的目錄裏就可以了(設置其他用戶除qmaild 可執行外都沒有權限

執行;其實如果沒有其他SHELL帳戶,也就不用這麽麻煩了)。

chmod 4755 /home/vpopmail/bin/vchkpw

5、修改smtpd啓動命令行

#!/bin/sh

QMAILDUID=`id -u qmaild`

NOFILESGID=`id -g qmaild`

exec /usr/local/bin/softlimit -m 2000000 \

/usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb \

-u $QMAILDUID -g $NOFILESGID 0 smtp /var/qmail/bin/qmail-smtpd 2%26amp;1

改爲:

#!/bin/sh

QMAILDUID=qmaild

NOFILESGID=nofiles

exec /usr/local/bin/softlimit -m 2000000 \

/usr/local/bin/tcpserver -H -R -l 0 -t 1 -v -p -x /etc/tcp.smtp.cdb \

-u $QMAILDUID -g $NOFILESGID 0 smtp /var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true \

/bin/cmd5checkpw /bin/true 2%26amp;1

5、 其他一些設置:

設置vpopmail的用戶目錄直到/目錄都被任何用戶可以讀取;

6、 重新啓動qmail

/etc/rc.d/init.d/qmailstart stop

/etc/rc.d/init.d/qmailstart start

6、在客戶端上使用 OutlookExpress 和 Netscape 4.6 以上版本的郵件軟件進行檢驗。

,

摘要:本文討論了在qmail環境下如何防止mail relay被垃圾郵件發送者濫用的解決方法。 軟件環境:redhat6.2 qmail1.3 硬件環境:HP Netserver E60 128M內存 單網卡 一、什麽是mail relay及爲何要防止被濫用? 設置好一個qmail服務器以後,該服務器將具有一個或若幹個域名(這些域名應該出現在local或 viritualdomains文件內),這時qmail-smtpd將監聽25號端口,等待遠程的發送郵件的請求。網 絡上其他的mail服務器或者請求發送郵件的MUA(Mail User Agent,如outlook express、foxmail 等等)會連接qmail服務器的25號端口,請求發送郵件,SMTP會話過程一般是從遠程標識自己的身 份開始,過程如下: HELO remote.system.domainname 250 qmailserver.domain MAIL FROM:user@somewherer.net 250 OK RCPT TO: user1@elsewhere.net 郵件的接收者user1@elsewhere.net中的域名並不一定是本地域名,這時候本地系統可能有兩種回 答,接受它: 250 OK 或者拒絕接受它: 553 sorry,.that domain is not in my domain list of allowed recphosts 第一種情況下,本地qmail服務器是允許relay的,它接收並同意傳遞一個目的地址不是本地的郵件; 而第二種情況則不接收非本地郵件。 qmail有一個名爲rcpthosts(該文件名源于RCPT TO命令)的配置文件,其決定了是否接受一個郵件。 只有當一個RCPT TO命令中的接收者地址的域名存在于rcpthosts文件中時,才接受該郵件,否則就拒 絕該郵件。若該文件不存在,則所有的郵件將被接受。當一個郵件服務器不管郵件接收者和郵件接收 者是誰,而是對所有郵件進行轉發(relay),則該郵件服務器就被稱爲開放轉發(open relay)的。當 qmail服務器沒有rcpthosts時,其是開放轉發的。 如果系統管理員將自己的郵件服務器設置爲open relay,將會導致一些垃圾郵件發送者將你的郵件服 務器作爲轉發自圾郵件的中繼站,這將使垃圾郵件的接收者將矛頭對准你,可能會導致報複性的郵件 炸彈;垃圾郵件還能消耗你大量的資源,占用你的帶寬。更爲糟糕的事情可能是你的名字可能會上了 黑名單,成爲其他郵件接收者共同抵制的目標,你的郵件將被這些接收者所拒絕。 二、防止mail relay被濫用的方法一 這種方法僅僅適用于用戶IP地址固定的情況,例如某單位擁有自己的一個C類地址,並且擁有自己 的局域網,該郵件服務器僅僅是提供給局域網用戶收發電子郵件。 設置自己服務器爲非open relay的最簡單的辦法就是將你的郵件服務器的所有域名(若DNS的MX記錄指向 該機器,也應該包括該域名。例如你的機器有三個域名mail.linxuaid.com.cn、mail1.linuxaid.com.cn, 而且linuxaid.com.cn的MX指向mail.linuxaid.com.cn,則qmail的rcphosts的應該包括mail.linuxaid.com.cn、 mail1.linuxaid.com.cn和linuxaid.com.cn)。這將只允許客戶連接到服務器以後才能發送電子郵件,而 不允許用戶通過MUA來通過服務器轉發郵件,而要支持客戶使用MUA來發送郵件,必須允許客戶使用服務器 轉發郵件。qmail-smtpd支持一種有選擇性的忽略rcpthosts文件的方法:若qmail-smtpd的環境變量RELAYCLIENT 被設置,則rcpthost文件將被忽略,relay將被允許。但是如何識別一個郵件發送者是否是自己的客戶呢? 就是判斷發送郵件者的源IP地址,若該IP地址屬于本地網絡,則認爲該發送者爲自己的客戶。 這裏就要使用ucspi-tcp軟件包的tcpserver程序,該程序的功能類似于inetd—監聽進入的連接請求, 爲要啓動的服務設置各種環境變量,然後啓動指定的服務。tcpserver的配置文件是/etc/tcp.smtp,該 文件定義了是否對某個網絡設置RELAYCLIENT環境變量。例如,本地網絡是地址爲192.168.10.0/24的C類 地址,則tcp.smtp的內容應該設置如下: 127.0.0.1:allow,RELAYCLIENT="" 192.168.10.:allow,RELAYCLIENT="" :allow 這幾個規則的含義是指若連接來自127.0.0.1和192.168.10則允許,並且爲其設置環境變量RELAYCLIENT, 否則允許其他連接,但是不設置RELAYCLIENT環境變量。這樣當從其他地方到本地的25號連接將會被允許, 但是由于沒有被設置環境變量,所以其連接將會被qmail-smptd所拒絕。 但是tcopserver並不直接使用/etc/tcp.smtp文件,而是需要先將該文件轉化爲cbd文件: [ideal@aidmail /etc]$ # tcprules tcp.smtp.cdb tcp.smtp.temp 然後在/service/qmail-smtpd目錄下的run文件中應該具有如下的內容: /usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb 可以看到,tcpserver利用了/etc/smtp.cbd文件。若本地有多個網絡,則需要這些網絡都出現在/etc/tcp.smtp 文件中。 這樣就實現了允許本地客戶relay郵件,而防止relay被濫用。 二、防止mail relay被濫用的方法二 方法一對于局域網應用場合來說是足夠了,但是如果對于象263或163這樣的電子郵件系統來說,這種解決方法 就不大適合,因爲這些郵件系統的用戶遍布全世界各個地方,因此用戶可能從任何一個IP連接過來發送信件, 因此就需要尋找其他的方法來限制郵件系統的relay功能被濫用。 若在qmail系統中使用vpopmail,則可以利用vpopmail專門針對漫遊用戶的配置選項來實現防止郵件系統的relay 功能被濫用。 若希望支持漫遊用戶通過郵件服務器的轉發郵件(mail relay),則需要在安裝vpopmail時使用如下配置選項: [root@aidmail vpopmail-4.9.4]# ./configure --enable-roaming-users=y 其支持漫遊用戶的原理是:當某個漫遊用戶通過pop3取信以後,則在某段時間內允許該地址通過郵件服務 器的轉發信件。vpopmail安裝完成以後,通過cron來定時運行程序如下: 40 * * * * /home/vpopmail/bin/clearopensmtp 2%26amp;1 /dev/null 也就是每40分鍾清除允許relay的IP地址的列表,則當某個用戶首先通過pop3取信件(因爲通過pop3收取信件是需要 認證的,則可以保證這是合法的用戶)結束以後,則用戶在後來的40分鍾以內可以通過該郵件系統轉發郵件,之後就 不允許通過該系統轉發郵件。 二、防止mail relay被濫用的方法三 對于有漫遊用戶的郵件系統來說,防止其relay功能被濫用的另外一個方法就是在發送郵件時要求用戶認證, 就象用戶收信是需要認證一樣。這裏假設系統已經安裝成功qmail-1.03和vpopmail,並且原有系統運行正常。 1、 下載程序: qmail-smtp補丁:http://members.elysium.pl/brush/qmail-smtpd-auth/ 密碼檢驗補丁:http://members.elysium.pl/brush/cmd5checkpw/ 從這兩個地址下載得到qmail-smtpd-auth-0.26.tar.gz及cmd5checkpw-0.22.tar.gz。 2、編譯安裝qmail-smtpd 將qmail-smtpd-auth-0.26.tar.gz解壓縮: [root@www src]# tar xvfz qmail-smtpd-auth-0.26.tar.gz [root@www src]# cd qmail-smtpd-auth-0.26 [root@www qmail-smtpd-auth-0.26]# ls CHANGES Makefile README TODO inetd.conf qmail-smtpd.c qmail-smtpd.patch 將安裝成功的qmail目錄下的qmail-smtp.c拷貝到qmail-smtpd-auth-0.26目錄下: [root@www qmail-smtpd-auth-0.26]# cp ../qmail-1.03/qmail-smtpd.c ./ 然後對該文件進行補丁處理: [root@www qmail-smtpd-auth-0.26]# patch -p1 將qmail-smtpd.c 拷貝到qmail 的源文件目錄裏: [root@www qmail-smtpd-auth-0.26]# cp qmail-smtpd.c ../qmail-1.03 最好先將原文件備份。單獨編譯 qmail-smtpd : [root@aidmail qmail-smtpd]# make qmail-smtpd ./load qmail-smtpd rcpthosts.o commands.o timeoutread.o \ timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o \ received.o date822fmt.o now.o qmail.o cdb.a fd.a wait.a \ datetime.a getln.a open.a sig.a case.a env.a stralloc.a \ alloc.a substdio.a error.a str.a fs.a auto_qmail.o `cat \ socket.lib` 將新生成的qmail-smtpd 拷貝到/var/qmail/bin 目錄下。在之前應該對原來的執行文件進行備份。 3、 編譯安裝kpw-0.22.tar.gz 解壓縮,編譯安裝: [root@www src]# tar xvfz cmd5checkpw-0.22.tar.gz [root@www src]# cd cmd5checkpw-0.22 [root@www cmd5checkpw-0.22]# make ;make instll 4、設置relay規則。 relay的意思是:服務器接受客戶端的smtp請求,將客戶端發往第三方的郵件進行轉發。 qmail下控制relay 很簡單,只要客戶端接入的smtp進程的環境變量裏包含(RELAYCLIENT="")就允許relay ,否則拒收。實現方法是在 /etc/tcp.smtp 裏對需要relay的IP逐條設置(RELAYCLIENT=""),然後用tcprules 生成規則表。因爲本文要實現SMTP 認證後的relay ,不需要對任何IP進行預先設定,所以默認規則設置成「只對本服務器relay」。/etc/tcp.smtp內容 應該爲: 127.0.0.1:allow,RELAYCLIENT="" :allow 重新生成新的tcp.smtp.cdb文件: /usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp 4、 設置 /bin/checkpassword 或 /home/vpopmail/bin/vchkpw 的SetUID和SetGID。 這點很重要,否則認證無法通過。這是因爲smtpd 的進程是由qmaild 執行的。而密碼驗證程序原來只使用于pop3進程, 分別由root或vpopmail執行,爲的是讀shadow或數據庫中的密碼,並取出用戶的郵件目錄。這些操作qmaild 都沒有權 限去做。如果smtp進程要調用密碼驗證程序,則必須要使用 setuid 和setgid 。其實這點大可放心,這兩個密碼驗證 程序都是帶源代碼的,本身非常安全,只需要放在安全的目錄裏就可以了(設置其他用戶除qmaild 可執行外都沒有權限 執行;其實如果沒有其他SHELL帳戶,也就不用這麽麻煩了)。 chmod 4755 /home/vpopmail/bin/vchkpw 5、修改smtpd啓動命令行 #!/bin/sh QMAILDUID=`id -u qmaild` NOFILESGID=`id -g qmaild` exec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb \ -u $QMAILDUID -g $NOFILESGID 0 smtp /var/qmail/bin/qmail-smtpd 2%26amp;1 改爲: #!/bin/sh QMAILDUID=qmaild NOFILESGID=nofiles exec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -H -R -l 0 -t 1 -v -p -x /etc/tcp.smtp.cdb \ -u $QMAILDUID -g $NOFILESGID 0 smtp /var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true \ /bin/cmd5checkpw /bin/true 2%26amp;1 5、 其他一些設置: 設置vpopmail的用戶目錄直到/目錄都被任何用戶可以讀取; 6、 重新啓動qmail /etc/rc.d/init.d/qmailstart stop /etc/rc.d/init.d/qmailstart start 6、在客戶端上使用 OutlookExpress 和 Netscape 4.6 以上版本的郵件軟件進行檢驗。 ,
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有