摘要:本文討論了如何在sendmail環境下通過DRAC技術對用戶右鍵按轉發進行控制,在為IP地址不確定的用戶提供郵件服務的同時,防止郵件服務器被用作互聯網垃圾郵件轉發器,以增強郵件服務器的安全。本文經過嚴格的測試和試驗。
軟件環境:
DRAC
qpopper3.0
patch
sendmail
操作系統為:Rehat 6.2
硬件環境:HP E60 單網卡
什么是DRAC
互聯網中最令用戶討厭的問題就是大量的垃圾電子廣告郵件滿天飛,而作為郵件服務器管理員的你管理的郵件服務器的可能就是轉發垃圾郵件的中繼器。出現這種問題的最根本的原因是標準的電子郵件傳輸協議(SMTP)在傳輸郵件時,不進行用戶身份認證,郵件可以被匿名/冒名發送。而導致你的郵件服務器被用作垃圾郵件轉發器則是因為服務器配置不當,使得服務器是open relay的,從而被垃圾郵件發送者利用其來發送垃圾郵件。
為了解決以上問題,對于郵件服務器只為具有固定IP地址的用戶服務的情況下,比如說你管理的郵件服務器是為園區網服務的,則可以對sendmail設定只允許園區網的IP地址通過該服務器轉發郵件,從而阻止垃圾發送者通過服務器轉發垃圾郵件。具體參考本站的“senmail快速指南"一文的相關內容。
而對于需要提供免費郵件申請的應用環境,或是希望本單位用戶在出差時可以在任何地方通過撥入當地的ISP來發送接收信件的應用環境來說,這時候用戶的IP地址是不固定,是無法預料的,這樣上面的方法就不適用了。有兩種方法可以在保證合法用戶正常使用的同時防止垃圾郵件發送者利用郵件服務器轉發垃圾郵件。
第一種方法是為Sendmail加入SMTP轉發認證,請參考本站的《Sendmail環境下實現SMTP認證拒絕垃圾郵件》。另外一種就是DRAC(Dynamic Relay Authorization Control)-動態郵件轉發授權控制。
DRAC(Dynamic Relay Authorization Control——動態轉發授權控制),其原理就是利用pop3或imap服務器固有的功能通過用戶名、密碼和客戶機IP地址蘭驗證用戶身份的合法性,并將這些用戶IP信息及時映象到允許轉發郵件的驗證數據庫中,供smtp服務器調用,同時在經過一段時間以后(缺省為30分種),其驗證信息將自動失效,需要用戶重新輸入驗證信息。這樣不僅可以保證合法的pop3或imap用戶能夠正常使用郵件服務器,也可以阻止任何非注冊用戶(包括本地)利用郵件服務器來發送郵件。這種郵件安全控制常常被稱為:“郵件服務之前的pop驗證”(POP-before-SMTP)。
DRAC 實際上是一個運行在后臺的守護進程,以客戶/服務器模式運行??蛻舴掌髦g通過使用RPC進行網絡通訊。在這個系統中,POP或IMAP是客戶程序, DRAC daemon 是服務程序可以同時為網絡上的多臺郵件服務器提供動態轉發的功能。DRAC守護進程必須與郵件服務器(Sendmail)運行在同一臺計算機上。因此,在實際應用時,Sendmail和DRAC運行在同一臺機器上,而POP或IMAP可以運行在網絡中的其他計算機上,本文的示例討論所有的服務都安裝在同一臺服務器上的情況。
撥號上網的用戶IP是一個不定值。只有把他的IP加入到access.db中,用戶才能使用郵件服務器發郵件。如果采用動態控制,在用戶收取郵件時,進行身份驗證,對于驗證通過的用戶,后臺監控程序會實時地將用戶當前的IP記錄到數據庫中。具體實現過程是:先“收”后“發”, 收件時要經用戶身份認證,認證后將用戶的IP加入數據庫,IP地址在SMTP Server的數據庫中保存30分鐘。每收取一次郵件,計時重新開始。30分鐘內如果用戶不使用郵件服務收發,則DRAC將用戶的IP從數據庫中刪除。這種做法保證了撥號用戶可以收發自己的郵件。唯一不方便的是:用戶第一次發郵件時,需要先收一次郵件。感覺上,這好像很麻煩,不過,如果大家都習慣了先收后發,那么就一點兒也不會有別扭的感覺了。
軟件安裝
軟件安裝需要三個步驟:第一步首先安裝DRAC,然后安裝POP/IMAP服務器,最后配置Sendmail服務器。
1、DRAC的安裝
首先在/usr/src目錄下創建子目錄drac:
[root@mail drac]# mkdir drac
[root@mail drac]# cd drac/
解開軟件包:
[root@mail drac]# cp /root/drac.tar.Z ./drac/
[root@mail drac]# tar xvfz drac.tar.Z
編輯Makefile,修改其中如下內容:
INSTALL = install
EBIN = /usr/local/sbin
MAN = /usr/local/man/man
DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C
CC = gcc
RANLIB = :
CFLAGS = $(DEFS) -g
LDLIBS = -ldb
TSTLIBS = -L. -ldrac
RPCGENFLAGS = -C -I
MANLIB = 3
MANADM = 8
編譯安裝DRAC:
[root@mail drac]# make
[root@mail drac]# make install
[root@mail drac]# make install-man
編輯/etc/mail/dracd.allow文件,確保內容如下:
# dracd.allow: clients trusted by rpc.dracd
#
# The format of this file is one of more lines of
#
# netmask netaddr
# Both netmask and netaddr must be dotted quads.
#
255.255.255.255 127.0.0.1
####
啟動DRAC,在啟動以前先要啟動portmap服務,首先確定系統安裝有portmap軟件包:
[root@mail drac]# rpm -qa|grep portmap
portmap-4.0-19
然后啟動portmap服務:
[root@mail drac]# /etc/rc.d/init.d/portmap start
啟動DRAC服務器:
[root@mail drac]# /usr/local/sbin/rpc.dracd
安裝drac庫:
[root@mail drac]# mkdir /usr/lib/drac
[root@mail drac]# cp libdrac.a /usr/lib/drac/
2、安裝Qpopper
Qpopper本來沒有自動向DRAC發信息功能,需要對Qpopper進行補丁處理才能實現POP Server與DRAC進行通訊。本文以Qpopper 3.0為例。
[root@mail src]# tar xvfz qpopper3.0.tar.Z
[root@mail src]# cd qpopper3.0
[root@mail qpopper3.0]# cp /root/patch
[root@mail qpopper3.0]# patch -p0 < patch
[root@mail qpopper3.0]# ./configure --enable-specialauth --enable-dracauth
[root@mail qpopper3.0]# make
[root@mail qpopper3.0]# cp popper/popper /usr/local/sbin/
確保/etc/inetd.conf中包含下內容(將原有的pop一行前添加#,以將其注釋掉):
pop-3 stream tcp nowait root /usr/local/sbin/popper qpopper -s
并將原來含POP3的一行屏蔽掉。重啟inet:
[root@mail mail]# ps ax|grep inetd
336 ? S 0:00 inetd
3925 pts/0 S 0:00 grep inetd
[root@mail mail]# kill -HUP 336
這時候新的POP server就具有與DRAC通信的功能了。
3、sendmail的配置
sendmail的安裝可以參考"sendmail快速指南"一文,這里只需要在其基礎上修改sendmail.cf文件即可。
編輯/etc/sendmail.cf:
在"local info"部分的最后添加入下內容:
# dynamic relay authorization control map
Kdrac btree /etc/mail/dracd
緊接著"SLocal_check_rcpt"一行下面添加如下內容:
# allow recent POP/IMAP mail clients to relay
R$* $: $&{client_addr}
R$+ $: $(drac $1 $: ? $)
R? $@ ?
R$+ $@ $#OK
注:這里上面添加內容中第一個字段和第二個字段之間是"tab"鍵隔開,而第二個字段和第三個字段之間是由一個空格隔開(例如:R$* $:之間的為tab鍵隔開,而$: $&{client_addr}之間由空格隔開。下面的內容類似)。如果不按照這樣的格式設置sendmail啟動時可能會出現錯誤,或不能實現drac。
重新啟動sendmail服務器:
[root@mail mail]# ps ax|grep sendmail
3909 ? S 0:00 sendmail: accepting connections
3934 pts/0 S 0:00 grep sendmail
[root@mail mail]# kill 3909
[root@mail mail]# /usr/sbin/sendmail -bd -q20m
測試
啟動dracd服務器以后,就會在/etc/mail/目錄下存在文件dracd.db,首先查看當前dracd.db庫中的內容:
[root@mail mail]# db_dump -p /etc/mail/dracd.db?。@示存放在一個dracd.db文件的記錄)
format=print
type=btree
bt_minkey=2
db_pagesize=512
HEADER=END
可以看到當前不允許任何IP通過本機轉發。這時候如果試圖轉發郵件就會出現以下的內容:
[root@iServer_120 /root]# telnet 200.100.100.100 25
Trying 200.100.100.100...
Connected to 200.100.100.100.
Escape character is ^].
220 ESMTP Sendmail 8.11.4/8.11.4; Mon, 9 Jul 2001 18:33:20 +0800
helo
250 Hello [202.99.11.120], pleased to meet you
mail from:
250 2.1.0 ... Sender ok
rcpt to:
550 5.7.1 ... Relaying denied. IP name lookup failed [202.99.11.120]
quit
221 2.0.0 closing connection
Connection closed by foreign host.
可以看到郵件轉發被拒絕,現在通過pop認證自己:
[root@iServer_120 /root]# telnet 200.100.100.100 110
Trying 200.100.100.100...
Connected to 200.100.100.100.
Escape character is ^].
+OK QPOP (version 3.0) at starting.
user ideal
+OK Password required for ideal.
pass mypassword
+OK ideal has 0 visible messages (0 hidden) in 0 octets.
quit
+OK Pop server at signing off.
Connection closed by foreign host.
現在再查看dracd.db內容:
[root@mail mail]# db_dump -p /etc/mail/ dracd.db
format=print
type=btree
bt_minkey=2
db_pagesize=512
HEADER=END
202.99.11.120
994678915
可以看到現在已經將202.99.11.120,也就是的地址加入了允許relay的列表中?,F在我們再測試郵件轉發:
[root@iServer_120 /root]# telnet 200.100.100.100 25
Trying 200.100.100.100...
Connected to 200.100.100.100.
Escape character is ^].
220 ESMTP Sendmail 8.11.4/8.11.4; Mon, 9 Jul 2001 18:41:08 +0800
helo
250 Hello [202.99.11.120], pleased to meet you
mail from:
250 2.1.0 ... Sender ok
rcpt to:
250 2.1.5 ... Recipient ok
quit
221 2.0.0 closing connection
Connection closed by foreign host.