杨劭彤
现今,网络上电子邮件广告满天飞。造成这种状况的一个主要原因就是,标准的电子邮件传输协议(SMTP)在传输邮件时,不进行用户身份认证,邮件可以被匿名/冒名发送。
为了解决以上问题,需要修改SMTP服务器,加入SMTP认证,相关内容请参阅文章:《SMTP认证让Spammer走开》。除此以外,还有一种更为灵活的方法来实现——动态转发授权控制(Dynamic Relay Authorization Control),DRAC可以通过动态控制IP来阻止Spammer。本文主要就DRAC进行详细的说明。
DRAC的机理
DRAC(Dynamic Relay Authorization Control——动态转发授权控制)是一个运行在后台的Daemon,它可以动态地更新Sendmail的Relay授权,合法用户通过它可以在任何地方发送电子邮件。而且同时又能阻止非法用户使用SMTP Server发送邮件。一旦合法用户正确地收取了邮件,DRAC就会将合法用户的IP动态加入到SMTP Server的数据库中,允许他通过服务器向外发信。
DRAC 实际上是一个客户/服务系统,客户、服务之间通过使用RPC进行网络通讯。在这个系统中,POP或IMAP server是客户程序, DRAC daemon 是服务程序, 可以同时为网络上的多台邮件服务器提供动态转发的功能。如果你的网络中还有其他的服务器上需要实现动态转发邮件的功能,DRAC daemon 必须与SMTP server(Sendmail)运行在同一台计算机上。所以,实际应用时,Sendmail 和DRAC运行在同一台机器上,而POP或IMAP可以运行在网络中的其他计算机上。
如果你有多个POP/IMAP服务器,它们分别运行在不同的计算机上,那么你可以通过配置文件:/etc/mail/dracd.allow 来使这些机器使用DRAC。Dracd.allow文件中应该包含所有的POP/IMAP server的IP地址。文件格式参见/var/yp/securenets ,文件内容举例如下:
255.255.255.252 130.179.16.0
255.255.255.255 130.179.16.8
255.255.255.255 127.0.0.1
所以,在实际配置时,POP/IMAP servers 可以运行在网络中的其他计算机上。通过向DRAC发送RPC,动态地将用户的IP添加到数据库中。当然,POP/IMAP server必须配置成能够发送RPC请求到DRAC服务器。有关多台POP/IMAP服务器的情况,有兴趣的读者可以进一步研究。
移动用户邮件的Relay
拨号上网的用户IP是一个不定值。只有把他的IP加入到access.db中,用户才能使用邮件服务器发邮件。如果采用动态控制,在用户收取邮件时,进行身份验证。对于验证通过的用户,后台监控程序会实时地将用户当前的IP记录到数据库中。具体实现过程是:先“收”后“发”, 收件时要经用户身份认证,认证后将用户的IP加入数据库,IP地址在SMTP Server的数据库中保存30分钟。每收取一次邮件,计时重新开始。30分钟内如果用户不使用邮件服务收发,则DRAC将用户的IP从数据库中删除。这种做法保证了拨号用户可以收发自己的邮件。唯一不方便的是:用户第一次发邮件时,需要先收一次邮件。感觉上,这好像很麻烦,不过,如果大家都习惯了先收后发,那么就一点儿也不会有别扭的感觉了。在以下站点可以查到更为详细的资料:http://mail.cc.umanitoba.ca/drac。
实际安装
实际安装分三步:安装DRAC、安装POP/IMAP服务器、配置Sendmail服务。
1.安装DRAC
首先下载软件包,下载地址:http://mail.cc.umanitoba.ca/drac/drac.tar.z (19KB)。
编译时需要根据操作系统的种类更改相应的Makefile文件,对于Linux,则更改内容如下:
#### Makefile for drac
INSTALL = install
EBIN = /usr/local/sbin
MAN = /usr/local/man/man
# OS-Dependant settings
DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C # Socket RPC
# Compiler flags
CC = gcc
RANLIB = :
CFLAGS = $(DEFS) -g
LDLIBS = -ldb
TSTLIBS = -L. -ldrac -lnsl
RPCGENFLAGS = -C -I
# Man sections
MANLIB = 3
MANADM = 8
接下来,对DRAC进行安装,过程如下:
# make; make install (安装)
# make install-man (安装man)
启动DRAC,直接运行方式:
#/etc/rc.d/init.d/dracd start
这样会启动一个运行在后台的服务进程——dracd,由它来充当服务器,它将POP/IMAP提交的用户IP动态加入到邮件服务器的数据库中。
2.安装Qpopper
原版本的Qpopper是不会自动向DRAC发信息的,所以,要对Qpopper进行一些改写,以便POP Server与DRAC进行通讯,目前有补丁的Qpopper版本有3.02、3.12版。也可以选择使用IMAP server,同样也要对它打补丁。本文中笔者以Qpopper 3.02为例。
$ tar -zxvf qpopper-3.0.2.tar.gz (支持多种POP3及IMAP软件)
$ patch -p0 < patch-qpopper-3.0.2-drac-no-configure
$ cd qpopper-3.0.2
$ ./configure -- --enable-specialauth (如果采用了shadow,则加这个参数)
$ make
在/etc/inetd.conf中加入:
pop3 stream tcp nowait root /usr/local/lib/popper qpopper -s
并将原来含POP3的一行屏蔽掉。重启inet。
这样,改写过的POP server也生效了。
3.配置Sendmail.cf
Sendmail(SMTP server)配置文件也应该进行相应的更改,需要在sendmail.mc中加入:
LOCAL_CONFIG
# dynamic Relay authorization control map
Kdrac btree -o /etc/mail/dracd
LOCAL_RULESETS
SLocal_check_rcpt
# allow recent POP/IMAP mail clients to Relay
R$* $: $&&{client_addr}
R$+ $: $(drac $1 $: ? $)
R? $@ ?
R$+ $@ $#OK
然后,使用m4编译sendmail.mc:
#m4 sendmail.mc > /etc/mail/sendmail.cf
最后,重新启动Sendmail。
测试DRAC
通过网络中的另一台Linux主机远程登录邮件服务器的110端口:
[abc@rh62 abc]$ telnet 192.168.1.200 110(笔者在一台IP地址为192.168.1.13的电脑上操作)
系统显示:
Trying 192.168.1.200...
Connected to ns1.chinatrend.com (192.168.1.200).
Escape character is ^].
+OK ready
user abc (用户名为abc)
+OK Password required for abc.
pass abcabc (输入口令为abcabc)
+OK abc has 0 visible messages (0 hidden) in 0 octets. (服务器上有0个邮件)
quit (退出)
+OK Pop server at mail.chinatrend.com signing off.
Connection closed by foreign host.
接下来,再试验在IP为192.168.1.111这台计算机上使用Outlook收发一次邮件,然后到邮件服务器上查看动态数据库的内容:
[abc@mail mail]$ db_dump -p dracd.db (记录存放在一个dracd.db文件中,显示文件内容)
format=print
type=btree
bt_minkey=2
db_pagesize=512
HEADER=END
192.168.1.111
986957888
192.168.1.13 (登录成功主机的IP)
986957984
从前面的显示可以看到192.168.1.13及192.168.1.111已经加入到动态数据库中了。至此成功安装。
以上是通过自行编译安装DRAC的过程,做起来不太容易,是吗?实际上,你也可以不用自己动手编译,而是采用别人编译好了现成的RPM软件包,直接下载安装就可以。下载地址:ftp.minn.net/user/mmchen。
不过,提醒大家注意:配置sendmai.cf的步骤不能省,方法同上。以上方法在Redhat 6.2环境下通过,针对Redhat 6.2的软件包,可以在:http://mail.cc.umanitoba.ca/drac找到编译好的RPM软件包的地址链接。