《The BOOK Of PF》中文版 —— 22. 调整表格进行主动式防御、让spamer无计可施
发表于 : 2010-07-20 2:16
让垃圾发送者无计可施
还有一个需要特别留心的服务是email。Email是一个比较早的Internet服务而且大家很依赖它。以SMTP的形式和一台检索协议的主机, email是所有TCP/IP网络的基本服务之一。太基本了,以至于事实上很难想象没有它Internet会怎样 。
在本世纪的早些时候, 商业的Internet见证了兜售信息的增长日渐成为一个问题,甚至迫使SMTP email使用量减少。随即人们发明了各种各样的内容过滤方法, 而在BSD系统上一些开源的过滤软件运行的很好, 在2003年早期,OpenBSD团队开始着手研究自己的抵御垃圾信息方案, 被称为spamd。首个spamd的版本作为OpenBSD 3.3的组件于2003年5月1日发布。
说明
除了OpenBSD的spam-deferral进程, 基于反垃圾package的SpamAssassin (http://spamassassin.apache.org) 的内容过滤也提供了一个名为spamd的程序。这两个程序的设计目的都是阻止垃圾信息的, 但是对于底层问题它们采用完全不同的方法而且不能直接配合协调工作。但是, 在你的网络上当两个程序正确配置及运行后, 它们实施时并不会发生冲突。这两个程序在任何方面全没有联系, 而且两个程序安装在文件系统的不同位置; 如果需要, 可能将这两个反垃圾程序安装在同一个系统上。
新的程序通过一组具有特定目的表格和重定向规则hook进(嵌入)数据包过滤系统内。基本的设计思路很容易理解, 而且基于我们前面的PF规则集, 你要领悟下面pf.conf的内容应该并不困难:
我们有两个具有独特名字的表格(tables)。现在你需要注意这两个表格的名字并往下看,要点是将来自包含在第一个表格以及不在第二个表格的IP地址的SMTP通讯重定向到一个监听端口是8025守护进程上。
记住, 你并非孤军奋战: 设置黑名单
原始的spamd设计出发点是实际情况里垃圾信息发送者发送大量的信息,而你作为第一个收到此类信息的概率微乎其微。此外, 垃圾信息主要来自对此类信息监管不严的网络以及大量的被劫持计算机。无论是特定的信息或是机器都会被快速地报告到黑名单里, 此类信息最终汇总到我们例子里的第一个表格里。
Classic模式下的spamd: 黑名单及粘性的Tar Pit
(译者:原文的the Sticky Tar Pit原来的意思应该是粘粘的沥青,读者可以想象一下,汽车开到这里的速度会骤降,在这里是指故意拖慢发送垃圾信息的SMTP通讯的做法。因为要发挥功效,此类通讯需要大流量,Tar Pit的方式可以极大地减缓垃圾信息自动发送或者暴力破解的速度。)
在classic模式下, spamd采用一种被称为tarpitting(译者:这里是TarPit的词性变化。)的方法。该守护进程将自己的banner提交给来自黑名单内IP地址的SMTP的连接,然后马上切换到另一种模式,在此模式下每次仅回复这些SMTP通讯一个字节, 这样做的目的是尽量多的消耗发送端的时间、同时对接收端几乎没有任何开销。
这个仅给发来的SMTP信息回复一个字节的特殊措施经常被喻为“口吃”。OpenBSD 4.0上包含的默认spamd模式就是基于黑名单的tarpitting加上“口吃”。
将spamd设置为传统的仅使用黑名单的模式还是很简单的。先将上面提到的重定向和表格定义放到你的pf.conf文件里, 然后看一下你的spamd.conf文件。
说明
请注意在FreeBSD里, spamd是一个port, 在mail/spamd/。如果你想在FreeBSD 5.x或更新的版本里运行PF,你就需要安装这个port, 并按照提示信息操作, 然后再回到这里。
一个基本的spamd.conf文件
一般软件发布时会提供很多的注释内容, 读者还可以去查看它的用户手册, 不过我们在这里还是介绍一下其基本要点。
说明
在OpenBSD 4.0或更早期的版本里 (还有就是, 在OpenBSD的4.1版本发布时对应的其它操作系统版本,可能在port里的), spamd.conf文件在 /etc 下。 从OpenBSD4.1开始,这个文件被放在了 /etc/mail 目录下。
在此文件的的开始处, 你会发现没有注释符的一行"all:\"。这行指定了实际使用的那些list, 例如
在这里你可以加上你要是用的所有的黑名单, 如果有多个名单用冒号“:”分开。如果你想从黑名单里剔除白名单, 在每个黑名单后面紧接着给出白名单的名字, 例如, :blacklist:whitelist:
下面是一个黑名单定义:
第一个数据段是名单类型,根据名称我们知道本例中是黑名单。而msg这段包含了在SMTP对话中显示给黑名单发送者的信息。method这行指定了spamd-setup程序如何获取名单数据,本例中是http,还可能通过其它的方式,包括从ftp, 从一个文件或从执行一个外部文件。Finally, file这行指出了spamd文件要接收的(名单的)文件名。
whitelist的定义, 如下所示, 和上面的格式差不多,但是没有信息参数, 因为不需要信息:
警告:
谨慎选择你的源数据。在发行的spamd.conf里建议的默认黑名单可能排除了很多的Internet IP段, 这里面包含了可能覆盖某些国家全部地址范围的I段P。道理很明白,如果你要允许来自任何国家的通讯在你的站点上交换合法邮件, 这些表格可能没有对你的情况进行优化处理。 还有其它的流行黑名单将某些整个 /16 范围作为垃圾信息发送源, 所以将一个黑名单加入你的设定前一定要仔细了解名单维护策略的细节信息。只有你自己可以决定使用哪个数据源的黑名单, 也可能你不想用默认的黑名单。
将你需要的spamd那些行和启动参数放进你的 /etc/rc.conf 或者 /etc/rc.conf.local 文件里。例如, 这行
在OpenBSD 4.0或更早的版本里的作用是启用spamd并运行在黑名单模式 。这里的 -v 标签表示启用详细的记录信息, 在对调试时监视spamd的运行情况很有用处。
说明
如果你想在OpenBSD 4.1或更新的版本里让spamd运行在没有灰名单(下一小节将解释)的纯黑名单模式, 将变量spamd_black设置为YES,然后重新启动spamd以关闭灰名单,这样可以启用只使用黑名单的模式。
当你完成编辑设置, 你可以带参数运行spamd,而完整的配置用spamd-setup。最后, 建立一个名为spamd-setup的cron任务以便在设置的周期内更新你的表格内容。
默认情况下, spamd会将运行信息写入到常规的系统日志文件里。 如果你想让spamd将信息写入另外一个单独的文件以免你的系统日志太杂乱, 你可以将类似下面这行加入到 syslog.conf 文件:
当你对自己配置的spamd运行的效果满意时,你也许想将spamd的日志文件加入到你的log rotations。
一旦spamd-setup已经运行而且表格也被内也有了新内容, 你可以使用pfctl或其它应用程序查看表格的内容。如果你想删除或修改表格内的选项, 我们建议您使用spamdb程序来代替pfctl table命令。(我们将在后面说明。)
说明
在第72页中 "让垃圾发送者无计可施" 的前面部分, 这里的重定向 (rdr) 规则也包含了放行(pass)规则。如果你的rdr规则并未包含pass部分, 你需要设置pass规则将通讯放行到重定向的目的地。你还需要设置规则让合法的email通过。如果你的网络上已经运行了一个email服务, 你可以继续使用以前老的SMTP放行(pass)规则。
存在纯黑名单模式总的来说是因为历史原因。提供一组可靠的和易维护的黑名单, 它可以有效地防止已知的发送垃圾信息的机器占用资源。不过, 真正能有效地防止垃圾信息还要靠灰名单, 这也是现在spamd工作的重要部分。
灰名单: 我的管理员告诉我别和陌生人说话
灰名单主要参考了当前的SMTP标准的解释以及一些可理解的较真似的手法,然后加上一点点善意的谎言让名单更合理。
垃圾信息发送者们目前趋向于利用他人的设备发送自己的信息, 而他们使用的软件并为经过合法用户的允许,为了运行时不至于被发现,这类软件相对来说很小。有强烈的迹象表明这些垃圾信息发送者并不认为发送个人信息是很重要的。 综合考虑两者,说明典型的垃圾和恶意信息发送软件设计里可能未考虑正确地解释SMTP状态代码。
我们可以利用这个缺陷确立自己的优势, 就像最初在2003年在Evan Harris的文章李描述的那样。详说明1
中心意思就是, 当一台肉鸡被用来发送垃圾信息时, 发送程序一般仅尝试发送一次消息, 发送程序并不检查任何结果或返回代码。 真正的SMTP程序运行时会解释SMTP的返回代码并采取相应的动作, 而且一个真正的邮件服务器在接收方因某些临时性问题导入信息发送失败时会继续尝试发送。这个最早的设计和以前的测试结果看起来效果不错, 在文档发布的几个月后一些灰名单开始被应用实施。
尽管提供Internet服务没有担保, 通常的承诺就是尽最大努力的服务, 设计者在基本的服务,如SMTP邮件发送容错方面做了的大量的工作。实际上, SMTP服务会尽最大的努力将信息传送给你以便获得良好的记录(译者:就好比邮递员要千方百计地将信件投递给你签收)。这也就是我们可以依赖灰名单并最终从真正的邮件服务器那里获得邮件的原因。
当前的Internet邮件发送标准定义在RFC 2821里。在那个文档的第4.5.4.1小节, “Sending Strategy,” 我们可以看到
[INDENT]在一个典型的系统内, 编写(译者:理解为编写并发送比较好。)信息的程序有几种方法请求马上关注新的外发邮件, 不能成功发送的邮件必须被马上排队并由发送者在固定周期内重新尝试
[/INDENT]和
[INDENT]在发送失败后,发送者重新尝试发送到这个目标地址的动作必须延迟。通常情况下, 重试间隔至少应该在30分钟以上; 不过, 更精密和灵活的策略将有利于判断出邮件不能送达的原因。
[/INDENT]RFC 2821在后面继续陈述
[INDENT]重试连接直至信息被送达或发送者放弃; 最终的放弃期限通常需要至少4–5天。
[/INDENT]
小结, 发送email是一个互动合作, 尽最大努力的过程, 而且RFC很清楚的说明了如果你要发送到的站点告诉你它当时无法接收任何信息, 你的责任 (必须完成) 就是稍后尝试, 也就是给接收服务器一个恢复的机会。
聪明的灰名单使用方法就是应用一个让自己觉得方便的善意欺骗。当我们宣称服务暂时无效时, 这个所谓的服务暂时无效实际上是告诉对方'我的管理员告诫我不要理会陌生人的搭讪' 。正常拥有有效信息的发送者将会稍后再次尝试, 但是垃圾信息发送者(译者:或程序)并无兴趣等待重新尝试, 因为这将增大他们发送信息的开销。
这就是灰名单仍然有效的精髓所在。 并且它在执行标准方面稍微有一些较真,详说明2 鲜有失手。
从2004年发布的OpenBSD 3.5版开始,spamd具备了应用灰名单的能力。从2007年5月1日发行的OpenBSD 4.1开始, spamd运行的默认模式就是灰名单模式。
除了简单之外,灰名单模式最令人惊奇的是目前它仍然有效。垃圾信息和恶意软件的作者对其适应得很慢。我们将稍后看一些例子。
将spamd设置为灰名单模式
当你设置好pf.conf文件需要的规则后, 将spamd配置为灰名单模式是很简单的。
例如将下面这些spamd相关内容及你选择的参数加入到/etc/rc.conf 或者 /etc/rc.conf.local 文件:
同样, 在OpenBSD 4.1和更新的版本中, 变量spamd_grey是多余的, 因为灰名单已经是默认模式了。详说明3
注意, 你可以微调几个灰名单相关参数,方法是在命令行运行spamd加入-G 选项。这个冒号分隔的清单由数值passtime, greyexp 和 whiteexp 构成。 这里的passtime表示spamd认为的合理的重试前等待的分钟数。默认是25分钟, 但是在这个配置里它已经被缩短为2分钟。greyexp和whiteexp两者均已小时计, 这里greyexp是指在一个项目经过多少小时后从灰名单数据库里删除, 而whiteexp是指一个项目经过多少小时后从白名单数据库里删除。默认的时间分别为4小时和864小时 ( 刚好过一个月)。
跟踪真正的邮件连接: spamlogd
运行在后台,在文档里很少提及的是一个spamd的重量级帮助程序: spamlogd,白名单更新程序。
顾名思义, spamlogd仅在后台默默地运行, 记录那些来来去于邮件服务器的连接,以便更新你的白名单。目的是确保你与对方主机之间的有效邮件通讯尽快抵达。
在OpenBSD 4.1及后来的版本中 (及等效的系统), 你可以创建几个pflog接口,并指定应该在哪个接口上记录(log)。如果你想从让spamdlog的信息与其它的PF日志内容分开以便阅读, 使用创建一个单独的pflog1接口, 或者建立一个仅包含一行up的hostname.pflog1文件。 如果你将规则改变为
而且为spamdlog的启动参数添加 -l pflog1, 你就可以将spamd的相关日志和其它的信息分开了。请参阅第8章以获取更详细的有关logging(日志)的信息。
布置了这些规则后, spamlogd将把你收到email的IP地址发送到你的白名单上(whitelist)。 这并不能完全保证回复会被立刻放行, 但在多数配置情况下,它的提速效果还是很明显的。
手动干预spamdb
现在我们看一下如何是查看和修正黑名单、白名单、或者灰名单的内容。 这些记录在 /var/db/spamdb 数据库, 管理员是主要从spamdb入手来管理这些名单的。
早期版本的spamdb仅提供简单的选项,将项目添加进白名单或更新里面的选项 (spamdb -a nn.mm.nn.mm) ,以及删除白名单中的选项 (spamdb -d nn.mm.nn.mm) ,目的是修正使用的黑名单或者灰名单的算法缺陷。
近来, spamdb进一步被发展,已经提供了一些吸引人的支持灰名单诱捕(greytrapping)特性。 我们会马上回来谈一下最新的灰名单诱捕(greytrapping)和其它特性, 但首先我们看一下spamd是如何工作的。
一些spamd日常使用中的亮点
在实际应用里spamd是什么样的呢? 在实行灰名单的站点上的用户和管理员渐渐感觉到他们已经摆脱了绝大多数的垃圾信息。 我们将根据log文件的结果看看灰名单实际的功效。
如果你为了获取更详尽的信息在命令行启动spamd时使用了 -v 参数, 则输出的日志内容就会包含了除了IP地址以外的更多的信息。带有更详尽信息的日志内容像这样:
第一行信息来自一个在黑名单spews1内的机器的初始连接。下面的6行显示了来自另一台机器的两次连接企图的完整记录, which each time connects as the second active connection(译者:此处不知所云,请悟出来的朋友不吝赐教了)。第二台机器没有包含在任何黑名单内, 所以它被列入灰名单。详说明4 在地址前面的 (GREY) 或者 (BLACK) 说明被列入了灰名单或黑名单的状态。后面更多是黑名单上主机的活动信息, 再往后一些我们看见在404秒后(或者说6分钟44秒), 被列入黑名单的主机放弃了没有完成的发送。 接下来的几行显示了一些很短的连接, 包括一台以上已经包含在黑名单里的机器。这次, 尽管, 这台机器非常快地断开连接以便在SMTP会话开始时查看所有(黑名单)标签, 但是我们在结尾处看到了名单的名字 (spews1)。(译者:所以这厮已经被列入黑名单了)
根据不同站点的数据,一般在400秒以后将这些脑残的垃圾发送者放进黑名单。 这也大致对应于它花费的时间—在1字节/秒的速度下—来完成邮件递送: ... 直到spamd拒绝回应这个发送者的询问。但是, 当你查看日志文件时, 你可能发现某个发送者还在做不停的尝试。从我们办公室的网关掌握的数据看, 有的机器会尝试很长的时间:
这台已经被列入了三个不同的黑名单了,它从2004年12月9日到12日之间共尝试发送了13次。最后一次尝试持续了32分钟44秒, 还是没有完成发送。不过, 多数的此类连接要比这个时间短很多。比较聪明的发送者会在最初几秒内丢弃这个连接, 就像你在log文件前面看到的那样。其它的会在400秒左右放弃, 仅有很少的一部分会持续几小时。详说明5
现在, 多数站点具备了某些类型的连接过滤以处理垃圾信息和通过email传送的恶意软件。 那些设置时在网关上加上spamd的站点,可以感觉到负责内容过滤的计算机的负荷明显地下降。
剔除垃圾信息: Greytrapping的基础
在2005年上半年,也就是OpenBSD 3.8的开发周期内, spamd的用户和开发人员收集了大量的有关垃圾信息的数据和行为特征,积累了大量的应对经验。
我们已经知道了垃圾信息的发送者极少完全按照标准的SMTP标准来发送他们的信息 —这也是为什么灰名单的方法可以奏效。 还有像我们前面提到的那样, 垃圾信息发送者不但发送大量的信息, 他们还很少检查他们提供给被劫持计算机的那些发送地址实际可否接收到这些信息。综合这些事实, 你可以判断一个灰名单上的机器尝试将信息发送到你域上一个无效的地址, 就此而言,很有可能这条信息就是垃圾信息或恶意程序代码。
进入Greytrapping
因此, spamd必须学习greytrapping。Greytrapping作为一个spamd的实施策略是很简单的,在我看来,很雅致。我们开始的重点就是一个运行在灰名单模式下的spamd。 另一个关键部分是我们的服务器要处理email的域的地址清单, 但只有那些我们确定不会收到任何合法email的地址。 你的清单里有多少个地址并不重要。至少要有一个地址, 而上限主要由你自己觉得需要添加多少地址来确定。
接下来, 使用spamdb给你的清单注入spamd的greytrapping特征, 然后休息一会儿观察一下。第一个尝试发送email到你的greytrap清单里一个地址的发送者被简单地加入greytrap清单, 就像所有以前没有和我们交换过邮件的发送者一样。
如果这台主机一会儿又重新尝试, 无论是尝试向同一个无效的email地址或者尝试向greytrapping清单里的其它地址发送邮件, 则greytrap将被触发。这个冒犯者将在24小时内被加入一个临时的命令为spamd-greytrap的黑名单。 在接下来的24小时内, 掉入名单陷阱的主机(greytrapped host)发来的任何通讯都将享受一次一个字节的口吃式回复。
24小时已经足够短了,不足以危害合法的通讯, 因为真正的SMTP实施方案至少会尝试在以后的几天内继续发送。
根据使用此技术的大型场合的运行经验显示,即便有,产生误报也相当少见。如果这些机器在24小时后还发送垃圾信息,它们将很快重新回到tar pit模式。
一个使用greytrapping最好的例子就是Bob Beck的基于过去traplist的垃圾发送者清单, 这份清单由位于Alberta大学的运行spamd的计算机自动生成, 这个清单很少会低于20000个IP地址。 这些主机的数量变化很大,曾经一度达到175,000台。 在我写这本书的时候 (2007年11月), 这个清单通常包含110,000个项目。尽管官方还在做测试, 他还是在2006年的6月30号被公开了。就我所知, 这份清单还没有出现过误报,你可以从 http://www.openbsd.org/spamd/traplist.gz 下载到,以便用于你的 spamd.conf 文件。详说明6
设置你自己的Traplist
要设置你自己的traplist, 使用spamdb的 -T 选项。在我这里, 我前面提到的这个陌生的地址自然包含在候选名单内:详说明7
这个地址完全是伪造的。我使用GNUS的email和news客户端, 而这看起来很像是那种message-ID程序生成的。而那个message-ID可能来自一个新闻池或者哪个不幸的受害者的邮箱。但这足以说明问题了, 这个垃圾发送者显然以为这个地址像两年前一样还在使用。 如你将要看见的, 这个地址已经被回收了。
log摘录显示这个垃圾发送者如何在首次联系时被加入灰名单,然后笨拙地尝试继续向我已经加到traplist的这个地址发送信息, 而仅在几分钟之内就被投入spamd-greytrap黑名单 。现在我们都知道在后面的20多个小时他会遭遇什么样的待遇。
旁注, 看起来及时发送者更换了一台不同机器发送信息, 而 From: 和 To: 的地址保持不变。事实上从它还是向一个从不能接收的地址发送就很明显地说明这个垃圾信息发送者不常检查其列表。在撰写本文的时候,它不接收电子邮件,并明确标明为未使用。
删除和处理被诱捕(trapped)的选项
你应该知道更多一些spamdb的选项。通过使用 -T 选项和 -d 选项的组合你可以删除traplist的emial地址选项, 而 -t 选项 (注意:是小写) 与 -a 或 -d 组合可以从数据库里删除诱捕到的IP地址。
输出你当前诱捕到的地址很简单,仅需要将spamdb, grep和一点想象力结合在一起。:D
保持几个spamd的灰名单同步
从OpenBSD 4.1开始, spamd可以在任何数量的合作网关上保持灰名单数据库同步。
具体方法是通过一组spamd的命令行选项: -Y 选项指定同步目标, 也就是, 你想更新灰名单信息的其它运行spamd的网关(们)的IP地址。在接收端, -y 选项指定了同步监听者, 也就是spamd实例准备接收更新信息的地址或接口。
我们的主要spamd网关, mainoffice-gw.example.com, 应该在启动时加上下面的选项以便分别建立同步目的和同步监听:
相反, 位于分支办公室的minorbranch-gw.example.com应该将主机名反过来,如下所示:
注意spamd也支持同步双方之间的shared-secret authentication。如果你创建了文件 /etc/mail/spamd.key ,然后将这个文件的拷贝分发给所有需要同步的伙伴, 这个文件的内容将用于计算认证所需的校验和。这个文件本身可以是任何类型的数据, 例如像spamd的用户手册里建议的那样从 /dev/arandom 获取的随机数据 。
删除乱序的MX应用
在OpenBSD 4.1时引入的另一个很好的特性是spamd有能力检测错误的MX应用。 一个众所周知的垃圾邮件发送者把戏是先联系一台secondary email exchanger而不是尝试联系main,而与此相反的行为我们希望是来自常规的email转发代理。
换句话说, 如果有人用错误的顺序尝试联系邮件交换机, 可以相当地肯定这厮是发发送垃圾邮件。拿我们的域example.com举例, 主力邮件服务器的IP地址为192.0.2.225,而备份机的地址为192.0.2.224, 在spamd启动时加上 -M 192.0.2.224 选项, 这将意味着任何在联系位于192.0.2.225的主机邮件服务器之前想要通过SMTP联系192.0.2.224的主机都将被加入本地的spamd-greytrap列表, 并在那里受“款待”24小时。
处理那些违反灰名单策略的站点
遗憾的是, 在有些情况下你需要根据其它站点的email设置特点作规则调整。我们已经知道了灰名单能发挥作用主要的是兼容标准的email设置需要在邮件无法抵达后的一定时间内进行重发。 不过, 就像Murphy将要很乐意地告诉你的那样, 真实世界远非如此简单。
首先, 从任何站点第一次发送来的邮件信息将在一个不确定的时间内因无法传递给你而延迟,因为该主机将成为灰名单成员, 这里说不确定的时间是因为这主要根据发送者设置的重试周期。
在某些环境下, 即便是最小的延迟也是不能忍受的。例如, 如果你有一些不常联系的客户,他们要求一旦联系你时,你必须即刻回应他们的质询, 这种情况下设置一个可能长达数小时的初始延迟恐怕就并非是最佳方案了。
此外, 你肯定会遇到配置错误的服务器,它们要么不会重试、要么重试的时间间隔太短, 这样它们可能会在几次尝试失败后放弃或者甚至可能它们只进行一次的重发尝试。
最后, 一些具有多个外发的SMTP服务器大站点和灰名单不兼容, 因为他们不能保证用上一次发送邮件的那个IP地址进行重发尝试。即使这些站点真诚地宣称他们会遵循重试要求, 但因为并未说明重试发送必须使用同一个IP地址。很明显这是灰名单的一个短板。
如果你想在设置里修正这些问题也很简单。一个很好的方法就是为本地的白名单定义一个表格(table),该表格的内容在重新启动后取自一个文件,如下所示:
要确保来自包含在这个表格内IP地址的SMTP通讯不被spamd“误伤”, 在你的重定向区域的最上面加上一条no rdr规则, 如下所示:
一旦你的规则集加上了这些变化, 在白名单(whitelist.txt文件)内输入你想保护(不重定向)的地址,然后用命令:
重新载入规则集。你现在就可以在 <localwhite> 表格内使用任何想要的保护手段, 包括通过编辑这个whitelist.txt 文件来替换表格的内容。
值得一提的是至少有些具有多台外发SMTP服务器站点也会公布有关允许自己的哪些主机通过SPF记录发送为其域发送邮件的相关信息,详说明8 SPF记录是这个域DNS信息的一部分。
要为我们的域example.com取回SPF记录, 你可以使用host命令的 -ttxt 选项, 像这样:
这个命令会产生一个回复,大致这样:
这里的引号内的文字是域example.com的SPF record。如果你想让来自example.com的邮件可以更快速地抵达, 而且你相信那的人不会发送或转发垃圾信息, 从SPF记录里提取这个地址范围, 然后将其放在你的白名单whitelist.txt文件里, 然后从更新的文件重新加载表格 <localwhite> 的内容。
经验之谈
总的来说, 选择性地使用黑名单再加上spamd是很强大、精确、有效的垃圾信息过滤工具。在运行spamd的机器负载很小。另一方面, spamd的缺陷也很明显, 也就是你需要监视你的log(日志),在需要的时候使用白名单。
让spamd运行在没有黑名单的纯灰名单模式也非常可行。事实上, 有些用户反映在某些情况下纯灰名单模式的运行效果好于黑名单模式, 它比内容过滤更有效果。
一个这样的汇报者就是Steve Williams,2006年10月20日他在OpenBSD-misc 邮件列表里提到过,详说明9 在运行一个纯的灰名单模式后,他所在公司的垃圾信息负载马上下降了约95%。
根据我个人的经验, 我推荐使用Bob Beck的traplist, 它是由大型的greytrapping产生, 作为唯一的导入黑名单。这份名单之所以好是因为Bob将系统设置为24小时后自动删除地址。也就是意味着将误报率减到了最低。
一旦你对自己的配置满意, 你可以尝试引入本地的灰名单。有可能会扑捉到一些不想要的东西, 但当然是好的,干净的乐趣。
在我写本章时将有限的一些经验全拿出来了, 详说明10 我甚至建议你将从邮件服务器日志、spamd日志、或者直接从你的灰名单里提取的垃圾邮件发送者的无效地址直接放进你的traplist里会更有效果。将你扑捉到的这些恶意地址公布在一个可见的网页上,这样可以确保这些地址被address-harvesting机器人一遍又一遍收录,这会最终让你获取更好的greytrapping资料, 因为这些地址可能永远被打上垃圾邮件发送者的烙印而被大家熟知。
还有一个需要特别留心的服务是email。Email是一个比较早的Internet服务而且大家很依赖它。以SMTP的形式和一台检索协议的主机, email是所有TCP/IP网络的基本服务之一。太基本了,以至于事实上很难想象没有它Internet会怎样 。
在本世纪的早些时候, 商业的Internet见证了兜售信息的增长日渐成为一个问题,甚至迫使SMTP email使用量减少。随即人们发明了各种各样的内容过滤方法, 而在BSD系统上一些开源的过滤软件运行的很好, 在2003年早期,OpenBSD团队开始着手研究自己的抵御垃圾信息方案, 被称为spamd。首个spamd的版本作为OpenBSD 3.3的组件于2003年5月1日发布。
说明
除了OpenBSD的spam-deferral进程, 基于反垃圾package的SpamAssassin (http://spamassassin.apache.org) 的内容过滤也提供了一个名为spamd的程序。这两个程序的设计目的都是阻止垃圾信息的, 但是对于底层问题它们采用完全不同的方法而且不能直接配合协调工作。但是, 在你的网络上当两个程序正确配置及运行后, 它们实施时并不会发生冲突。这两个程序在任何方面全没有联系, 而且两个程序安装在文件系统的不同位置; 如果需要, 可能将这两个反垃圾程序安装在同一个系统上。
新的程序通过一组具有特定目的表格和重定向规则hook进(嵌入)数据包过滤系统内。基本的设计思路很容易理解, 而且基于我们前面的PF规则集, 你要领悟下面pf.conf的内容应该并不困难:
代码: 全选
table <spamd> persist
table <spamd-white> persist
rdr pass on $ext_if inet proto tcp from <spamd> to \
{ $ext_if, $localnet } port smtp -> 127.0.0.1 port 8025
rdr pass on $ext_if inet proto tcp from !<spamd-white> to \
{ $ext_if, $localnet } port smtp -> 127.0.0.1 port 8025
记住, 你并非孤军奋战: 设置黑名单
原始的spamd设计出发点是实际情况里垃圾信息发送者发送大量的信息,而你作为第一个收到此类信息的概率微乎其微。此外, 垃圾信息主要来自对此类信息监管不严的网络以及大量的被劫持计算机。无论是特定的信息或是机器都会被快速地报告到黑名单里, 此类信息最终汇总到我们例子里的第一个表格里。
Classic模式下的spamd: 黑名单及粘性的Tar Pit
(译者:原文的the Sticky Tar Pit原来的意思应该是粘粘的沥青,读者可以想象一下,汽车开到这里的速度会骤降,在这里是指故意拖慢发送垃圾信息的SMTP通讯的做法。因为要发挥功效,此类通讯需要大流量,Tar Pit的方式可以极大地减缓垃圾信息自动发送或者暴力破解的速度。)
在classic模式下, spamd采用一种被称为tarpitting(译者:这里是TarPit的词性变化。)的方法。该守护进程将自己的banner提交给来自黑名单内IP地址的SMTP的连接,然后马上切换到另一种模式,在此模式下每次仅回复这些SMTP通讯一个字节, 这样做的目的是尽量多的消耗发送端的时间、同时对接收端几乎没有任何开销。
这个仅给发来的SMTP信息回复一个字节的特殊措施经常被喻为“口吃”。OpenBSD 4.0上包含的默认spamd模式就是基于黑名单的tarpitting加上“口吃”。
将spamd设置为传统的仅使用黑名单的模式还是很简单的。先将上面提到的重定向和表格定义放到你的pf.conf文件里, 然后看一下你的spamd.conf文件。
说明
请注意在FreeBSD里, spamd是一个port, 在mail/spamd/。如果你想在FreeBSD 5.x或更新的版本里运行PF,你就需要安装这个port, 并按照提示信息操作, 然后再回到这里。
一个基本的spamd.conf文件
一般软件发布时会提供很多的注释内容, 读者还可以去查看它的用户手册, 不过我们在这里还是介绍一下其基本要点。
说明
在OpenBSD 4.0或更早期的版本里 (还有就是, 在OpenBSD的4.1版本发布时对应的其它操作系统版本,可能在port里的), spamd.conf文件在 /etc 下。 从OpenBSD4.1开始,这个文件被放在了 /etc/mail 目录下。
在此文件的的开始处, 你会发现没有注释符的一行"all:\"。这行指定了实际使用的那些list, 例如
代码: 全选
all:\
:uatraps:whitelist:
下面是一个黑名单定义:
代码: 全选
uatraps:\
:black:\
:msg="SPAM. Your address %A has sent spam within the last 24 hours":\
:method=http:\
:file=www.openbsd.org/spamd/traplist.gz
whitelist的定义, 如下所示, 和上面的格式差不多,但是没有信息参数, 因为不需要信息:
代码: 全选
whitelist:\
:white:\
:method=file:\
:file=/var/mail/whitelist.txt
警告:
谨慎选择你的源数据。在发行的spamd.conf里建议的默认黑名单可能排除了很多的Internet IP段, 这里面包含了可能覆盖某些国家全部地址范围的I段P。道理很明白,如果你要允许来自任何国家的通讯在你的站点上交换合法邮件, 这些表格可能没有对你的情况进行优化处理。 还有其它的流行黑名单将某些整个 /16 范围作为垃圾信息发送源, 所以将一个黑名单加入你的设定前一定要仔细了解名单维护策略的细节信息。只有你自己可以决定使用哪个数据源的黑名单, 也可能你不想用默认的黑名单。
将你需要的spamd那些行和启动参数放进你的 /etc/rc.conf 或者 /etc/rc.conf.local 文件里。例如, 这行
代码: 全选
spamd_flags="-v" # for normal use: "" and see spamd-setup(8)
说明
如果你想在OpenBSD 4.1或更新的版本里让spamd运行在没有灰名单(下一小节将解释)的纯黑名单模式, 将变量spamd_black设置为YES,然后重新启动spamd以关闭灰名单,这样可以启用只使用黑名单的模式。
当你完成编辑设置, 你可以带参数运行spamd,而完整的配置用spamd-setup。最后, 建立一个名为spamd-setup的cron任务以便在设置的周期内更新你的表格内容。
默认情况下, spamd会将运行信息写入到常规的系统日志文件里。 如果你想让spamd将信息写入另外一个单独的文件以免你的系统日志太杂乱, 你可以将类似下面这行加入到 syslog.conf 文件:
代码: 全选
!!spamd
daemon.err;daemon.warn;daemon.info /var/log/spamd
一旦spamd-setup已经运行而且表格也被内也有了新内容, 你可以使用pfctl或其它应用程序查看表格的内容。如果你想删除或修改表格内的选项, 我们建议您使用spamdb程序来代替pfctl table命令。(我们将在后面说明。)
说明
在第72页中 "让垃圾发送者无计可施" 的前面部分, 这里的重定向 (rdr) 规则也包含了放行(pass)规则。如果你的rdr规则并未包含pass部分, 你需要设置pass规则将通讯放行到重定向的目的地。你还需要设置规则让合法的email通过。如果你的网络上已经运行了一个email服务, 你可以继续使用以前老的SMTP放行(pass)规则。
存在纯黑名单模式总的来说是因为历史原因。提供一组可靠的和易维护的黑名单, 它可以有效地防止已知的发送垃圾信息的机器占用资源。不过, 真正能有效地防止垃圾信息还要靠灰名单, 这也是现在spamd工作的重要部分。
灰名单: 我的管理员告诉我别和陌生人说话
灰名单主要参考了当前的SMTP标准的解释以及一些可理解的较真似的手法,然后加上一点点善意的谎言让名单更合理。
垃圾信息发送者们目前趋向于利用他人的设备发送自己的信息, 而他们使用的软件并为经过合法用户的允许,为了运行时不至于被发现,这类软件相对来说很小。有强烈的迹象表明这些垃圾信息发送者并不认为发送个人信息是很重要的。 综合考虑两者,说明典型的垃圾和恶意信息发送软件设计里可能未考虑正确地解释SMTP状态代码。
我们可以利用这个缺陷确立自己的优势, 就像最初在2003年在Evan Harris的文章李描述的那样。详说明1
中心意思就是, 当一台肉鸡被用来发送垃圾信息时, 发送程序一般仅尝试发送一次消息, 发送程序并不检查任何结果或返回代码。 真正的SMTP程序运行时会解释SMTP的返回代码并采取相应的动作, 而且一个真正的邮件服务器在接收方因某些临时性问题导入信息发送失败时会继续尝试发送。这个最早的设计和以前的测试结果看起来效果不错, 在文档发布的几个月后一些灰名单开始被应用实施。
尽管提供Internet服务没有担保, 通常的承诺就是尽最大努力的服务, 设计者在基本的服务,如SMTP邮件发送容错方面做了的大量的工作。实际上, SMTP服务会尽最大的努力将信息传送给你以便获得良好的记录(译者:就好比邮递员要千方百计地将信件投递给你签收)。这也就是我们可以依赖灰名单并最终从真正的邮件服务器那里获得邮件的原因。
当前的Internet邮件发送标准定义在RFC 2821里。在那个文档的第4.5.4.1小节, “Sending Strategy,” 我们可以看到
[INDENT]在一个典型的系统内, 编写(译者:理解为编写并发送比较好。)信息的程序有几种方法请求马上关注新的外发邮件, 不能成功发送的邮件必须被马上排队并由发送者在固定周期内重新尝试
[/INDENT]和
[INDENT]在发送失败后,发送者重新尝试发送到这个目标地址的动作必须延迟。通常情况下, 重试间隔至少应该在30分钟以上; 不过, 更精密和灵活的策略将有利于判断出邮件不能送达的原因。
[/INDENT]RFC 2821在后面继续陈述
[INDENT]重试连接直至信息被送达或发送者放弃; 最终的放弃期限通常需要至少4–5天。
[/INDENT]
小结, 发送email是一个互动合作, 尽最大努力的过程, 而且RFC很清楚的说明了如果你要发送到的站点告诉你它当时无法接收任何信息, 你的责任 (必须完成) 就是稍后尝试, 也就是给接收服务器一个恢复的机会。
聪明的灰名单使用方法就是应用一个让自己觉得方便的善意欺骗。当我们宣称服务暂时无效时, 这个所谓的服务暂时无效实际上是告诉对方'我的管理员告诫我不要理会陌生人的搭讪' 。正常拥有有效信息的发送者将会稍后再次尝试, 但是垃圾信息发送者(译者:或程序)并无兴趣等待重新尝试, 因为这将增大他们发送信息的开销。
这就是灰名单仍然有效的精髓所在。 并且它在执行标准方面稍微有一些较真,详说明2 鲜有失手。
从2004年发布的OpenBSD 3.5版开始,spamd具备了应用灰名单的能力。从2007年5月1日发行的OpenBSD 4.1开始, spamd运行的默认模式就是灰名单模式。
除了简单之外,灰名单模式最令人惊奇的是目前它仍然有效。垃圾信息和恶意软件的作者对其适应得很慢。我们将稍后看一些例子。
将spamd设置为灰名单模式
当你设置好pf.conf文件需要的规则后, 将spamd配置为灰名单模式是很简单的。
在FreeBSD上运行SPAMD需要FDESCFS
说明: 要在FreeBSD上使用spamd的灰名单模式, 你需要有一个file-descriptor的文件系统 (参man 5 fdescfs) 挂载到 /dev/fd/。你可以通过将下面这行加入到 /etc/fstab 完成:fdescfs代码可作为默认配置里的一个可导入内核模块, 但是如果你使用一个定制内核, 你可能需要检查此模块是否可用或者此代码是否被编译到系统内了。代码: 全选
fdescfs /dev/fd fdescfs rw 0 0
例如将下面这些spamd相关内容及你选择的参数加入到/etc/rc.conf 或者 /etc/rc.conf.local 文件:
代码: 全选
spamd_flags="-v -G 2:4:864" # for normal use: "" and see spamd-setup(8)
spamd_grey=YES # use spamd greylisting if YES
说明2
相关的RFC主要是RFC 1123和RFC 2821。如果你想加入我们灰名单学究的行列,你需要阅读这些文档, 这些文档仅涉及适当的RFC类型的背景知识。 记住, 临时拒绝事实上是一个SMTP的容错特性。
同样, 在OpenBSD 4.1和更新的版本中, 变量spamd_grey是多余的, 因为灰名单已经是默认模式了。详说明3
注意, 你可以微调几个灰名单相关参数,方法是在命令行运行spamd加入-G 选项。这个冒号分隔的清单由数值passtime, greyexp 和 whiteexp 构成。 这里的passtime表示spamd认为的合理的重试前等待的分钟数。默认是25分钟, 但是在这个配置里它已经被缩短为2分钟。greyexp和whiteexp两者均已小时计, 这里greyexp是指在一个项目经过多少小时后从灰名单数据库里删除, 而whiteexp是指一个项目经过多少小时后从白名单数据库里删除。默认的时间分别为4小时和864小时 ( 刚好过一个月)。
跟踪真正的邮件连接: spamlogd
运行在后台,在文档里很少提及的是一个spamd的重量级帮助程序: spamlogd,白名单更新程序。
顾名思义, spamlogd仅在后台默默地运行, 记录那些来来去于邮件服务器的连接,以便更新你的白名单。目的是确保你与对方主机之间的有效邮件通讯尽快抵达。
要正确地执行此任务, spamlogd需要你记录(log)来往于邮件服务器的SMTP连接的信息, 例如本章前面讨论的简单规则集:说明
重新启动spamd以启用灰名单。如果你原本没有对系统做特殊的修改,此时spamdlogd可能已经开始自动运行了。不过, 如果你初始的spamd配置没有包含灰名单, spamlogd可能还未启动, 而可能会遇到奇怪的症状,例如灰名单和白名单没有被正确地更新。一般情况下, 你无需手动启动spamlogd。在启用灰名单后,你也需要重新启动spamd以确保spamlogd被导入及可用。
代码: 全选
emailserver = "192.0.2.225"
pass log proto tcp from any to $emailserver port $email synproxy state
pass log proto tcp from $emailserver to any port smtp synproxy state
在OpenBSD 4.1及后来的版本中 (及等效的系统), 你可以创建几个pflog接口,并指定应该在哪个接口上记录(log)。如果你想从让spamdlog的信息与其它的PF日志内容分开以便阅读, 使用
代码: 全选
ifconfig pflog1
代码: 全选
pass log (to pflog1) proto tcp from any to $emailserver port $email
pass log (to pflog1) proto tcp from $emailserver to any port smtp
说明3
像我们在第73页的“一个基本的spamd.conf文件 ” 中说道的那样, 你可以使用 spamd_black variable来关闭灰名单。
而且为spamdlog的启动参数添加 -l pflog1, 你就可以将spamd的相关日志和其它的信息分开了。请参阅第8章以获取更详细的有关logging(日志)的信息。
布置了这些规则后, spamlogd将把你收到email的IP地址发送到你的白名单上(whitelist)。 这并不能完全保证回复会被立刻放行, 但在多数配置情况下,它的提速效果还是很明显的。
手动干预spamdb
现在我们看一下如何是查看和修正黑名单、白名单、或者灰名单的内容。 这些记录在 /var/db/spamdb 数据库, 管理员是主要从spamdb入手来管理这些名单的。
早期版本的spamdb仅提供简单的选项,将项目添加进白名单或更新里面的选项 (spamdb -a nn.mm.nn.mm) ,以及删除白名单中的选项 (spamdb -d nn.mm.nn.mm) ,目的是修正使用的黑名单或者灰名单的算法缺陷。
近来, spamdb进一步被发展,已经提供了一些吸引人的支持灰名单诱捕(greytrapping)特性。 我们会马上回来谈一下最新的灰名单诱捕(greytrapping)和其它特性, 但首先我们看一下spamd是如何工作的。
一些spamd日常使用中的亮点
在实际应用里spamd是什么样的呢? 在实行灰名单的站点上的用户和管理员渐渐感觉到他们已经摆脱了绝大多数的垃圾信息。 我们将根据log文件的结果看看灰名单实际的功效。
如果你为了获取更详尽的信息在命令行启动spamd时使用了 -v 参数, 则输出的日志内容就会包含了除了IP地址以外的更多的信息。带有更详尽信息的日志内容像这样:
代码: 全选
Oct 2 19:53:21 delilah spamd[26905]: 65.210.185.131: connected (1/1), lists: spews1
Oct 2 19:55:04 delilah spamd[26905]: 83.23.213.115: connected (2/1)
Oct 2 19:55:05 delilah spamd[26905]: (GREY) 83.23.213.115: <[email protected]> ->
[email protected]>
Oct 2 19:55:05 delilah spamd[26905]: 83.23.213.115: disconnected after 0 seconds.
Oct 2 19:55:05 delilah spamd[26905]: 83.23.213.115: connected (2/1)
Oct 2 19:55:06 delilah spamd[26905]: (GREY) 83.23.213.115: <[email protected]> ->
<[email protected]>
Oct 2 19:55:06 delilah spamd[26905]: 83.23.213.115: disconnected after 1 seconds.
Oct 2 19:57:07 delilah spamd[26905]: (BLACK) 65.210.185.131: <[email protected].
com> -> <[email protected]>
Oct 2 19:58:50 delilah spamd[26905]: 65.210.185.131: From: Auto lnsurance Savings
<[email protected]>
Oct 2 19:58:50 delilah spamd[26905]: 65.210.185.131: Subject: Start SAVlNG M0NEY on Auto
lnsurance
Oct 2 19:58:50 delilah spamd[26905]: 65.210.185.131: To: [email protected]
Oct 2 20:00:05 delilah spamd[26905]: 65.210.185.131: disconnected after 404 seconds. lists:
spews1
Turning the Tables for Proact ive Defense 79
Oct 2 20:03:48 delilah spamd[26905]: 222.240.6.118: connected (1/0)
Oct 2 20:03:48 delilah spamd[26905]: 222.240.6.118: disconnected after 0 seconds.
Oct 2 20:06:51 delilah spamd[26905]: 24.71.110.10: connected (1/1), lists: spews1
Oct 2 20:07:00 delilah spamd[26905]: 221.196.37.249: connected (2/1)
Oct 2 20:07:00 delilah spamd[26905]: 221.196.37.249: disconnected after 0 seconds.
Oct 2 20:07:12 delilah spamd[26905]: 24.71.110.10: disconnected after 21 seconds. lists: spews1
第一行信息来自一个在黑名单spews1内的机器的初始连接。下面的6行显示了来自另一台机器的两次连接企图的完整记录, which each time connects as the second active connection(译者:此处不知所云,请悟出来的朋友不吝赐教了)。第二台机器没有包含在任何黑名单内, 所以它被列入灰名单。详说明4 在地址前面的 (GREY) 或者 (BLACK) 说明被列入了灰名单或黑名单的状态。后面更多是黑名单上主机的活动信息, 再往后一些我们看见在404秒后(或者说6分钟44秒), 被列入黑名单的主机放弃了没有完成的发送。 接下来的几行显示了一些很短的连接, 包括一台以上已经包含在黑名单里的机器。这次, 尽管, 这台机器非常快地断开连接以便在SMTP会话开始时查看所有(黑名单)标签, 但是我们在结尾处看到了名单的名字 (spews1)。(译者:所以这厮已经被列入黑名单了)
根据不同站点的数据,一般在400秒以后将这些脑残的垃圾发送者放进黑名单。 这也大致对应于它花费的时间—在1字节/秒的速度下—来完成邮件递送: ... 直到spamd拒绝回应这个发送者的询问。但是, 当你查看日志文件时, 你可能发现某个发送者还在做不停的尝试。从我们办公室的网关掌握的数据看, 有的机器会尝试很长的时间:
代码: 全选
Dec 11 23:57:24 delilah spamd[32048]: 69.6.40.26: connected (1/1), lists: spamhaus spews1
spews2
Dec 12 00:30:08 delilah spamd[32048]: 69.6.40.26: disconnected after 1964 seconds. lists:
spamhaus spews1 spews2
现在, 多数站点具备了某些类型的连接过滤以处理垃圾信息和通过email传送的恶意软件。 那些设置时在网关上加上spamd的站点,可以感觉到负责内容过滤的计算机的负荷明显地下降。
说明4
上面的信息中有个令人好奇的投递地址 ([email protected]) ,位于灰名单的机器尝试将信息发到这里。这其实是一个小把戏,我们会在第81页的“设置你自己的Traplist” 中提到.
说明5
在最极端的情况下,我们曾经记录了一个长达 42,673 秒, 也就是将近12小时的尝试。请参考附录A中的其它相关出版物及数据。
剔除垃圾信息: Greytrapping的基础
在2005年上半年,也就是OpenBSD 3.8的开发周期内, spamd的用户和开发人员收集了大量的有关垃圾信息的数据和行为特征,积累了大量的应对经验。
我们已经知道了垃圾信息的发送者极少完全按照标准的SMTP标准来发送他们的信息 —这也是为什么灰名单的方法可以奏效。 还有像我们前面提到的那样, 垃圾信息发送者不但发送大量的信息, 他们还很少检查他们提供给被劫持计算机的那些发送地址实际可否接收到这些信息。综合这些事实, 你可以判断一个灰名单上的机器尝试将信息发送到你域上一个无效的地址, 就此而言,很有可能这条信息就是垃圾信息或恶意程序代码。
进入Greytrapping
因此, spamd必须学习greytrapping。Greytrapping作为一个spamd的实施策略是很简单的,在我看来,很雅致。我们开始的重点就是一个运行在灰名单模式下的spamd。 另一个关键部分是我们的服务器要处理email的域的地址清单, 但只有那些我们确定不会收到任何合法email的地址。 你的清单里有多少个地址并不重要。至少要有一个地址, 而上限主要由你自己觉得需要添加多少地址来确定。
接下来, 使用spamdb给你的清单注入spamd的greytrapping特征, 然后休息一会儿观察一下。第一个尝试发送email到你的greytrap清单里一个地址的发送者被简单地加入greytrap清单, 就像所有以前没有和我们交换过邮件的发送者一样。
如果这台主机一会儿又重新尝试, 无论是尝试向同一个无效的email地址或者尝试向greytrapping清单里的其它地址发送邮件, 则greytrap将被触发。这个冒犯者将在24小时内被加入一个临时的命令为spamd-greytrap的黑名单。 在接下来的24小时内, 掉入名单陷阱的主机(greytrapped host)发来的任何通讯都将享受一次一个字节的口吃式回复。
24小时已经足够短了,不足以危害合法的通讯, 因为真正的SMTP实施方案至少会尝试在以后的几天内继续发送。
根据使用此技术的大型场合的运行经验显示,即便有,产生误报也相当少见。如果这些机器在24小时后还发送垃圾信息,它们将很快重新回到tar pit模式。
一个使用greytrapping最好的例子就是Bob Beck的基于过去traplist的垃圾发送者清单, 这份清单由位于Alberta大学的运行spamd的计算机自动生成, 这个清单很少会低于20000个IP地址。 这些主机的数量变化很大,曾经一度达到175,000台。 在我写这本书的时候 (2007年11月), 这个清单通常包含110,000个项目。尽管官方还在做测试, 他还是在2006年的6月30号被公开了。就我所知, 这份清单还没有出现过误报,你可以从 http://www.openbsd.org/spamd/traplist.gz 下载到,以便用于你的 spamd.conf 文件。详说明6
设置你自己的Traplist
要设置你自己的traplist, 使用spamdb的 -T 选项。在我这里, 我前面提到的这个陌生的地址自然包含在候选名单内:详说明7
代码: 全选
$ sudo spamdb -T -a [email protected]
这个地址完全是伪造的。我使用GNUS的email和news客户端, 而这看起来很像是那种message-ID程序生成的。而那个message-ID可能来自一个新闻池或者哪个不幸的受害者的邮箱。但这足以说明问题了, 这个垃圾发送者显然以为这个地址像两年前一样还在使用。 如你将要看见的, 这个地址已经被回收了。
代码: 全选
Nov 6 09:50:25 delilah spamd[23576]: 210.214.12.57: connected (1/0)
Nov 6 09:50:32 delilah spamd[23576]: 210.214.12.57: connected (2/0)
Nov 6 09:50:40 delilah spamd[23576]: (GREY) 210.214.12.57: <[email protected]> ->
<[email protected]>
Nov 6 09:50:40 delilah spamd[23576]: 210.214.12.57: disconnected after 15 seconds.
Nov 6 09:50:42 delilah spamd[23576]: 210.214.12.57: connected (2/0)
Nov 6 09:50:45 delilah spamd[23576]: (GREY) 210.214.12.57: <[email protected].
com> -> <[email protected]>
Nov 6 09:50:45 delilah spamd[23576]: 210.214.12.57: disconnected after 13 seconds.
Nov 6 09:50:50 delilah spamd[23576]: 210.214.12.57: connected (2/0)
Nov 6 09:51:00 delilah spamd[23576]: (GREY) 210.214.12.57: <[email protected]> ->
<[email protected]>
Nov 6 09:51:00 delilah spamd[23576]: 210.214.12.57: disconnected after 18 seconds.
Nov 6 09:51:02 delilah spamd[23576]: 210.214.12.57: connected (2/0)
Nov 6 09:51:02 delilah spamd[23576]: 210.214.12.57: disconnected after 12 seconds.
Nov 6 09:51:02 delilah spamd[23576]: 210.214.12.57: connected (2/0)
Nov 6 09:51:18 delilah spamd[23576]: (GREY) 210.214.12.57: <[email protected]> ->
<[email protected]>
Nov 6 09:51:18 delilah spamd[23576]: 210.214.12.57: disconnected after 16 seconds.
Nov 6 09:51:18 delilah spamd[23576]: (GREY) 210.214.12.57: <[email protected].
com> -> <[email protected]>
Nov 6 09:51:18 delilah spamd[23576]: 210.214.12.57: disconnected after 16 seconds.
Nov 6 09:51:20 delilah spamd[23576]: 210.214.12.57: connected (1/1), lists: spamd-greytrap
Nov 6 09:51:23 delilah spamd[23576]: 210.214.12.57: connected (2/2), lists: spamd-greytrap
Nov 6 09:55:33 delilah spamd[23576]: (BLACK) 210.214.12.57: <[email protected]> ->
<[email protected]>
Nov 6 09:55:34 delilah spamd[23576]: (BLACK) 210.214.12.57: <bounce-
[email protected]> -> <[email protected]>
说明6
This list is part of recent sample spamd.conf files as the uatraps blacklist. In addition to this list, Bob recommends using heise.de’s nixspam list, also in the sample spamd.conf file, which is generated from various sources with a four-day automatic expiry. Detailed information about that list is available from Heise’s website at http://www.heise.de/ix/nixspam/dnsbl_en.
说明7
The actual command I entered back then was $ sudo spamdb -T -a "<[email protected]>".
In OpenBSD 4.1 and later, spamdb does not require the angle brackets or quotes, but it will accept
them if you put them in.
log摘录显示这个垃圾发送者如何在首次联系时被加入灰名单,然后笨拙地尝试继续向我已经加到traplist的这个地址发送信息, 而仅在几分钟之内就被投入spamd-greytrap黑名单 。现在我们都知道在后面的20多个小时他会遭遇什么样的待遇。
旁注, 看起来及时发送者更换了一台不同机器发送信息, 而 From: 和 To: 的地址保持不变。事实上从它还是向一个从不能接收的地址发送就很明显地说明这个垃圾信息发送者不常检查其列表。在撰写本文的时候,它不接收电子邮件,并明确标明为未使用。
删除和处理被诱捕(trapped)的选项
你应该知道更多一些spamdb的选项。通过使用 -T 选项和 -d 选项的组合你可以删除traplist的emial地址选项, 而 -t 选项 (注意:是小写) 与 -a 或 -d 组合可以从数据库里删除诱捕到的IP地址。
输出你当前诱捕到的地址很简单,仅需要将spamdb, grep和一点想象力结合在一起。:D
保持几个spamd的灰名单同步
从OpenBSD 4.1开始, spamd可以在任何数量的合作网关上保持灰名单数据库同步。
具体方法是通过一组spamd的命令行选项: -Y 选项指定同步目标, 也就是, 你想更新灰名单信息的其它运行spamd的网关(们)的IP地址。在接收端, -y 选项指定了同步监听者, 也就是spamd实例准备接收更新信息的地址或接口。
我们的主要spamd网关, mainoffice-gw.example.com, 应该在启动时加上下面的选项以便分别建立同步目的和同步监听:
代码: 全选
-Y minorbranch-gw.example.com -y mainoffice-gw.example.com
代码: 全选
-Y mainoffice-gw.example.com -y minorbranch-gw.example.com
删除乱序的MX应用
在OpenBSD 4.1时引入的另一个很好的特性是spamd有能力检测错误的MX应用。 一个众所周知的垃圾邮件发送者把戏是先联系一台secondary email exchanger而不是尝试联系main,而与此相反的行为我们希望是来自常规的email转发代理。
换句话说, 如果有人用错误的顺序尝试联系邮件交换机, 可以相当地肯定这厮是发发送垃圾邮件。拿我们的域example.com举例, 主力邮件服务器的IP地址为192.0.2.225,而备份机的地址为192.0.2.224, 在spamd启动时加上 -M 192.0.2.224 选项, 这将意味着任何在联系位于192.0.2.225的主机邮件服务器之前想要通过SMTP联系192.0.2.224的主机都将被加入本地的spamd-greytrap列表, 并在那里受“款待”24小时。
处理那些违反灰名单策略的站点
遗憾的是, 在有些情况下你需要根据其它站点的email设置特点作规则调整。我们已经知道了灰名单能发挥作用主要的是兼容标准的email设置需要在邮件无法抵达后的一定时间内进行重发。 不过, 就像Murphy将要很乐意地告诉你的那样, 真实世界远非如此简单。
首先, 从任何站点第一次发送来的邮件信息将在一个不确定的时间内因无法传递给你而延迟,因为该主机将成为灰名单成员, 这里说不确定的时间是因为这主要根据发送者设置的重试周期。
在某些环境下, 即便是最小的延迟也是不能忍受的。例如, 如果你有一些不常联系的客户,他们要求一旦联系你时,你必须即刻回应他们的质询, 这种情况下设置一个可能长达数小时的初始延迟恐怕就并非是最佳方案了。
此外, 你肯定会遇到配置错误的服务器,它们要么不会重试、要么重试的时间间隔太短, 这样它们可能会在几次尝试失败后放弃或者甚至可能它们只进行一次的重发尝试。
最后, 一些具有多个外发的SMTP服务器大站点和灰名单不兼容, 因为他们不能保证用上一次发送邮件的那个IP地址进行重发尝试。即使这些站点真诚地宣称他们会遵循重试要求, 但因为并未说明重试发送必须使用同一个IP地址。很明显这是灰名单的一个短板。
如果你想在设置里修正这些问题也很简单。一个很好的方法就是为本地的白名单定义一个表格(table),该表格的内容在重新启动后取自一个文件,如下所示:
代码: 全选
table <localwhite> file "/etc/mail/whitelist.txt"
要确保来自包含在这个表格内IP地址的SMTP通讯不被spamd“误伤”, 在你的重定向区域的最上面加上一条no rdr规则, 如下所示:
代码: 全选
no rdr proto tcp from <localwhite> to $mailservers port smtp
代码: 全选
pfctl -f /etc/pf.conf
值得一提的是至少有些具有多台外发SMTP服务器站点也会公布有关允许自己的哪些主机通过SPF记录发送为其域发送邮件的相关信息,详说明8 SPF记录是这个域DNS信息的一部分。
要为我们的域example.com取回SPF记录, 你可以使用host命令的 -ttxt 选项, 像这样:
代码: 全选
$ host -ttxt example.com
代码: 全选
example.com descriptive text "v=spf1 ip4:192.0.2.129/25 -all"
经验之谈
总的来说, 选择性地使用黑名单再加上spamd是很强大、精确、有效的垃圾信息过滤工具。在运行spamd的机器负载很小。另一方面, spamd的缺陷也很明显, 也就是你需要监视你的log(日志),在需要的时候使用白名单。
让spamd运行在没有黑名单的纯灰名单模式也非常可行。事实上, 有些用户反映在某些情况下纯灰名单模式的运行效果好于黑名单模式, 它比内容过滤更有效果。
说明8
SPF records are stored in DNS zones as special-purpose TXT records; see http://www.openspf.org
for details. Note that here we use SPF only as a possible source of information. A full discussion of the pros and cons of the SPF architecture and its intended purpose is outside the scope of this book.
一个这样的汇报者就是Steve Williams,2006年10月20日他在OpenBSD-misc 邮件列表里提到过,详说明9 在运行一个纯的灰名单模式后,他所在公司的垃圾信息负载马上下降了约95%。
根据我个人的经验, 我推荐使用Bob Beck的traplist, 它是由大型的greytrapping产生, 作为唯一的导入黑名单。这份名单之所以好是因为Bob将系统设置为24小时后自动删除地址。也就是意味着将误报率减到了最低。
一旦你对自己的配置满意, 你可以尝试引入本地的灰名单。有可能会扑捉到一些不想要的东西, 但当然是好的,干净的乐趣。
在我写本章时将有限的一些经验全拿出来了, 详说明10 我甚至建议你将从邮件服务器日志、spamd日志、或者直接从你的灰名单里提取的垃圾邮件发送者的无效地址直接放进你的traplist里会更有效果。将你扑捉到的这些恶意地址公布在一个可见的网页上,这样可以确保这些地址被address-harvesting机器人一遍又一遍收录,这会最终让你获取更好的greytrapping资料, 因为这些地址可能永远被打上垃圾邮件发送者的烙印而被大家熟知。
说明9
Accessible (among other places) at http://marc.info/?l=openbsd-misc&m=116136841831550&w=2.
说明10
Chronicled at http://bsdly.blogspot.com, entries starting with http://bsdly.blogspot.com/2007/07/hey-s ... r-you.html
.