760 likes | 1.06k Views
ChinaUnix 技术沙龙. Postfix 反垃圾邮件技术. 中国反垃圾邮件联盟 http://anti-spam.org.cn/ wxy. 目录. 综述 Postifx 的信封过滤 Postfix 的信头与信体过滤 应用外部过滤软件. 综述. 垃圾邮件服务器端防御主要手段. 连接控制 内容过滤 速率控制. 邮件通讯的阶段. SMTP 阶段的主要反垃圾手段. 信息访问控制 HELO 信息 MAIL FROM 信息 RCPT TO 信息 信件内容过滤 规则匹配 语法分析. IP 访问限制 RBL 访问控制文件 格式检查
E N D
ChinaUnix技术沙龙 Postfix反垃圾邮件技术 中国反垃圾邮件联盟http://anti-spam.org.cn/ wxy www.chinaunix.net
目录 • 综述 • Postifx的信封过滤 • Postfix的信头与信体过滤 • 应用外部过滤软件 www.chinaunix.net
综述 www.chinaunix.net
垃圾邮件服务器端防御主要手段 • 连接控制 • 内容过滤 • 速率控制 www.chinaunix.net
邮件通讯的阶段 www.chinaunix.net
SMTP阶段的主要反垃圾手段 • 信息访问控制 • HELO信息 • MAIL FROM信息 • RCPT TO信息 • 信件内容过滤 • 规则匹配 • 语法分析 • IP访问限制 • RBL • 访问控制文件 • 格式检查 • FQDN名称检查 • RFC 821格式检查 • DNS查询 • 注册的域 • 反向查询 www.chinaunix.net
Postifx的信封过滤 www.chinaunix.net
信封过滤 • 信封过滤是指在SMTP会话中,DATA指令发送前进行的过滤。 • 信封过滤默认是在RCPT TO指令后生效的,这是因为一些Windows上的邮件客户端不处理在RCPT TO指令前的过滤动作。可以通过将smtpd_delay_reject设置为no来使过滤动作立刻生效。 • smtpd_delay_reject还影响了在不同的指令上可以使用的过滤规则参数。 • 在默认状态下,信封过滤的每个阶段可以接受所有支持的规则,不过需在RCPT TO指令后才能全部生效; • 如果把smtpd_delay_reject设置为no,它们只可以接受五个公共的规则参数、之前子阶段的过滤规则参数和该子阶段的规则参数。 www.chinaunix.net
信封中包含的信息 • 连接IP(client)在SMTP连接时候得到可由smtpd_client_restrictions限制 • 连接方(helo)在发送HELO/EHLO指令时候得到可由smtpd_helo_restrictions限制 • 发信人(sender)在发送MAIL FROM指令时候得到可由smtpd_sender_restrictions限制 • 收信人(recipient)在发送RCPT TO指令时候得到可由smtpd_recipient_restrictions限制 www.chinaunix.net
公共限制条件(1) • permit允许该连接进行。该规则通常置于规则列表的最后面使规则更清晰。 • defer通知客户端现在不能继续会话,稍后再进行SMTP连接请求。这常用于服务器需要进行一些DNS检查,但是(由于DNS查询超时)没有及时获得结果时,通知客户端稍后再进行连接。该规则通常置于规则列表的最后面使规则更清晰。 www.chinaunix.net
公共限制条件(2) • reject拒绝该连接请求。在这个阶段就断开了连接,有效的节约了垃圾邮件造成的带宽和处理能力的浪费。该规则通常置于规则列表的最后面使规则更清晰。拒绝动作默认不会在匹配了拒绝规则后就立刻断开连接。可以通过smtpd_delay_reject设置为no来立刻发送拒绝状态码断开连接。reject_code指定了拒绝的返回状态码(默认是554)。 www.chinaunix.net
公共限制条件(3) • warn_if_reject改变其后一个规则的拒绝动作为警告,即如果其后存在满足拒绝的条件,并不实际拒绝,而是发出一条警告信息(reject_warning)到日志文件中(通常是/var/log/maillog)。它常用于在实际运行的邮件服务器上测试邮件过滤规则。 • reject_unauth_pipelining拒绝在Postfix支持指令流水线前发送SMTP指令流水线的客户端连接。指令流水线是一些邮件客户端为了快速发送邮件所采用的技术。 www.chinaunix.net
访问数据库 • 访问数据库是Postfix用来判断拒绝或接受邮件的数据库。通过访问数据库可以拒绝或接收特定的主机名、域名、网络地址和邮件地址。 • 通常访问数据库是一个由postmap命令从一个文本文件输入生成的db或dbm格式的HASH文件。 • 数据库的格式如下:模式表达式动作当匹配了模式表达式时,就触发了相应的动作。数据库中的空行和以“#”开头的行被忽略掉。以空格开始的行是上一行的续行。 www.chinaunix.net
访问数据库中的邮件地址 • 非正则表达式,用来表示邮件地址时有如下格式: • user@domain.tld匹配特定的邮件地址 • domain.tld匹配特定邮件的域。 • user@匹配所有本地部分(邮件用户名)是user的邮件地址 • <>匹配无邮件地址。这个值(”<>”)是通过smtpd_null_access_lookup_key来指定的。 www.chinaunix.net
访问数据库中的主机名和地址 • 非正则表达式,用来表示主机名和地址时有如下格式: • domain.tld匹配特定邮件的域。如果在parent_domain_matches_subdomains指定了smtpd_access_maps(默认),那么也会匹配该域的子域;否则就需要使用.doamin.tld格式(注意前面的点)来单独匹配子域。 • net.work.addr.essnet.work.addrnet.worknet匹配网络地址。注意CIDR(无类网络地址,network/netmask格式)不被支持。 www.chinaunix.net
访问数据库中的动作 • 访问数据库支持如下动作: • [45]NN text拒绝该邮件并返回数字的拒绝状态码和消息。 • REJECT [text]拒绝该邮件并返回拒绝状态码和消息,如果没有指定消息就返回通用的消息。 • OK接受该邮件。 • 数字同OK一样,接受该邮件。 • DUNNO跳过该规则,继续处理下面的规则。 www.chinaunix.net
访问数据库中的动作 • HOLD [text]将该邮件放入hold队列中,并记录可选的消息或通用的消息到maillog中。放入hold队列的邮件可以通过postcat命令来查看,或通过postsuper来删除或递交。 • DISCARD [text]成功接收邮件后并不递交,而是悄悄地将该邮件丢弃,并记录可选的消息或通用的消息到maillog中。 • FILTER transport:nexthop将该邮件发到一个邮件过滤器中进行处理。 • UCE规则应用UCE规则,如permit、reject_unauth_destination等以及用smtpd_restriction_classes定义的规则类。 www.chinaunix.net
连接IP过滤 • Postfix可以在接受客户端的SMTP连接请求时进行过滤检查。默认允许任何客户端连接。 • 通过Postfix的smtpd_client_restrictions指令可以指定这个阶段的过滤规则。这个阶段可用的过滤规则除公共规则外还有: • reject_unknown_client • permit_mynetworks • reject_rbl_client domain.tldreject_rhsbl_client domain.tld • check_client_access maptype:mapname www.chinaunix.net
连接IP过滤规则(1) • reject_unknown_client • 拒绝客户的地址没有对应的DNS的PTR记录的连接。通常有些机器,尤其是个人拨号用户的机器没有对应的PTR记录,所以要注意漫游用户的使用(漫游用户是指不在$mynetworks中,比如在别的ISP拨号上网的用户。通常用SMTP认证来解决这个问题)。 • unknown_client_reject_code指定了拒绝的返回状态码(默认是450)。 www.chinaunix.net
连接IP过滤规则(2) • permit_mynetworks • 允许来自其IP地址属于$mynetworks所定义网络的客户端的连接。通常可用于ISP为自己的拨号用户提供SMTP服务时,通过$mynetworks参数指定自己的网络并允许自己的网络内的机器发送邮件。 • check_client_access maptype:mapname • 搜索名为mapname的maptype类型的访问数据库。可以根据客户端的主机名、父域、IP地址或部分IP地址来匹配。 www.chinaunix.net
连接IP过滤规则(3) • reject_rbl_client domain.tld和reject_rhsbl_client domain.tld • 拒绝来自属于RBL和RHSBL列表中的地址进行连接。通过检查一个IP地址(的逆转形式)或域名是否存在于domain.tld的RBL或RHSBL中,可以判断该客户端是否被列入了domain.tld的实时黑名单,从而决定是否接受连接。 • maps_rbl_reject_code指定了拒绝的返回状态码(默认是554)。 www.chinaunix.net
连接IP过滤范例 • smtpd_client_restrictions = check_client_access hash:/etc/postfix/access_client, reject_rbl_client cblplus.anti-spam.org.cn, reject_rbl_client relays.ordb.org, reject_rhsbl_client dsn.rfc-ignorant.org, permit_mynetworks, reject_unknown_client www.chinaunix.net
连接方过滤 • 在接受了SMTP连接后,可以对HELO或EHLO指令所发送的信息进行过滤检查。 • 有些邮件客户端在通讯时并不发送HELO/EHLO指令,可以通过smtpd_helo_required设置为yes强制要求发送HELO/EHLO指令(默认Postfix并不要求发送)。 • 通过Postfix的smtpd_helo_restrictions指令可以指定这个阶段的过滤规则。这个阶段可用的过滤规则除公共规则和smtpd_client_restrictions的规则外还有: • reject_invalid_hostname • reject_unknown_hostname • reject_non_fqdn_hostname • permit_naked_ip_address • check_client_access maptype:mapname www.chinaunix.net
连接方过滤规则(1) • reject_invalid_hostname • 拒绝无效格式的主机名的连接。 • invalid_hostname_reject_code指定了拒绝的返回状态码(默认是501)。 • reject_non_fqdn_hostname • 拒绝主机名不是FQDN格式的连接。 • non_fqdn_reject_code指定了拒绝的返回状态码(默认时504)。 www.chinaunix.net
连接方过滤规则(2) • reject_unknown_hostname • 拒绝未知的主机名的连接。所谓未知的主机名是指该主机没有DNS的A记录或MX记录。 • 很多拨号用户的机器并没有对应的A记录或MX记录,所以要拨号用户连接会被弹回;不过,如果在之前设置了允许通过SASL认证的用户发信,那么通过了SASL认证的用户不会受到影响。所以一般可以设置使用,并且减少垃圾邮件的效果显著。 • unknown_hostname_reject_code指定了拒绝的返回状态码(默认是450)。 www.chinaunix.net
连接方过滤规则(3) • permit_naked_ip_address • 允许直接使用IP地址的连接。通常在HELO/EHLO中使用主机名而不是IP地址。 • check_client_access maptype:mapname • 搜索名为mapname的maptype类型的访问数据库。可以根据HELO/EHLO发送的主机名、父域来匹配。 www.chinaunix.net
连接方过滤范例 • smtpd_help_restrictions =check_client_access hash:/etc/postfix/access_helo, reject_invalid_hostname, reject_non_fqdn_hostname, reject_unknown_hostname www.chinaunix.net
发送者过滤 • 在客户端发送了HELO/EHLO指令后,应通过MAIL FROM指令声明发送者的身份。 • 按照RFC规范,在MAIL FROM指令和下面的RCPT TO指令中应该使用RFC 821格式的邮件地址,但是有许多邮件客户端使用较新的RFC 822格式的邮件地址。如果希望打开对RFC 821格式的限制,可以将strict_rfc821_envelopes设置为yes。 • 通过Postfix的smtpd_sender_restrictions指令可以指定这个阶段的过滤规则。这个阶段可用的过滤规则除了公共规则和smtpd_client_restrictions的规则和smtpd_helo_restrictions的规则外还有: • reject_unknown_sender_domain • reject_rhsbl_sender domain.tld • check_sender_access maptype:mapname • reject_non_fqdn_sender • reject_sender_login_mismatch www.chinaunix.net
发送者过滤规则(1) • reject_unknown_sender_domain • 拒绝发送者邮件的域没有DNS的A记录或MX记录的连接。 • unknown_address_reject_code指定了拒绝的返回状态码(默认是450)。当进行DNS查询出现临时错误时(如查询超时)也总是返回450。 • reject_non_fqdn_sender • 拒绝发送者邮件的域不是FQDN格式的连接。 • non_fqdn_reject_code指定了拒绝的返回状态码(默认是504)。 www.chinaunix.net
发送者过滤规则(2) • reject_rhsbl_sender domain.tld • 拒绝发送者邮件的域属于RHSBL黑名单的连接。通过检查一个域名是否存在于domain.tld的RHSBL中,可以判断该客户端是否被列入了domain.tld的实时黑名单,从而决定是否接受连接。 • maps_rbl_reject_code指定了拒绝的返回状态码(默认是554)。 • check_sender_access maptype:mapname • 搜索名为mapname的maptype类型的访问数据库。可以根据发送者邮件的邮件地址、名字、域和父域来匹配。 www.chinaunix.net
发送者过滤规则(3) • reject_sender_login_mismatch • 拒绝发送者在smtpd_sender_owner_maps中所匹配的用户名和SASL登录名不一致的连接。 • smtpd_sender_owner_maps指定了一个MAIL FROM地址与SASL登录名的对应数据库。 www.chinaunix.net
发送者过滤范例 • smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access_sender,reject_unknown_sender_domain, reject_rhsbl_sender dsn.rfc-ignorant.org,reject_non_fqdn_sender, reject_sender_login_mismatch www.chinaunix.net
接收者过滤(1) • 在MAIL FROM指令后要通过RCPT TO指令指定邮件接收者。 • 默认情况下,Postfix接收以下转发: • 可信客户端(mynetworks)发往任何地址的邮件 • 不可信客户端发往relay_domains指定的任何域及子域。除了带有邮件路由的地址。 • 最后接收目的是如下的(它们不需要列在relay_domains中),参见check_recipient_maps: • inet_interfaces • mydestination • virtual_alias_domains • virtual_mailbox_domains www.chinaunix.net
接收者过滤(2) • 通过Postfix的smtpd_recipient_restrictions指令可以指定这个阶段的过滤规则。同以上的检查指令不同,为了避免开放转发,这个指令有默认值:permit_mynetworks,reject_unauth_destination。 • smtpd_recipient_restrictions中必须指定以下条件之一,否则Postfix会拒绝接收邮件: • reject • defer • defer_if_permit • reject_unauth_destination www.chinaunix.net
接收者过滤(3) • 这个阶段可用的过滤规则除了公共规则和smtpd_client_restrictions的规则和smtpd_helo_restrictions的规则和smtpd_sender_restrictions的规则外还有: • permit_auth_destination • reject_unauth_destination • permit_mx_backup • check_recipient_access maptype:mapname • check_recipient_maps • reject_unknown_recipient_domain • reject_rhsbl_recipient domain.tld • reject_non_fqdn_recipient • permit_sasl_authenticated www.chinaunix.net
接收者过滤规则(1) • permit_auth_destination • 允许发往默认转发和默认接收的连接。 • 可信客户端(mynetworks)发往任何地址的邮件 • 不可信客户端发往relay_domains指定的任何域及子域。除了带有邮件路由的地址。 • Postfix默认接收最终投递目标符合如下条件的邮件: • Inet_interfaces • mydestination • virtual_alias_domains • virtual_mailbox_domains • reject_unauth_destination • 拒绝不是发往默认转发和默认接收的连接。 • relay_domain_reject_code指定了拒绝的返回状态码(默认是554)。 www.chinaunix.net
接收者过滤规则(2) • reject_unknown_recipient_domain • 拒绝接收者邮件的域没有DNS的A记录或MX记录的连接。 • unknown_address_reject_code指定了拒绝的返回状态码(默认是450)。当进行DNS查询出现临时错误时(如查询超时)也总是返回450。 • reject_non_fqdn_recipient • 拒绝接收者邮件的域不是FQDN格式的连接。 • non_fqdn_reject_code指定了拒绝的返回状态码(默认时504)。 • reject_rhsbl_recipientdomain.tld • 拒绝接收者邮件的域属于RHSBL黑名单的连接。通过检查一个域名是否存在于domain.tld的RHSBL中,可以判断该客户端是否被列入了domain.tld的实时黑名单,从而决定是否接受连接。 • maps_rbl_reject_code指定了拒绝的返回状态码(默认是554)。 www.chinaunix.net
接收者过滤规则(3) • check_recipient_access maptype:mapname • 搜索名为mapname的maptype类型的数据库。可以根据接收者邮件的邮件地址、名字、域和父域来匹配。 • check_recipient_maps • Postfix强制在接收者限制条件的最后做check_recipient_maps检查。 • 拒绝接收者不匹配如下列表的连接: • local_recipient_maps (指定mydestination或inet_interfaces) • virtual_alias_maps (指定virtual_alias_domains) • virtual_mailbox_maps (指定virtual_mailbox_domains) • relay_recipient_maps (指定relay_domains) • 空的local_recipient_maps和relay_recipient_maps表示不对接收者地址进行过滤检查。 www.chinaunix.net
接收者过滤规则(4) • permit_mx_backup • 允许接收本地主机是邮件投递目标的MX地址的邮件。但是不能包含邮件路由。 • permit_sasl_authenticated • 允许通过了SASL认证的用户发送邮件。通过SASL协议实现的SMTP认证功能需要在编译Postfix时编译进SASL支持,并在main.cf中将smtpd_sasl_auth_enable设置为yes。 • 通过SASL认证可以对漫游用户提供发信支持,是关闭Open-Relay的重要手段。 www.chinaunix.net
接收者过滤范例(1) • 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/access_client, check_helo_access hash:/etc/postfix/access_helo, check_sender_access hash:/etc/postfix/access_sender, check_recipient_access hash:/etc/postfix/access_recipient, 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_rbl_client cblplus.anti-spam.org.cn, reject_rhsbl_client dsn.rfc-ignorant.org, permit www.chinaunix.net
接收者过滤范例(2) • smtpd_recipient_restrictions =permit_mynetworks,permit_sasl_authenticated, # client reject_rbl_client cblplus.anti-spam.org.cn, # helo reject_invalid_hostname,reject_non_fqdn_hostname, # sender reject_unknown_sender_domain,reject_non_fqdn_sender, # recipient reject_non_fqdn_recipient,reject_unknown_recipient_domain, reject_unauth_pipelining,reject_unauth_destination, permit www.chinaunix.net
多过滤条件 • 视乎smtpd_delay_reject设置为yes或no的不同,Postfix的过滤有多阶段过滤和单阶段过滤两种形式。 • 多阶段过滤当选项smtpd_delay_reject设置为yes时,过滤是分为多个阶段进行的。比如,即便在上一个子阶段该连接被判定为需要被拒绝,但是由于拒绝被延迟了,所以会接着进行本子阶段的过滤,如果在本子阶段又允许了该连接,那么上一个子阶段的拒绝结果就会覆盖。从结果上看,这相当于无论上一个子阶段的过滤结果如何,都会进行所有定义了的过滤规则。所以我们称之为多阶段过滤。 • 单阶段过滤当选项smtpd_delay_reject设置为no时,相当于把这四个子阶段的过滤规则都依序排列连接成一个单一的过滤规则列表。比如,如果在某个阶段该连接被判定为需要被拒绝,那么会立刻拒绝,而根本不处理其后规则和其后子阶段的规则。 从结果上看,这相当于如果某个规则发生了匹配,那么其后的规则和子阶段都被短路了,就像只有一个子阶段的检查一样。所以我们称之为单阶段过滤。 www.chinaunix.net
Postfix的信头与信体过滤 www.chinaunix.net
信件内容过滤 • 有时候仅仅通过在邮件数据发送前的信息还不足以判断一封邮件是否是垃圾邮件。那么更进一步可以通过邮件数据中包含的信息来判断是否是垃圾邮件而决定如何处理。 • 虽然在SMTP会话已经完成了数据接收后进行过滤并不能节省下被浪费的带宽和处理能力,但是这样减少了垃圾邮件占用的空间、用户判断删除垃圾邮件而浪费的精力,而且对于一些现在流行的通过邮件传递的蠕虫病毒也减少了用户误中并继续扩散的可能性。 • 信件内容过滤一般分为信头过滤和信体过滤两种。 www.chinaunix.net
信头与信体 • 简单地说,在SMTP会话中,DATA指令发送的数据以一个空行分隔开,前面的部分称为信头,后面的称为信体。 • 通常在邮件中,包括三种类型的信头: • 邮件主信头 • MIME头(包括主信头中的和多部分分隔串之后的) • 邮件中附带的邮件的信头 • 信体是除了主信头之外的邮件内容(包括MIME头,不过将多行的MIME头作为多个单行处理)。 www.chinaunix.net
信头过滤 • 信头过滤可以通过以下配置来配置: • head_checks = maptype:mapname它匹配所有的三种信头。 • mime_head_checks = maptype:mapname它仅仅匹配MIME头。 • nested_head_checks = maptype:mapname 它仅仅匹配邮件中附带的邮件的信头。 www.chinaunix.net
信体过滤 • 信体过滤通常不检查全部的信体,只检查body_checks_max_size所指定的大小(以字节为单位,默认是50K)。 • 信体过滤是针对行来处理的,对于超长的行,只检查line_length_limit所指定的长度(默认2048字节)。 • 信体过滤可以通过以下配置来配置: • body_checks = maptype:mapname www.chinaunix.net
过滤模板 • 信头过滤模板有两种类型,这两者在语法上有一定的差异,使用任何一种都可以: • POSIX正则表达式regexp • Perl兼容正则表达式pcre • 过滤模板中的过滤规则格式如下: • /模式表达式/ 动作模式表达式是用regexp或pcre写的用来匹配邮件头的表达式。 www.chinaunix.net
过滤模板动作(1) • 过滤动作有如下几种(和访问数据库中所支持的动作不完全一致,比如不支持[45]NN、数字、DUNNO和规则等): • REJECT [text]拒绝该邮件,可选的消息被发给发信人并记录到maillog中。 • OK对于这个信头行不再进行其他的匹配规则处理,继续处理下一行信头。 • IGNORE从信头中删除该信头行。常被用来删除一些特定的信头行,如Received。 www.chinaunix.net
过滤模板动作(2) • WARNING [text]将该信头行和可选的消息记录到maillog中。常用来测试过滤规则。 • HOLD [text]将该邮件放入hold队列中,并记录该信头行和可选的消息到maillog中。放入hold队列的邮件可以通过postcat命令来查看,或通过postsuper来删除或递交。 • DISCARD [text]成功接收邮件后并不递交,而是悄悄地将该邮件丢弃,并记录该信头行和可选的消息到maillog中。 • FILTER transport:nexthop将该邮件发到一个邮件过滤器中进行处理。 www.chinaunix.net