解析Qmail之郵件轉發規則
說起Qmail,大家都知道他是郵件系統里安全度最高的之一,那他的郵件轉發規則是什么,請看下文。
關于郵件的轉發規則,即是一個很普通的話題也是一個很重要的話題。說它是一個普通話題是因為凡是玩郵件服務的哥們都或多或少了解這個話題,說他是一個很重要的話題,是因為我們中間好多人都為這個玩意兒感到困惑過,可不,前幾天我還在IGENUS論壇上請教過大麻兄關于郵件的轉發規則的問題呢,我也一直為這個咚咚感到很迷惑,還好,通過在大麻兄的耐心指導和自己長期不懈的摸索測試,現在終于搞明白了。在這里我很樂意把自己的學習所獲貼出來與大家分享,希望能給初學者給點引導,讓他們少走彎路,同時也希望高手們批評指點,謝謝!
在QMAIL中要鬧清楚郵件轉發規則,要依次明白三個方面的咚咚。
1 rcpthosts 文件 /var/qmail/control/rcpthosts
2 tcp.smtp 文件 /etc/tcp.smtp或者是/home/vpopmail/etc/tcp.smtp
3 smtp 認證
下面,我來一個一個地談這三個咚咚,注意,我是說,我先要把這三個反面各自獨立來談,談各自的功能和使用方法,后面我將把這三個方面結合起來談,那才是在實戰中要明白和要用到的最重要的東西。
1 rcpthosts 文件
這個郵件服務器可以接受轉發請求的目的
主機列表(或者說目的地址列表),比如在這個文件里有sina.com,souhu.com。那么你可以通過這個服務器轉發發往sina.com,souhu.com的任何郵件,如果你想通過這個服務器給aaa@bbb.com發信的話,就會報錯:553 sorry,that domain isn't in my list ofallowed 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 < tcp.smtp
3 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.patch
將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 < /etc/tcp.smtp
第六步:修改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>&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認證到這里就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,就同意轉發,否則再看看
我們通過閱讀這篇文章,可以清楚的了解到解析Qmail之郵件轉發規則是怎么樣的。希望對大家有幫助!
【編輯推薦】