|
本系统接着Postfix (3) 反垃圾邮件的措施(1)继续
Postfix共有6种限制条件,
1) 访问表
2) 客户端参数
3)严格语法检查
4)DNS检查
5)实时黑名单
6)通用限制条件
1. 访问表
任何涉及客户端资格检查的限制条件,都需要提供一个访问表, 由一系列的key-value组成。
check_client_access maptype:mapname Check_client_access指向一个含有 IP地址、网络地址、主机名称、从属网络名称的访问表。
Postfix先从DNS系统中反查出客户端的IP地址的完整主机名(PTR),并自己分析出主机名与网络,然后以这些信息与访问表中的每一个索引键对比,如果发现相同的,就采取对应的动作。 如果没有就是DUNNO
Check_helo_access maptype:mapname 用于对比客户端在HELO命令中显示的主机名
Check_recipient_access maptype:mapname check_recipient_access指向一个包含邮件地址,网络名、人名的访问表, 用于对比客户端在RCPT TO命令中提供的收件地址。 如果发现相同的键,就采用相同的动作。
check_sender_access maptype:mapname
check_sender_access指向一个包含邮件地址,网络名、人名的访问表, 用于对比客户端在MAIL FROM命令中提供的收件地址。 如果发现相同的键,就采用相同的动作。
2. 客户端参数
permit_auth_destination
如果收件地址位于Postfix的辖域内,则批准请求。 包括mydestination, inet_interfaces, virtual_alias_map或者 virtual_mailbox_maps 以及relay_domains
如果recipient不符合 permit_auth_destination它会返回DUNNO,而不是REJECT
permit_mynetwork
如果客户端的IP地址 位于mynetworks所列的任何地址范围内,则批准请求
reject_unauth_destination
如果收件人不在Postfix的辖域内,则拒绝请求。 默认值是554
3. 严格的语法条件
reject_invalid_hostname: 如果客户端在HELO命令提供的主机名不是有效的主机名,返回invalid_hostname_reject_code(501)
reject_non_fqdn_hostname:如果客户端在HELO命令提供的主机名不符合RFC的要求,返回non_fqdn_reject_code(504)
reject_non_fqdn_recipient:如果客户端在RCPT TO命令提供的收件地址的网络部分,不是RFC要求的, 返回non_fqdn_reject_code(504)
reject_non_fqdn_sender: 如果客户端在MAIL FROM命令提供的收件地址的网络部分,不是RFC要求的, 返回non_fqdn_reject_code(504)
reject_unauth_pipeline
4. DNS限制条件
reject_unknow_client:如果Postfix DNS通过反查不出PTR记录,则会拒绝服务 ,拒绝码unknown_client_reject_code 450
reject_unknow_hostname:如果HELO提供的主机名没有A记录,也没有MX记录,则拒绝服务, 拒绝码unknown_client_reject_code 450
reject_unknow_recipient_domain:如果 RCPT TO提供的收件人的网络,查不出有效的A或者是MX记录,则拒绝服务,拒绝码unknown_client_reject_code 450
reject_unknow_sender_domain:如果 MAIL FROM提供的收件人的网络,查不出有效的A或者是MX记录,则拒绝服务,拒绝码unknown_client_reject_code 450
5. 实时黑名单(RBL)
专为抵制垃圾邮件而设计的网络服务,让SMTP Server通过 DNS系统实时查询客户端是否为垃圾源。
reject_rbl_client rblprovider.domain
将客户端的Ip地址(例如1.2.3.4)颠倒顺序(4.3.2.1),搭配RBL的网络名,构成一个主机名称,然后以此主机名向DNS系统查询, 如果能查出一个A记录,表示该IP已被列入黑名单, 则Postfix会拒收邮件。
reject_rhsbl_client rblprovider.domain
如果客户端的主机名在rblprovider.domain内有一笔A记录,则拒绝服务
reject_rhsbl_sender rblprovider.domain
如果寄件人的邮件地址的网络部分在rblprovider.domain内有一笔A记录,则拒绝服务
6. 通用限制条件
Postfix还提供了下面的限制条件
permit:批准收下邮件,Postfix不再继续当前的过滤规则,但是会跳到下一组规则
reject:无条件拒收
defer:婉拒请求,客户端被告知稍后再试。
举个例子, 对HELO,我们有如下的检查
smtpd_helo_restrictions =
check_helo_access hash:/usr/local/etc/postfix/helo_access
reject_invalid_hostname
其中 helo_access的内容如下:
a.com reject
b.com OK
现在有下面的几个连接实例
1)HELO test
首先检查check_helo_access,在helo_access中找不以test的记录
于是再检查hostname 是否valid, 由于 test不是标准的完整的主机名,所以Postfix拒收。
2) HELO a.com
首先检查check_helo_access,在helo_access中找到了a.com的记录,REJECT, Postfix当场拒收。
3) HELO b.com
首先检查check_helo_access,在helo_access中找到了b.com的记录,OK
Postfix跳过helo_restrictions的检查, 如果有其他的检查,就转到其他的检查去(比如:sender_restrictions)
4) HELO c.com
首先检查check_helo_access,在helo_access中找不以c.com的记录
于是再检查hostname 是否valid, 由于 c.com是标准的完整的主机名,所以postfix继续下面的检查(如果还有的话,比如:sender_restrictions)
Postfix的最后一道防线就是内容检查
Postfix提供了4邮件内容检查的参数
header_checkes
mime_header_checks
nested_header_checks
body_checks
内容检查是全面的, 要么都检查,要么都不检查,没有办法让特定的寄件人或者是收件人绕过。
header_checks = regexp:/usr/local/etc/postfix/header_checks
模式表的索引键是正则表达式,所以必须放在一对分隔符“/"之间, 例如
/match pattern/ REJECT
内容检查的动作:
REJECT Message txt
拒收邮件,并将message传给客户端
WARN message txt
模拟拒收动作,还会真的拒收,只将message记录在日志文件中,
IGNORE
删除符合模式的标题字段或整行文字
HOLD message text
将整封邮件放在保留队列中
DISCARD message
要求Postfix假装接收邮件,其实偷偷丢掉
对于模式匹配,想要测试的话,可以使用postmap命令,
postmap -q -regexp:/usr/local/etc/postfix/header_checks <msg.txt这样的话,postmap会显示出符合模式的字符串,以及对应该模式的动作。
最后上传一个笔者测试环境的一个配置文件的内容如下 :
|
|
|