q987654 发表于 2015-11-24 08:22:26

Postfix (3) 反垃圾邮件的措施(2)

  本系统接着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会显示出符合模式的字符串,以及对应该模式的动作。
  


  


  最后上传一个笔者测试环境的一个配置文件的内容如下 :
  







  
页: [1]
查看完整版本: Postfix (3) 反垃圾邮件的措施(2)