MTA的反垃圾邮件功能,实际上就是在MTA处理过程中对会话进行过滤。这个过滤不但过滤了发往自身的垃圾邮件,而且还防止了自身被恶意利用发送垃圾邮件。Postfix实现了目前所有主要的MTA过滤技术。关于邮件过滤技术可以参阅本站的相关文章
MTA过滤分为两类:邮件数据发送前过滤和邮件数据发送后过滤。
一、数据前过滤
数据前过滤是指在SMTP会话中,DATA指令发送前进行的过滤。在这个阶段,有四种不同子阶段的过滤:SMTP连接时过滤、HELO/EHLO指令过滤、MAIL FROM指令过滤和RCPT TO指令过滤。根据这四个子阶段接收到的信息的不同,它们也分别称作SMTP客户端限制、HELO/EHLO主机名限制、发送者地址限制和接收者地址限制。
过滤默认是在RCPT TO指令后生效的,这是因为一些Windows上的邮件客户端不处理在RCPT TO指令前的过滤动作。可以通过将smtpd_delay_reject设置为no来使过滤动作立刻生效。这个参数还影响了在不同的指令上可以使用的过滤规则参数。
1、过滤规则
这四个子阶段的过滤是分别通过四个配置语句来指定过滤规则的。它们都接收一系列的规则参数列表,参数间可以用空格或逗号分隔开。在默认状态下smtpd_delay_reject的值是yes,它们可以接受所有支持的规则,不过需在RCPT TO指令后才能全部生效;如果把smtpd_delay_reject设置为no,它们只可以接受五个公共的规则参数、之前子阶段的过滤规则参数和该子阶段的规则参数。
它们接受的公共的规则参数如下:
以下就四个子阶段分别讲述过滤规则
A、SMTP连接时过滤(SMTP客户端限制)
Postfix可以在接受客户端的SMTP连接请求时进行过滤检查。
通过Postfix的smtpd_client_restrictions指令可以指定这个阶段的过滤规则。这个阶段可用的过滤规则除公共规则外还有:
例子:
smtpd_client_restrictions = hash:/etc/postfix/access,
reject_rbl_client relays.ordb.org,
reject_rhsbl_client dsn.rfc-ignorant.org,
permit_mynetworks,
reject_unknown_client
其中relays.ordb.org和dsn.rfs-ignorant.org都是国外比较权威的免费RBL和RHSBL服务器。
B、HELO/EHLO指令过滤(HELO/EHLO主机名限制)
在接受了SMTP连接后,可以对HELO或EHLO指令所发送的信息进行过滤检查。
有些邮件客户端在通讯时并不发送HELO/EHLO指令,可以通过smtpd_helo_required设置为yes强制要求发送HELO/EHLO指令(默认Postfix不要求发送HELO/EHLO)。
通过Postfix的smtpd_helo_restrictions指令可以指定这个阶段的过滤规则。这个阶段可用的过滤规则除公共规则和smtpd_client_restrictions的规则外还有:
C、MAIL FROM指令过滤(发送者地址限制)
在接受了SMTP连接,客户端发送了HELO/EHLO指令后(该指令可选),应该通过MAIL FROM指令声明发送者的身份。可以对发送者身份进行过滤检查。
按照RFC规范,在MAIL FROM指令和下面的RCPT TO指令中应该使用RFC 821格式的邮件地址(例如:<user@domain.tld>),但是由于有许多的邮件客户端的不规范,往往不使用标准的RFC 821格式。Postfix默认接受任何可以理解的邮件地址,如:丢失了地址里的一对尖括号、可以包含RFC 822格式的注释等。如果希望打开对RFC 821格式的限制,可以将strict_rfc821_envelopes设置为yes。
通过Postfix的smtpd_sender_restrictions指令可以指定这个阶段的过滤规则。这个阶段可用的过滤规则除了公共规则和smtpd_client_restrictions的规则和smtpd_helo_restrictions的规则外还有:
D、RCPT TO指令过滤(接收者地址限制)
在MAIL FROM指令后要通过RCPT TO指令指定邮件接收者。可以对接收者身份进行过滤检查。
通过Postfix的smtpd_recipient_restrictions指令可以指定这个阶段的过滤规则。同以上的检查指令不同,为了避免开放转发,这个指令有默认值:permit_mynetworks,reject_unauth_destination。这个阶段可用的过滤规则除了公共规则和smtpd_client_restrictions的规则和smtpd_helo_restrictions的规则和smtpd_sender_restrictions的规则外还有:
空的$local_recipient_maps和$local_recipient_maps表示不对接收者地址进行过滤检查。
Postfix默认在接收者检查列表的最后做check_recipient_maps检查。
以上的所有过滤规则如下表归纳:
子 阶 段 |
规 则 名 |
check_*_access |
|
X | ||||
reject_unknown_* |
|
X |
| |||||
reject_non_fqdn_* |
|
X |
| |||||
reject_rbl_*/reject_rhsbl_* |
|
X |
| |||||
permit_* |
|
X |
| |||||
other |
X |
| ||||||
公 共 规 则 |
defer |
X |
|
|
|
|
| |
reject |
X |
|
|
|
|
| ||
warn_if_reject |
X |
|
|
|
|
| ||
reject_unauth_pipelining |
X |
|
|
|
|
| ||
permit |
|
X |
|
|
|
| ||
连 接 过 滤 |
permit_mynetworks |
|
X |
|
|
|
| |
reject_rbl_client |
|
|
X |
|
|
| ||
reject_rhsbl_client |
|
|
X |
|
|
| ||
reject_unknown_client |
|
|
|
|
X |
| ||
check_client_access |
|
|
|
|
|
X | ||
H E L O 过 滤 |
reject_invalid_hostname |
X |
|
|
|
|
| |
permit_naked_ip_address |
|
X |
|
|
|
| ||
reject_non_fqdn_hostname |
|
|
|
X |
|
| ||
reject_unknown_hostname |
|
|
|
|
X |
| ||
check_helo_access |
|
|
|
|
|
X | ||
发 送 者 过 滤 |
reject_sender_login_mismatch |
X |
|
|
|
|
| |
reject_rhsbl_sender |
|
|
X |
|
|
| ||
reject_non_fqdn_sender |
|
|
|
X |
|
| ||
reject_unknown_sender_domain |
|
|
|
|
X |
| ||
check_sender_access |
|
|
|
|
|
X | ||
接 收 者 过 滤 |
reject_unauth_destination |
X |
|
|
|
|
| |
check_recipient_maps |
X |
|
|
|
|
| ||
permit_auth_destination |
|
X |
|
|
|
| ||
permit_mx_backup |
|
X |
|
|
|
| ||
permit_sasl_authenticated |
|
X |
|
|
|
| ||
reject_rhsbl_recipient |
|
|
X |
|
|
| ||
reject_non_fqdn_recipient |
|
|
|
X |
|
| ||
reject_unknown_recipient_domain |
|
|
|
|
X |
| ||
check_recipient_access |
|
|
|
|
|
X |
一个smtpd_recipient_restrictions的例子:
smtpd_recipient_restrictions = reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
permit_mynetworks,
reject_unauth_destination,
check_client_access hash:/etc/postfix/client_checks,
check_client_access regexp:/etc/postfix/client_checks.re,
check_helo_access hash:/etc/postfix/helo,
check_sender_access hash:/etc/postfix/sender,
check_recipient_access regexp:/etc/postfix/recipient.re,
reject_rbl_client relays.ordb.org,
reject_rbl_client list.dsbl.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client blackholes.easynet.nl,
reject_rhsbl_client dsn.rfc-ignorant.org,
permit
这里要注意,有可能由于对reject_non_fqdn_*和reject_unknown_*的检查而导致一些主机名没有正常解析的机器不能正确发信。另外,在应用这个规则前,可以在规则列表头加上warn_if_reject来检查一下。
2、多阶段过滤和单阶段过滤
由于一些windows上有缺陷的邮件程序不处理在RCPT TO指令前的发回的拒绝状态码,所以Postfix默认不会在匹配了拒绝规则后就立刻断开连接,而是在RCPT TO指令处理完之后再断开的。可以通过smtpd_delay_reject设置为no来立刻发送拒绝状态码断开连接(默认是yes)。
视乎smtpd_delay_reject设置为yes或no的不同,Postfix的过滤有多阶段过滤和单阶段过滤两种形式。
A、多阶段过滤
当选项smtpd_delay_reject设置为yes时,过滤是分为多个阶段进行的。比如,即便在上一个子阶段该连接被判定为需要被拒绝,但是由于拒绝被延迟了,所以会接着进行本子阶段的过滤,如果在本子阶段又允许了该连接,那么上一个子阶段的拒绝结果就会覆盖。
从结果上看,这相当于无论上一个子阶段的过滤结果如何,都会进行所有定义了的过滤规则。所以我们称之为多阶段过滤。其逻辑模型如下:
STATUS = CLIENT:{rule1 || rule2 || ...} * HELO:{rule1 || rule2 || ...} * SENDER:{rule1 || rule2 || ...} * RECIEPIENT:{rule1 || rule2 || ...} * permit
这里的“||”表示如果一个规则有返回值(即进行了匹配,无论返回permit还是reject)那么就不进行该子阶段的其后的规则检查。
B、单阶段过滤
当选项smtpd_delay_reject设置为no时,相当于把这四个子阶段的过滤规则都依序排列连接成一个单一的过滤规则列表。比如,如果在某个阶段该连接被判定为需要被拒绝,那么会立刻拒绝,而根本不处理其后规则和其后子阶段的规则。
从结果上看,这相当于如果某个规则发生了匹配,那么其后的规则和子阶段都被短路了,就像只有一个子阶段的检查一样。所以我们称之为单阶段过滤。其逻辑模型如下:
STATUS = CLIENT:{rule1 || rule2 || ...} || HELO:{rule1 || rule2 || ...} || SENDER:{rule1 || rule2 || ...} || RECIEPIENT:{rule1 || rule2 || ...} || permit
这里的“||”表示如果一个规则或子阶段有返回值(即进行了匹配,无论返回permit还是reject)那么就不进行该子阶段的其后的规则和子阶段检查。
在单阶段过滤中,由于smtpd_recipient_restrictions可以接受所有的数据前过滤的规则,所以通常会把所有的过滤规则都放在这里。注意在单阶段过滤,所有排在前面的过滤规则被先处理,而且会形成短路。比如,如果你在smtpd_client_restrictions里就应用了RBL服务,但是RBL里面有一个地址是你希望接收来自那里的邮件的,那么根本没有机会来检查发送者地址就会被拒绝了。解决地方法就是在smtpd_sender_restrictions(或smtpd_recipient_restrictions)中先做一个check_sender_access,然后再做RBL检查。
二、数据后过滤
有时候仅仅通过在邮件数据发送前的信息还不足以判断一封邮件是否是垃圾邮件。那么更进一步可以通过邮件数据中包含的信息来判断是否是垃圾邮件而决定如何处理。虽然在SMTP会话已经完成了数据接收后进行过滤并不能节省下被浪费的带宽和处理能力,但是这样减少了垃圾邮件占用的空间、用户判断删除垃圾邮件而浪费的精力,而且对于一些现在流行的通过邮件传递的蠕虫病毒也减少了用户误中并继续扩散的可能性。
数据后过滤一般分为信头过滤和信体过滤两种。
1、信头过滤
简单地说,在SMTP会话中,DATA指令发送的数据以一个空行分隔开,前面的部分称为信头,后面的称为信体。通常在邮件中,包括三种类型的信头:
信头过滤可以通过以下配置来配置:
信头过滤模板有两种类型:ISO标准正则表达式regexp和Perl兼容正则表达式pcre,这两者在语法上有一定的差异,使用任何一种都可以。过滤模板中的过滤规则格式如下:
/模式表达式/ 动作
模式表达式是用regexp或pcre写的用来匹配邮件头的表达式。
动作有如下几种(和访问数据库中所支持的动作不完全一致,比如不支持[45]NN、数字、DUNNO和规则等):
另外注意,信头过滤在对Subject处理时,中文(8位编码)会被编码为MIME编码或UUENCODE编码,请做相应转换处理。
2、信体过滤
信体是除了主信头之外的邮件内容(包括MIME头,不过将多行的MIME头作为多个单行处理)。信体过滤通常不检查全部的信体,只检查body_checks_max_size所指定的大小(以字节为单位,默认是50K)。信体过滤是针对行来处理的,对于超长的行,只检查line_length_limi所指定的长度(默认2048字节)。
信体过滤可以通过以下配置来配置:
信体过滤模板同信头过滤模板一样。
三、附录
访问数据库是Postfix用来判断拒绝或接受邮件的数据库。通过访问数据库可以拒绝或接收特定的主机名、域名、网络地址和邮件地址。
通常访问数据库是一个由postmap命令从一个文本文件输入生成的db或dbm格式的HASH文件。也有NIS,LDAP,SQL和正则表达式方式的其它数据库,它们和HASH文件以相同的方式工作,但是不需要用postmap来生成。
数据库的格式如下:
模式表达式 动作
当匹配了模式表达式时,就触发了相应的动作。
数据库中的空行和以“#”开头的行被忽略掉。以空格开始的行是上一行的续行。
A、邮件地址
非正则表达式用来表示邮件地址时有如下格式:
B、主机名和地址
非正则表达式用来表示主机名和地址时有如下格式:
C、动作
访问数据库支持如下动作:
如上所述,漫游用户需要通过SMTP认证方式来使用发信服务。Postfix默认是不支持SASL协议,即不支持SMTP认证,需要通过额外指定SASL库的位置并打开SASL认证功能才能支持SMTP认证。以下以Postfix-2.0.13和Cyrus-Sasl-2.1.1为例简单说明如何使用SMTP认证。
然后就可以通过支持SMTP认证的邮件客户端进行认证发信了。你也可以通过Telnet方式来测试你SMTP认证是否成功。
有关SASL认证的更详细的细节,请参阅Postfix源代码包中的README_FILES目录中的SASL_README文件。
自由广告区 |
分类导航 |
邮件新闻资讯: IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮 电子邮箱 | 反垃圾邮件|邮件客户端|网络安全 行业数据 | 邮件人物 | 网站公告 | 行业法规 网络技术: 邮件原理 | 网络协议 | 网络管理 | 传输介质 线路接入 | 路由接口 | 邮件存储 | 华为3Com CISCO技术 | 网络与服务器硬件 操作系统: Windows 9X | Linux&Uinx | Windows NT Windows Vista | FreeBSD | 其它操作系统 邮件服务器: 程序与开发 | Exchange | Qmail | Postfix Sendmail | MDaemon | Domino | Foxmail KerioMail | JavaMail | Winwebmail |James Merak&VisNetic | CMailServer | WinMail 金笛邮件系统 | 其它 | 反垃圾邮件: 综述| 客户端反垃圾邮件|服务器端反垃圾邮件 邮件客户端软件: Outlook | Foxmail | DreamMail| KooMail The bat | 雷鸟 | Eudora |Becky! |Pegasus IncrediMail |其它 电子邮箱: 个人邮箱 | 企业邮箱 |Gmail 移动电子邮件:服务器 | 客户端 | 技术前沿 邮件网络安全: 软件漏洞 | 安全知识 | 病毒公告 |防火墙 攻防技术 | 病毒查杀| ISA | 数字签名 邮件营销: Email营销 | 网络营销 | 营销技巧 |营销案例 邮件人才:招聘 | 职场 | 培训 | 指南 | 职场 解决方案: 邮件系统|反垃圾邮件 |安全 |移动电邮 |招标 产品评测: 邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端 |