ringsung 发表于 2003-7-10 14:24:03

[转帖]在postfix中通过pop-before-smtp防止垃圾邮件

转自LinuxAid<br>
<br>
前言:<br>
<br>
  垃圾邮件的产生可以追溯到SMTP服务器的诞生,原先设计SMTP服务器时,因为Internet的规模还是非常小的,所以设计者认为所有的客户都是可信任的,就没有在SMTP中加入相应的认证功能。现在这个弊端已经暴露无遗,Internet上垃圾邮件的满天飞就是一个明证。<br>
<br>
  通常采用两种手段来防止垃圾邮件,其一,通过SASL对SMTP认证支持,提供SMTP认证,关于在postfix中实现SMTP认证,可以参考本站解决方案中的“在postfix中实现基于cyrus-sasl的SMTP认证”一文;其二,就是本文要讨论的通过pop-before-smtp(在发信前收信)来防止垃圾邮件。<br>
<br>
原理:<br>
<br>
  在postfix的配置文件中,提供了大量的垃圾邮件控制选项,可以通过SMTP会话客户、收信人地址、发信人地址等等参数来进行控制。其中有个smtpd_recipient_restrictions参数,就是通过收信人的地址进行控制,我们可以这样指定这个参数的值:<br>
<br>
smtpd_recipient_restrictions=permit_mynetworks, permit_auth_destination<br>
check_client_access hash:/etc/postfix/pop-before-smtp, reject<br>
<br>
  也就是说,如果SMTP客户的ip地址如果包含在mynetworks参数中,或者包含在/etc/postfix/pop-before-smtp数据库中,再或者收信人地址就是本地SMTP服务器,则允许其连接,否则则拒绝之。这样我们就可以设计这样一个程序,这个程序不断监视邮件日志文件(通常是/var/log/maillog)的行为,一旦有人通过了pop/imap认证,就将其ip地址加入/etc/postfix/pop-before-smtp数据库,这样以来就可以保证发信的用户(即SMTP客户)的合法性了。当然这样作也有一个缺点,那就是用户在发信前必须先收一次信,这也就是pop-before-smtp名称的由来。<br>
<br>
  这所以使用smtpd_recipient_restrictions这个参数,是因为这个参数的值可以是permit_auth_destination,也就是可以指定:如果一封信最终的收信人地址就是本SMTP服务器,则接受这封信。所以我们选用这个参数来进行后面的操作,否则您的postfix会拒绝其他SMTP服务器的连接请求,从而就不能收信了。<br>
<br>
实现:<br>
<br>
1.pop-before-smtp的相关介绍<br>
<br>
   pop-before-smtp是用perl写的实现上面我们讨论的将经过pop/imap认证用户的ip地址写入数据库的程序,这个程序以后台方式运行。并且,该程序的设计是以达到最佳性能和最少占用系统资源的目的设计的。比如如果用户的ip地址包含在mynetworks参数中,则就不对这个地址进行操作;再比如,因为一个地址的有效时间是30分钟,如果一定时间(大于30分钟)内没有用户进行pop/imap操作,这个程序也不会去执行定期的检查数据库中ip是否超时。<br>
<br>
  从功能上说,pop-before-smtp和DRAC(动态中继认证控制)很类似,但是在设计目的上这两者是完全不同的:DRAC是采用客户端/服务器模式设计的,并且需要对pop/imap服务器进行修改;而pop-before-smtp不需要对其他imap/pop服务器进行任何修改,也不采用客户端/服务器模式。所以pop-before-smtp使用更简单、维护更方便。您可以惊奇的发现,其实pop-before-smtp的有效代码只有200多行。但是对于pop/imap和SMTP服务器位于不同服务器上的用户,就无法使用pop-before-smtp了,因为pop-before-smtp要求pop/imap和SMTP服务器在同一台服务器上。<br>
<br>
2.下载pop-before-smtp程序<br>
<br>
  从<a target=_blank href=http://people.oven.com/bet/pop-before-smtp/>http://people.oven.com/bet/pop-before-smtp/</a>下载pop-before-smtp,当前的最新版本是pop-before-smtp-1.28.tar.gz.。<br>
<br>
3.安装所需perl模块<br>
<br>
  pop-before-smtp需要以下四个perl模块的支持:<br>
<br>
file&#58:Tail<br>
Time::HiRes <br>
Net::Netmask<br>
Date::Parse<br>
<br>
  如果您的SMTP服务器可以访问Internet,可以使用以下命令安装这些模块:<br>
<br>
# perl -MCPAN -e 'install Time::HiRes'<br>
# perl -MCPAN -e 'install file&#58:Tail'<br>
# perl -MCPAN -e 'install Date::Parse'<br>
# perl -MCPAN -e 'install Net::Netmask'<br>
<br>
  如果您的SMTP服务器当前不可以访问Internet,可以从<a target=_blank href=http://www.cpan.org/>http://www.cpan.org/</a>下载这四个模块,然后手工根据模块内的说明进行安装。<br>
<br>
4.安装pop-before-smtp<br>
<br>
  将pop-before-smtp拷贝到SMTP服务器上的/tmp下,然后用tar解开:<br>
<br># tar xvzf pop-before-smtp-1.28.tar.gz<br>
<br>
  这将生成pop-before-smtp-1.28目录,进入该目录:<br>
<br># cd pop-before-smtp-1.28<br>
<br>
  然后执行:<br>
<br>
# cp contrib/init-redhat-alex /etc/rc.d/init.d/pop-before-smtp.init<br>
# cp pop-before-smtp /usr/sbin/<br>
<br>完成以后执行以下命令启动pop-before-smtp<br>
<br>#/etc/rc.d/init.d/pop-before-smtp.init start<br>
<br>如果要每次系统启动后都会自动执行该脚本,可以执行以下命令:<br>
<br>#chkconfig –add pop-before-smtp.init<br>
<br>
5.修改pop-before-smtp配置参数<br>
<br>缺省的pop-before-smtp认为:<br>
<br>
maillog位于/var/log目录下<br>
数据库名为pop-before-smtp.db保存在/etc/postfix/目录下<br>
ip地址的有效时间为30分钟<br>
<br>
  如果您的系统和缺省的配置相冲突,或者您想自己定义这些参数,您可以编辑/usr/sbin/ pop-before-smtp文件,找到以下几个参数,然后进行修改:<br>
<br>
maillog文件位置:$logfile<br>
数据库名称和位置:$dbfile<br>
有效时间:$grace<br>
<br>
6.修改/etc/postfix/main.cf配置文件<br>
<br>在/etc/postfix/main.cf配置文件中加入:<br>
<br>
smtpd_recipient_restrictions=permit_mynetworks, permit_auth_destination<br>
check_client_access hash:/etc/postfix/pop-before-smtp, reject<br>
<br>然后重启动postfix:<br>
<br>
#postfix stop<br>
#postfix start<br>
<br>这样pop-before-smtp就开始工作了,要查看其状态,可以执行:<br>
<br>#/etc/rc.d/init.d/pop-before-smtp.init status<br>
<br>
页: [1]
查看完整版本: [转帖]在postfix中通过pop-before-smtp防止垃圾邮件