關于郵件的轉發規則,即是一個很普通的話題也是一個很重要的話題。說它是一個普通話題
是因爲凡是玩郵件服務的哥們都或多或少了解這個話題,說他是一個很重要的話題,是因爲我們中
間好多人都爲這個玩意兒感到困惑過,可不,前幾天我還在IGENUS論壇上請教過大麻兄關于郵件
的轉發規則的問題呢,我也一直爲這個咚咚感到很迷惑,還好,通過在大麻兄的耐心指導和自己長
期不懈的摸索測試,現在終于搞明白了。在這裏我很樂意把自己的學習所獲貼出來與大家分享,希
望能給初學者給點引導,讓他們少走彎路,同時也希望高手們批評指點,謝謝!
在QMAIL中要鬧清楚郵件轉發規則,要依次明白三個方面的咚咚。
1 rcpthosts 文件 /var/qmail/control/rcpthosts
2 tcp.smtp 文件 /etc/tcp.smtp或者是/home/vpopmail/etc/tcp.smtp
3 smtp 認證
下面,我來一個一個地談這三個咚咚,注意,我是說,我先要把這三個反面各自獨立來談,
談各自的功能和使用方法,後面我將把這三個方面結合起來談,那才是在實戰中要明白和要
用到的最重要的東西。
1 rcpthosts 文件 rcpthosts這個名字取得好,見名知意嘛。意思是
這個郵件服務器可以接受轉發請求的目的
主機列表(或者說目的地址列表),比如在這個文件裏有sina.com,souhu.com。那麽你可以
通過這個服務器轉發發往sina.com,souhu.com的任何郵件,如果你想通過這個服務器給
aaa@bbb.com發信的話,就會報錯:553 sorry,that domain isn't in my list of
allowed rcpthosts!知道了吧,因爲bbb.com確實沒有在rcpthosts裏面啦,于是就
理所當然地被拒絕轉發了。那麽如果根本就沒有rcpthost這個文件情況又如何呢?在這種
情況下,QMAIL會理解爲open relay,意味開放式轉發,也就是說任何人可以通過你的這個
郵件服務器向任何人發送郵件。這種情況是很危險的,因爲你的服務器很容易被垃圾郵件制造
者當作發送垃圾郵件的中繼站,你的服務器將被反垃圾聯盟列入黑名單,那麽你的服務器就
什麽事都做不成了,除非你只是在局域網內部使用。所以,rcpthosts這個文件是很有用的。
你想對哪個地址開放,就直接在rcpthosts裏加入這個目的地址就OK了,就這麽簡單!
2 tcp.smtp 文件
這個文件的位置無關緊要,一般在/etc/tcp.smtp或者/home/vpopmail/etc/tcp.smtp
如上所述,rcpthosts文件可以進行轉發約束,但是用起來不是很爽,須知,你可能要給很多
目的地址的朋友發信,那麽你得一條一條地在rcpthosts裏錄入,如果你是在一個局域網內部
使用你的郵件服務器,爲了更方便的控制轉發規則,這裏有個更好的辦法,這就是tcp.smtp這
個文件的作用了。
這裏就要使用ucspi-tcp軟件包的tcpserver程序,該程序的功能類似于inetd-監聽進
入的連接請求,爲要啓動的服務設置各種環境變量,然後啓動指定的服務。tcpserver的配置
文件就是tcp.smtp,該文件定義了是否對某個網絡設置RELAYCLIENT環境變量。例如,本
地網絡是地址爲192.168.*.*,則tcp.smtp的內容應該設置如下:
127.0.0.1:allow,RELAYCLIENT=""
192.168.:allow,RELAYCLIENT=""
:allow
這幾個規則的含義是指若連接來自127.0.0.1和192.168.*.*則允許,並且爲其設置環境變量
RELAYCLIENT,否則允許其他連接,但是不設置RELAYCLIENT環境變量。這樣當從其他地方到
本地的25號連接將會被允許,但是由于沒有被設置環境變量,所以其連接將會被qmail-smptd
所拒絕。
但是tcopserver並不直接使用tcp.smtp文件,而是需要先將該文件轉化爲cbd文件:
進入tcp.smtp這個文件所在的目錄,然後使用如下命令:
tcprules tcp.smtp.cdb tcp.smtp.temp
3 smtp 認證 上面提到的tcp.smtp這個文件很有用處,可以讓你一勞永逸。
對于只在局域網內部使用郵件服務器
的情況下,已經夠用了,但是單純靠tcp.smtp這個控制無法適合漫遊用戶,因爲對于一個漫遊用戶
來說,其連接服務器時用的IP是不固定的,在這種情況下,tcp.smtp文件就沒有隨時滿足任意一個
合法漫遊用戶需要的靈活性。爲了適應這種需要,smtp認證就應運而生了。所謂smtp認證,就象POP
驗證用戶身份一樣,只要你是合法的用戶,輸入用戶名和密碼就可以登陸服務器轉發郵件了,對于漫遊
用戶來說很方便,同時也避免了open relay的危險性。要讓QMAIL具備用戶驗證的功能需要給QMAIL
打補丁。下面具體談談如何實現QMAIL的SMTP認證功能。
第一步:下載程序
qmail-smtp補丁:http://members.elysium.pl/brush/qmail-smtpd-auth/
密碼檢驗補丁:http://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 ./
然後對該文件進行補丁處理:
[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 目錄下。在之前應該對原來的執行文件進行備份。
第三步:編譯安裝 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
第四步:設置/home/vpopmail/bin/vchkpw 的SetUID和SetGID
這點很重要,否則認證無法通過。這是因爲smtpd 的進程是由qmaild 執行的。而密碼驗證程序原來
只使用于pop3進程,分別由root或vpopmail執行,爲的是讀shadow或數據庫中的密碼,並取出用戶
的郵件目錄。這些操作qmaild 都沒有權限去做。如果smtp進程要調用密碼驗證程序,則必須要使用
setuid 和setgid。
chmod 6755 /home/vpopmail/bin/vchkpw
第五步:設置tcp.smtp 有了SMTP認證是不是就不需要tcp.smtp
這個文件了?其實不然,因爲通過tcp.smtp這個控制文件可以
方便局域網用戶使用郵件服務器,對于這些用戶只要tcp.smtp這個文件控制就可以了,沒有必要對身份
嚴格校驗了。假若你覺得10網段的用戶都不需要SMTPR認證就可以轉發郵件的話,就這麽幹:
vi /etc/tcp.smtp 或者 vi /home/vpopmail/etc/tcp.smtp
192.168.10.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""
:allow
保存,然後執行命令
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp
第六步:修改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
可愛可恨的SMTP認證到這裏就OK了!
4 三個方面的關系
如文章最開頭所述,三個方面的關系對于你究竟如何使你的郵件服務器具有安全性很重要,關于這一點
對于初學者來說不是那麽容易把握准確。這三個咚咚並不是缺一不可,可以只有一部分存在,也可以都
存在,那麽在這諸多可能的情況下,整個郵件服務器對于轉發規則又是如何控制的呢?
下面我分幾種情況來說:
第一種情況:沒有SMTP認證,沒有tcp.smtp文件,也沒有rcpthosts這個文件
這種情況就是「標准」的open relay,也就是完全開放轉發,這種情況可能存在,但不應該存在!
第二種情況:僅有rcpthosts這個文件,沒有tcp.smtp也沒有SMTP認證
這種情況下,就只有rcpthosts這個文件擔當轉發規則約束的重任了,QMAIL僅僅根據這個文件的目的
地址列表來確定是否轉發用戶的郵件
第三種情況:有tcp.smtp,rcpthosts兩個東西存在
首先QMAIL從tcp.smtp.cdb文件確認用戶是否可以轉發郵件,是根據請求者的IP來定奪的。如果用戶IP
是在容許的IP範圍之內,那麽就容許轉發,否則再看看目的地址是否在rcpthosts這個文件的容許範圍
之內,如果是,就可以轉發,如果也不是,那麽就被徹底拒絕轉發了。也就是說,在這種情況下,這兩個
文件共同承擔著轉發規則約束的重任。
第四種情況:三個咚咚都存在
QMAIL在接受到請求的時候,首先檢查tcp.smtp這個文件,如果是容許的IP,就同意轉發,否則再看看
轉發目的地址是否在rcpthosts文件所容許的地址,如果是就轉發,否則就啓用SMPT認證來驗證用戶,
驗證通過就同意轉發,否則就徹底拒絕。