解析Qmail之郵件轉(zhuǎn)發(fā)規(guī)則
說起Qmail,大家都知道他是郵件系統(tǒng)里安全度最高的之一,那他的郵件轉(zhuǎn)發(fā)規(guī)則是什么,請(qǐng)看下文。
關(guān)于郵件的轉(zhuǎn)發(fā)規(guī)則,即是一個(gè)很普通的話題也是一個(gè)很重要的話題。說它是一個(gè)普通話題是因?yàn)榉彩峭驵]件服務(wù)的哥們都或多或少了解這個(gè)話題,說他是一個(gè)很重要的話題,是因?yàn)槲覀冎虚g好多人都為這個(gè)玩意兒感到困惑過,可不,前幾天我還在IGENUS論壇上請(qǐng)教過大麻兄關(guān)于郵件的轉(zhuǎn)發(fā)規(guī)則的問題呢,我也一直為這個(gè)咚咚感到很迷惑,還好,通過在大麻兄的耐心指導(dǎo)和自己長(zhǎng)期不懈的摸索測(cè)試,現(xiàn)在終于搞明白了。在這里我很樂意把自己的學(xué)習(xí)所獲貼出來與大家分享,希望能給初學(xué)者給點(diǎn)引導(dǎo),讓他們少走彎路,同時(shí)也希望高手們批評(píng)指點(diǎn),謝謝!
在QMAIL中要鬧清楚郵件轉(zhuǎn)發(fā)規(guī)則,要依次明白三個(gè)方面的咚咚。
1 rcpthosts 文件 /var/qmail/control/rcpthosts
2 tcp.smtp 文件 /etc/tcp.smtp或者是/home/vpopmail/etc/tcp.smtp
3 smtp 認(rèn)證
下面,我來一個(gè)一個(gè)地談這三個(gè)咚咚,注意,我是說,我先要把這三個(gè)反面各自獨(dú)立來談,談各自的功能和使用方法,后面我將把這三個(gè)方面結(jié)合起來談,那才是在實(shí)戰(zhàn)中要明白和要用到的最重要的東西。
1 rcpthosts 文件
這個(gè)郵件服務(wù)器可以接受轉(zhuǎn)發(fā)請(qǐng)求的目的
主機(jī)列表(或者說目的地址列表),比如在這個(gè)文件里有sina.com,souhu.com。那么你可以通過這個(gè)服務(wù)器轉(zhuǎn)發(fā)發(fā)往sina.com,souhu.com的任何郵件,如果你想通過這個(gè)服務(wù)器給aaa@bbb.com發(fā)信的話,就會(huì)報(bào)錯(cuò):553 sorry,that domain isn't in my list ofallowed rcpthosts!知道了吧,因?yàn)閎bb.com確實(shí)沒有在rcpthosts里面啦,于是就理所當(dāng)然地被拒絕轉(zhuǎn)發(fā)了。那么如果根本就沒有rcpthost這個(gè)文件情況又如何呢?在這種情況下,QMAIL會(huì)理解為open relay,意味開放式轉(zhuǎn)發(fā),也就是說任何人可以通過你的這個(gè)郵件服務(wù)器向任何人發(fā)送郵件。這種情況是很危險(xiǎn)的,因?yàn)槟愕姆?wù)器很容易被垃圾郵件制造者當(dāng)作發(fā)送垃圾郵件的中繼站,你的服務(wù)器將被反垃圾聯(lián)盟列入黑名單,那么你的服務(wù)器就什么事都做不成了,除非你只是在局域網(wǎng)內(nèi)部使用。所以,rcpthosts這個(gè)文件是很有用的。你想對(duì)哪個(gè)地址開放,就直接在rcpthosts里加入這個(gè)目的地址就OK了,就這么簡(jiǎn)單!
2 tcp.smtp 文件
這個(gè)文件的位置無關(guān)緊要,一般在/etc/tcp.smtp或者/home/vpopmail/etc/tcp.smtp如上所述,rcpthosts文件可以進(jìn)行轉(zhuǎn)發(fā)約束,但是用起來不是很爽,須知,你可能要給很多目的地址的朋友發(fā)信,那么你得一條一條地在rcpthosts里錄入,如果你是在一個(gè)局域網(wǎng)內(nèi)部使用你的郵件服務(wù)器,為了更方便的控制轉(zhuǎn)發(fā)規(guī)則,這里有個(gè)更好的辦法,這就是tcp.smtp這個(gè)文件的作用了。
這里就要使用ucspi-tcp軟件包的tcpserver程序,該程序的功能類似于inetd-監(jiān)聽進(jìn)入的連接請(qǐng)求,為要啟動(dòng)的服務(wù)設(shè)置各種環(huán)境變量,然后啟動(dòng)指定的服務(wù)。tcpserver的配置文件就是tcp.smtp,該文件定義了是否對(duì)某個(gè)網(wǎng)絡(luò)設(shè)置RELAYCLIENT環(huán)境變量。例如,本地網(wǎng)絡(luò)是地址為192.168.*.*,則tcp.smtp的內(nèi)容應(yīng)該設(shè)置如下:
127.0.0.1:allow,RELAYCLIENT=""
192.168.:allow,RELAYCLIENT=""
:allow
這幾個(gè)規(guī)則的含義是指若連接來自127.0.0.1和192.168.*.*則允許,并且為其設(shè)置環(huán)境變量RELAYCLIENT,否則允許其他連接,但是不設(shè)置RELAYCLIENT環(huán)境變量。這樣當(dāng)從其他地方到本地的25號(hào)連接將會(huì)被允許,但是由于沒有被設(shè)置環(huán)境變量,所以其連接將會(huì)被qmail-smptd所拒絕。
但是tcopserver并不直接使用tcp.smtp文件,而是需要先將該文件轉(zhuǎn)化為cbd文件:
進(jìn)入tcp.smtp這個(gè)文件所在的目錄,然后使用如下命令:
tcprules tcp.smtp.cdb tcp.smtp.temp < tcp.smtp
3 smtp 認(rèn)證
對(duì)于只在局域網(wǎng)內(nèi)部使用郵件服務(wù)器的情況下,已經(jīng)夠用了,但是單純靠tcp.smtp這個(gè)控制無法適合漫游用戶,因?yàn)閷?duì)于一個(gè)漫游用戶來說,其連接服務(wù)器時(shí)用的IP是不固定的,在這種情況下,tcp.smtp文件就沒有隨時(shí)滿足任意一個(gè)合法漫游用戶需要的靈活性。為了適應(yīng)這種需要,smtp認(rèn)證就應(yīng)運(yùn)而生了。所謂smtp認(rèn)證,就象POP驗(yàn)證用戶身份一樣,只要你是合法的用戶,輸入用戶名和密碼就可以登陸服務(wù)器轉(zhuǎn)發(fā)郵件了,對(duì)于漫游用戶來說很方便,同時(shí)也避免了open relay的危險(xiǎn)性。要讓QMAIL具備用戶驗(yàn)證的功能需要給QMAIL打補(bǔ)丁。下面具體談?wù)勅绾螌?shí)現(xiàn)QMAIL的SMTP認(rèn)證功能。
第一步:下載程序
qmail-smtp補(bǔ)?。篽ttp://members.elysium.pl/brush/qmail-smtpd-auth/
密碼檢驗(yàn)補(bǔ)?。篽ttp://members.elysium.pl/brush/cmd5checkpw/
第二步:編譯安裝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 ./
然后對(duì)該文件進(jìn)行補(bǔ)丁處理:
[root@www qmail-smtpd-auth-0.26]# patch -p1 < qmail-smtpd.patch
將qmail-smtpd.c 拷貝到qmail 的源文件目錄里:
[root@www qmail-smtpd-auth-0.26]# cp qmail-smtpd.c ../qmail-1.03
最好先將原文件備份。單獨(dú)編譯 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 目錄下。在之前應(yīng)該對(duì)原來的執(zhí)行文件進(jìn)行備份。
第三步:編譯安裝 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
第四步:設(shè)置/home/vpopmail/bin/vchkpw 的SetUID和SetGID
這點(diǎn)很重要,否則認(rèn)證無法通過。這是因?yàn)閟mtpd 的進(jìn)程是由qmaild 執(zhí)行的。而密碼驗(yàn)證程序原來只使用于pop3進(jìn)程,分別由root或vpopmail執(zhí)行,為的是讀shadow或數(shù)據(jù)庫(kù)中的密碼,并取出用戶的郵件目錄。這些操作qmaild 都沒有權(quán)限去做。如果smtp進(jìn)程要調(diào)用密碼驗(yàn)證程序,則必須要使用setuid 和setgid。
chmod 6755 /home/vpopmail/bin/vchkpw
第五步:設(shè)置tcp.smtp 有了SMTP認(rèn)證是不是就不需要tcp.smtp
這個(gè)文件了?其實(shí)不然,因?yàn)橥ㄟ^tcp.smtp這個(gè)控制文件可以方便局域網(wǎng)用戶使用郵件服務(wù)器,對(duì)于這些用戶只要tcp.smtp這個(gè)文件控制就可以了,沒有必要對(duì)身份嚴(yán)格校驗(yàn)了。假若你覺得10網(wǎng)段的用戶都不需要SMTPR認(rèn)證就可以轉(zhuǎn)發(fā)郵件的話,就這么干:
vi /etc/tcp.smtp 或者 vi /home/vpopmail/etc/tcp.smtp
192.168.10.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""
:allow
保存,然后執(zhí)行命令
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
第六步:修改smtpd啟動(dòng)腳本
#!/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>&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>&1
可愛可恨的SMTP認(rèn)證到這里就OK了!
4 三個(gè)方面的關(guān)系
如文章最開頭所述,三個(gè)方面的關(guān)系對(duì)于你究竟如何使你的郵件服務(wù)器具有安全性很重要,關(guān)于這一點(diǎn)對(duì)于初學(xué)者來說不是那么容易把握準(zhǔn)確。這三個(gè)咚咚并不是缺一不可,可以只有一部分存在,也可以都存在,那么在這諸多可能的情況下,整個(gè)郵件服務(wù)器對(duì)于轉(zhuǎn)發(fā)規(guī)則又是如何控制的呢?
下面我分幾種情況來說:
第一種情況:沒有SMTP認(rèn)證,沒有tcp.smtp文件,也沒有rcpthosts這個(gè)文件
這種情況就是“標(biāo)準(zhǔn)”的open relay,也就是完全開放轉(zhuǎn)發(fā),這種情況可能存在,但不應(yīng)該存在!
第二種情況:僅有rcpthosts這個(gè)文件,沒有tcp.smtp也沒有SMTP認(rèn)證
這種情況下,就只有rcpthosts這個(gè)文件擔(dān)當(dāng)轉(zhuǎn)發(fā)規(guī)則約束的重任了,QMAIL僅僅根據(jù)這個(gè)文件的目的
地址列表來確定是否轉(zhuǎn)發(fā)用戶的郵件
第三種情況:有tcp.smtp,rcpthosts兩個(gè)東西存在
首先QMAIL從tcp.smtp.cdb文件確認(rèn)用戶是否可以轉(zhuǎn)發(fā)郵件,是根據(jù)請(qǐng)求者的IP來定奪的。如果用戶IP
是在容許的IP范圍之內(nèi),那么就容許轉(zhuǎn)發(fā),否則再看看目的地址是否在rcpthosts這個(gè)文件的容許范圍
之內(nèi),如果是,就可以轉(zhuǎn)發(fā),如果也不是,那么就被徹底拒絕轉(zhuǎn)發(fā)了。也就是說,在這種情況下,這兩個(gè)
文件共同承擔(dān)著轉(zhuǎn)發(fā)規(guī)則約束的重任。
第四種情況:三個(gè)咚咚都存在
QMAIL在接受到請(qǐng)求的時(shí)候,首先檢查tcp.smtp這個(gè)文件,如果是容許的IP,就同意轉(zhuǎn)發(fā),否則再看看
我們通過閱讀這篇文章,可以清楚的了解到解析Qmail之郵件轉(zhuǎn)發(fā)規(guī)則是怎么樣的。希望對(duì)大家有幫助!
【編輯推薦】