服务器 频道

Postfix反垃圾邮件技术

  二、数据后过滤

  有时候仅仅通过在邮件数据发送前的信息还不足以判断一封邮件是否是垃圾邮件。那么更进一步可以通过邮件数据中包含的信息来判断是否是垃圾邮件而决定如何处理。虽然在SMTP会话已经完成了数据接收后进行过滤并不能节省下被浪费的带宽和处理能力,但是这样减少了垃圾邮件占用的空间、用户判断删除垃圾邮件而浪费的精力,而且对于一些现在流行的通过邮件传递的蠕虫病毒也减少了用户误中并继续扩散的可能性。

  数据后过滤一般分为信头过滤和信体过滤两种。

  1、信头过滤

  简单地说,在SMTP会话中,DATA指令发送的数据以一个空行分隔开,前面的部分称为信头,后面的称为信体。通常在邮件中,包括三种类型的信头:

  邮件主信头

  MIME头(包括主信头中的和多部分分隔串之后的)

  邮件中附带的邮件的信头

  信头过滤可以通过以下配置来配置:

  head_checks = maptype:mapname

  它匹配所有的三种信头。

  mime_head_checks = maptype:mapname

  它仅仅匹配MIME头。

  nested_head_checks = maptype:mapname

  它仅仅匹配邮件中附带的邮件的信头。

  信头过滤模板有两种类型:ISO标准正则表达式regexp和Perl兼容正则表达式pcre,这两者在语法上有一定的差异,使用任何一种都可以。过滤模板中的过滤规则格式如下:

  /模式表达式/ 动作

  模式表达式是用regexp或pcre写的用来匹配邮件头的表达式。

  动作有如下几种(和访问数据库中所支持的动作不完全一致,比如不支持[45]NN、数字、DUNNO和规则等):

  REJECT [text]

  拒绝该邮件,可选的消息被发给发信人并记录到maillog中。

  OK

  对于这个信头行不再进行其他的匹配规则处理,继续处理下一行信头。

  IGNORE

  从信头中删除该信头行。常被用来删除一些特定的信头行,如Received。

  WARNING [text]

  将该信头行和可选的消息记录到maillog中。常用来测试过滤规则。

  HOLD [text]

  将该邮件放入hold队列中,并记录该信头行和可选的消息到maillog中。放入hold队列的邮件可以通过postcat命令来查看,或通过postsuper来删除或递交。

  DISCARD [text]

  成功接收邮件后并不递交,而是悄悄地将该邮件丢弃,并记录该信头行和可选的消息到maillog中。

  FILTER transport:nexthop

  将该邮件发到一个邮件过滤器中进行处理。

  另外注意,信头过滤在对Subject处理时,中文(8位编码)会被编码为MIME编码或UUENCODE编码,请做相应转换处理。

  2、信体过滤

  信体是除了主信头之外的邮件内容(包括MIME头,不过将多行的MIME头作为多个单行处理)。信体过滤通常不检查全部的信体,只检查body_checks_max_size所指定的大小(以字节为单位,默认是50K)。信体过滤是针对行来处理的,对于超长的行,只检查line_length_limi所指定的长度(默认2048字节)。

  信体过滤可以通过以下配置来配置:

  body_checks = maptype:mapname

  信体过滤模板同信头过滤模板一样。

  三、附录

  1、访问数据库

  访问数据库是Postfix用来判断拒绝或接受邮件的数据库。通过访问数据库可以拒绝或接收特定的主机名、域名、网络地址和邮件地址。

  通常访问数据库是一个由postmap命令从一个文本文件输入生成的db或dbm格式的HASH文件。也有NIS,LDAP,SQL和正则表达式方式的其它数据库,它们和HASH文件以相同的方式工作,但是不需要用postmap来生成。

  数据库的格式如下:

  模式表达式 动作

  当匹配了模式表达式时,就触发了相应的动作。

  数据库中的空行和以“#”开头的行被忽略掉。以空格开始的行是上一行的续行。

  A、邮件地址

  非正则表达式用来表示邮件地址时有如下格式:

  user@domain.tld

  匹配特定的邮件地址

  domain.tld

  匹配特定邮件的域。如果在parent_domain_matches_subdomains指定了smtpd_access_maps(默认),那么也会匹配该域的子域;否则就需要使用.doamin.tld格式(注意前面的点)来单独匹配子域。

  user@

  匹配所有本地部分(邮件用户名)是user的邮件地址

  <>

  匹配无邮件地址。这个值是通过smtpd_null_access_lookup_key来指定的。

  B、主机名和地址

  非正则表达式用来表示主机名和地址时有如下格式:

  domain.tld

  匹配特定邮件的域。如果在parent_domain_matches_subdomains指定了smtpd_access_maps(默认),那么也会匹配该域的子域;否则就需要使用.doamin.tld格式(注意前面的点)来单独匹配子域。

  net.work.addr.ess

  net.work.addr

  net.work

  net

  匹配网络地址。注意CIDR(无类网络地址,network/netmask格式)不被支持。

  C、动作

  访问数据库支持如下动作:

  [45]NN text

  拒绝该邮件并返回数字的拒绝状态码和消息。

  REJECT [text]

  拒绝该邮件并返回拒绝状态码和消息,如果没有指定消息就返回通用的消息。

  OK

  接受该邮件。

  数字

  同OK一样,接受该邮件。

  DUNNO

  跳过该规则,继续处理下面的规则。

  HOLD [text]

  将该邮件放入hold队列中,并记录可选的消息或通用的消息到maillog中。放入hold队列的邮件可以通过postcat命令来查看,或通过postsuper来删除或递交。

  DISCARD [text]

  成功接收邮件后并不递交,而是悄悄地将该邮件丢弃,并记录可选的消息或通用的消息到maillog中。

  FILTER transport:nexthop

  将该邮件发到一个邮件过滤器中进行处理。

  UCE规则

  应用UCE规则,如permit、reject_unauth_destination和smtpd_restriction_classes定义的规则类。

  2、SMTP认证(SASL认证)

  如上所述,漫游用户需要通过SMTP认证方式来使用发信服务。Postfix默认是不支持SASL协议,即不支持SMTP认证,需要通过额外指定SASL库的位置并打开SASL认证功能才能支持SMTP认证。以下以Postfix-2.0.13和Cyrus-Sasl-2.1.1为例简单说明如何使用SMTP认证。

  首先下载Postfix-2.0.13和Cyrus-Sasl-2.1.1,并安装cyrus-sasl-2.1.1。默认cyrus-sasl安装到了/usr/local下,它的库在/usr/local/lib下,它的头文件在/usr/local/include/sasl下。

  然后解开Postfix-2.0.13的源代码包,并使用如下命令编译:

  % make tidy

  % make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include/sasl"

  AUXLIBS="-L/usr/local/lib -lsasl2"

  如果需要你还可以加上其他的编译选项,如对MySQL的支持等。

  编译完成后安装,然后修改/etc/postfix/main.cf,添加如下配置:

  smtpd_sasl_auth_enable = yes

  来打开SASL认证功能,然后在smtpd_recipient_restrictions中添加permit_sasl_authenticated规则:

  smtpd_recipient_restrictions = permit_sasl_authenticated

  来允许通过了SASL认证的用户发信,你还可以在这里增加其它需要的规则。

  修改/usr/local/lib/sasl2/smtpd.conf(如没有请创建),设定你需要的认证方式,如auxprop、pwcheck、saslauthd等,这依赖于你的具体需求。

  在配置好Postfix后,重新启动Postfix。

  然后就可以通过支持SMTP认证的邮件客户端进行认证发信了。你也可以通过Telnet方式来测试你SMTP认证是否成功。

  有关SASL认证的更详细的细节,请参阅Postfix源代码包中的README_FILES目录中的SASL_README文件。
  

0
相关文章