postfix下clamd+amavisd+spam反垃圾工作

你postfix及clamd,amavisd,spamassassin都正常运转,且你有对它们一定认识的基础上的 。对于安装调试请查阅其它帖子。谢谢。 
Postfix反垃圾功能可以说在mta里是最好的了吧。在做反垃圾行动之前 ,需要搞清楚maillog和postfix 里的main。cf文件配置和基本命令,以及postfix的模块,行为流程。我是翻阅了很多资料,然后吸取他们的东西,每当有选取别人的内容时候,我都会注释出来的 ,我不会写自己的认识的,因为你写了也没有别人的专业,我只是写我的操作和理解,自己做过的要记录下来,不然过一段时间可能就会记忆模糊了   (以下部分载自蓝色月光技术贴),
        命令:postfix 本身也可以当成指令来执行,例如:
postfix check    检查设定文件是否正确,相关数据夹是否建立,档案拥有人和存取权限是否正确
postfix start        启动服务
postfix stop        停止服务
postfix abort        立刻中断服务
postfix reload       重新加载设定档
postfix flush        将队列中的邮件全部寄出去

postfix 工作流程
sendmail 与 postfix 最大的不同在于程序结构上,sendmail 以一支大程序来执行所有的工作,而 postfix 则改采模块化设计,这种设计的好处在于:程序代码容易维护、模块功能有弹性容易扩充。底下将针对组成 postfix 的每个模块,它们各是负责哪些工作,又如何与其它模块配合,作一个解说。
底下先说明收信流程:

图例说明:椭圆代表模块程序,黄色框代表邮件队列或数据夹,蓝色框代表设定档。大框线内的模块是由 master 模块来控制行程。
•        当邮件由本机寄出时,系统执行 sendmail 程序,由于之前执行过 redhat-switch-mail 的关系,此时 sendmail 已经连结到 postfix 套件中的 postdrop 模块,postdrop 模块负责将邮件存放在 maildrop 数据夹中,等候 pickup 处理, pickup 模块会对邮件内容进行检查以保护 postfix 系统不会受到异常邮件的攻击(譬如利用字段溢位来破解主机)。
  
•        如果邮件是来自网络,postfix 套件中的 smtpd 将 会接收邮件并进行邮件过滤,为了应付千变万化的伪装邮件, 我们可以透过修改 UCE 设定档(例如:来自 sendmail 的 access 设定档),设定黑名单(或透过 RBL 黑名单数据库取得黑名单)、 DNS 反查验证,甚至是使用正规表达式来作字符串匹配检查等方法,进行严格的过滤。
  
•        邮件有时候是来自 postfix 本身的 bounce 模块,例如:当邮件无法递送时,bounce 模块会自动产生讯息以便通知寄信人。 
  
•        邮件有时候也会由 LDA 产生,在上图中用一道单独存在的箭头来表示(可以想象一下:该箭头是连结到送信流程中的 local 模块)。这种情形包括:根据 alias 别名数据库改写过收信人的邮件,或是根据每个使用者的 .forward 档案指定的转信信箱修改过收信人字段的邮件。 
  
•        除 了上述因无法递送邮件引发的问题会由 bounce or defer 模块产生通知邮件外,其它的错误产生时 postfix 也会自行产生通知邮件,例如:SMTP 通讯协议逾时,UCE 过滤规则冲突......等等,当然这种情形下只会通知 postmaster,在上图中一样用那一道单独存在的箭头来表示。
  
•        以上五种情况产生的新邮件,最后都会由 cleanup 模块进行最后的处理。首先它会补足邮件中所缺少的字段(例如来自 console 的信件将会缺省 From: 字段),并根据完整邮件地址格式改写寄信人字段(例如:shane@localhost 改成[email protected]),接着读取 canonical(全名对应) 和 virtual(虚拟对应) 设定档,根据该设定改写收信人字段,所有动作处理完毕后,邮件被放置在 incoming 数据夹中,接着就会通知 qmgr 模块有新邮件到了,由 qmgr 模块开始进行送信作业 。
  
•        当 cleanup 模块进行邮件字段改写时,实际上是呼叫 rewrite 模块来处理,和 sendmail 不同的是,postfix 并未发展出一套复杂的宏语言来进行 rewrite 作业,相反的是采用单纯的查表法来解决, 这也是 postfix 被批评功能不如 sendmail 强大的原因。postfix 开发者似乎认为 sendmail 之所以漏洞百出,与 rewrite 宏语言大而无当有直接相关(纯属猜测)。 
底下说明寄信流程:
•        qmgr 模块是整个邮件服务器的核心,它将视情形呼叫 local、smtp、pipe 等 agent 模块来进行寄信作业。local 模块就是 LDA ,它负责将信件分到使用者信箱。smtp agent 顾名思义是指 smtp client 程序,而非 smtpd ,它负责将信件透过 SMTP protocol 递送到网络上的远程邮件服务器。pipe 则用来处理传真或其它封闭式网络系统的特殊电子邮件通讯协议。 
当邮件出现递送失败的情形,qmgr 就会将邮件放在 deferred 队列中,并呼叫 bounce 模块处理,以避免延迟其它邮件的递送作业 。
正 在处理中的邮件会被放在 active 队列中,该队列仅存放少量邮件,因为若邮件过多的话将会耗用海量存储器,来自 incoming 资料夹的邮件,会根据邮件到达的顺序依序进入 active 队列, 而 deferred 队列的邮件,将会暂停四个小时后,重新排入 active 队列。
此外,qmgr 也会根据 relocated 设定档来产生通知邮件,relocated 设定档用来设定账号或网域迁移的通知讯息,当 qmgr 发现某封邮件的收信人已经迁移,则会呼叫 bounce 模块处理 。
  
•        在 递送邮件的过程中,qmgr 会呼叫 rewrite 模块解析收信人地址,通常 rewrite 模块只会区分该信件是要到达本机,还是需要 relay,当然我们也可以透过 transport 设定文件,来要求 rewrite 模块针对特定收信人地址递送给特定主机(通常用来设定将 mail gateway 收到的邮件转给下属邮件服务器)。
  
•        当信件无法递送时(收信人或收信主机不存在或无响 应), qmgr 呼叫 bounce 模块处理。bounce 模块会将障碍情形以邮件型式递交给 cleanup 模块进行收信作业,同时将原始邮件排入 deferred 队列,等待延迟递送。如果无法递送的原因是通讯协议或设定文件错误造成的(这种情形应通知管理员,而非寄信人),则信件将直接由 qmgr 处理,并不会去呼叫 bounce 模块。
  
•        LDA 模块主要工作是将信件写入使用者的信箱中,或是根据 alias 设定或 .forward 设定改写收信人字段,并递交给 cleanup 模块进行收信作业,除了 postfix 预设的 local 模块外,其它在 sendmail 中经常使用的外挂 LDA,例如:procmail,也可以继续使用,这是因为 postfix 的 local 模块是与 sendmail 完全兼容的。 
其它幕后常驻模块:
•        master:这个模块用来监督 postfix 所有模块,是否有依照 master.cf 中的设定执行,并会将超过上限的行程砍掉,以符合效能调校相关设定值。
  
•        flush:这个模块用来维护 incoming 邮件队列的杂凑表,它将邮件依收信目的地分类,建立多个杂凑表,当客户端送出 ETRN spps.tp.edu.tw 要求时,则可以将要给 spps.tp.edu.tw 的邮件(有些可能还在排队)优先全部寄出。
  
•        showq:当执行 mailq 指令查询邮件队列时,就是由此模块提供信息。
  
•        proxymap:用来读取设定档,并提供设定文件内容给其它模块,之所以这样做是为了减少硬盘 I/O 存取。
  
•        spawn:用来呼叫执行外挂程序,透过这个机制我们可以执行非 postfix 提供的过滤程序,例如:病毒过滤。
  
•        pipe:这个模块用来将邮件队列中的邮件数据结构,传输给外部程序处理。当 master 模块启动外挂程序时,透过 pipe 当白手套就可以和外挂程序凭借参数传递来沟通。

常用工具:
•        postalias: 当我们执行 newalias 时,由于 redhat-switch-mail 的作用,其实是在执行 postalias,所以你也可以不用因此改变使用习惯喔!如果要透过这个指令建立 alias 杂凑表,指令格式比 newalias 稍微复杂一点:postalias hash:/etc/postfix/aliases,这道命令也可以用 postmap 代替,例如:postmap hash:/etc/postfix/aliases,其余功能请参阅 postmap 的介绍。 
•        postcat: 这是一个邮件 RFC 格式的剖析器,可以将原始邮件显示成容易阅读的格式,有点像用 outlook express 看到的邮件内容(假如在邮件上按右键查看原始内容,你可能就看不懂了),请指定要查看的档名:postcat /var/spool/postfix/deferred/filename,由于档名都是使用邮件编号,如果不知道要看的邮件是什么档名时,可以用下面 的指令查询! 
•        postqueue:用来取代 mailq 指令,使用 -p 参数就可以将邮件依编号顺序列出邮件标头(寄信人、收信人和信件主旨),方便检索查询!-s 参数则是列出前面介绍过的 flush 杂凑表! 
•        postsuper: 这个命令用来操作队列中的邮件,只有 root 身分才能执行。参数 -d 用来删除邮件,-r 用来将邮件排到不同队列里(maildrop、incoming、active或deferred),-p 当服务器(或 postfix 程序)当掉重开机后,用来救回工作到一半的邮件。 
•        postconf:这是个功能强大的工具,除了可以用来显示 main.cf 的详细设定内容外(自动分类),也可以用来除错,甚至还提供修改设定的接口,例如:postconf -e mynetworks=168.100.189.0/25,这个功能如果结合 script 程序来运作,就能做到透过网页远程管理设定挡。我们经常使用 -n 参数,来查看 postfix 设定文件摆放的位置! 
•        postmap: 用来取代 makemap 指令,并且与 makemap 完全兼容,支持的档案类型包括:btree、dbm、hash。当用来建立数据库档案时,语法如后:postmap hash:/etc/postfix/access,这个工具也可以用来查询数据库档案里的内容,例如:postmap -q 172.16.2 hash:/etc/postfix/access,这会列出该行的规则,如要删除可以使用:postmap -d 172.16.2 hash:/etc/postfix/access,透过这个方式能及时有效的管理,不用重新修改 access 文字文件,然后杂凑成数据库,然后重新启动 postfix 加载设定档等等,作一连串动作! 
蓝色月光的内容完毕,似乎有些命令用起来有些问题,大家有什么想法请表达出来,我用公司的mail server,不敢随便做实验,如果上述内容那些不对,请指出来。
现在看maillog部分,查看maillog的时候amavisd部分就会看到分值了,amavisd调用spamassassin打分,cleanup就是对mail的结束处理。Smtpd是对网络部分的处理,postfix/nqmgr是队列的处理。这个上面都讲到了。仔细观察,log的记录,可以自己发邮件测试。



       现在看main。Cf配置,进去配置的时候需要注意每个改动自己都要清楚,都要有个备份。这样改不好的时候可以恢复回来。还要知道里面可以加cbl,但不要加rbl,sbl之类的。不要做反向域名解析,那样你会丢失很多正常的mail。关于main的配置说明请到google上去search。
       以下是我后加的部分配置,
       smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 100
smtpd_error_sleep_time = 5s
fork_attempts = 5
fork_delay = 2s
transport_retry_time = 60s
deliver_lock_attempts = 5
deliver_lock_delay = 1s
stale_lock_time = 500
initial_destination_concurrency = 2
default_destination_concurrency_limit = 20
queue_run_delay = 1000s
maximal_queue_lifetime = 1d
minimal_backoff_time = 1000s
maximal_backoff_time = 4000s

smtpd_sender_restrictions = reject_unknown_sender_domain,reject_non_fqdn_sender
line_length_limit = 2048
header_size_limit = 102400
extract_recipient_limit = 10240
message_size_limit = 2240000
bounce_size_limit = 50000
header_checks = pcre:/etc/postfix/header-checks

content_filter = smtp-amavis:127.0.0.1:10024
    下面开始说明 
邮件标头过滤
标头过滤所过滤的对象,除了邮件标头外,更扩大范围到附加档案的 MIME 标头,使得过滤可以更精确的进行,而不会因规则过于模糊,殃及无辜的邮件。用过 procmail 的使用者要特别注意:附加档案档名或档案类型是在此过滤,而非在邮件内文过滤。设定方式如下:
header_checks = regexp:/etc/postfix/header_checks
header_checks = pcre:/etc/postfix/header_checks 
在外挂设定档 header_checks(可以改用其它档名)中,当字符串比对命中时,可以采取各种处理动作,包括:
REJECT        拒收信件。
OK        跳过符合条件的标头不作后续检查,在 sendmail 中一旦 OK 该信件就会被接受,但在 postfix 中,OK 仅用来跳过该标头的后续比对,万一有其它标头被拒绝,该封邮件一样会被拒绝。
IGNORE        从邮件删除该标头。
WARN        附加警告讯息。
HOLD        放回队列,等候处理。
DISCARD        直接将邮件丢弃,不响应拒收讯息。
FILTER transport.nexthop        呼 叫外挂过滤程序,进行邮件内文剖析过滤。外挂过滤程序可以是任何一种可执行的档案,例如:shell script。该程序必须先定义在 master.cf 中,模拟成一个 socket 来执行(由 master 模块负责伺服监听),当需要呼叫它执行时,postfix 中的 clearup 模块会将整封邮件丢到指定的 port 号,master 模块监听到讯息后会执行相对应的过滤程序。
header_checks 的范例如下:
/^Subject: Make Money Fast/ REJECT
/^To: [email protected]/ REJECT
如果未设置此参数,则邮件标头过滤功能将会关闭不启用,这是系统默认值。     (个人点评:这个是postfix自带的过滤功能,使用效果个人感觉一般,既然spamassassin有规则集,实在没必要在这里做.不过知道没有什么坏处)  

邮件内文过滤
这是用来过滤所有标头过滤没检查到的邮件内容,设定方式与前面相同:
body_checks = regexp:/etc/postfix/body_checks
body_checks = pcre:/etc/postfix/body_checks 
如果未设置此参数,则邮件标头过滤功能将会关闭不启用,这是系统默认值。(实为鸡肋,一般没有人开启吧)
对于客户端过滤,还是小心为妙.
对于寄信人,收信人过滤,里面有很多参数,参考如下:
寄信人过滤
此功能并非过滤邮件标头里的寄信人字段,而是过滤 mail from: 命令后面的字符串,默认值是不过滤,但由于广告信寄信程序为了能顺利寄信,经常会伪造此字符串,建议应该启用。
可以使用的选项包括:
reject_unknown_sender_domain        寄信人的网域名称无法从 DNS 查询验证时,拒绝联机。
reject_rhsbl_sender        寄信人信箱如果被纪录在 SPAM 数据库站台,就拒绝他联机。
check_sender_access        根据 access 设定过滤存取权限。
reject_non_fqdn_sender        寄信人的网域名称不是完整 FQDN 格式时,拒绝其联机。
reject_sender_login_mismatch        寄信人信箱与登入的账号不吻合时,拒绝其联机。须配合 SASL 使用者认证机制使用(SMTP AUTH)。 
配合 smtpd_sender_login_maps 指定的对应表,可以让登入账号与使用的信箱作对应,例如:shane 账号可以用 webmaster 信箱寄信。
其它 permit、defer、reject、warn_if_reject、reject_unauth_pipelining 请参考前面的说明。
设定范例如下:
smtpd_sender_restrictions = reject_rhsbl_sender dsn.rfc-ignorant.org(国外免费的 SPAM 数据库:挡寄广告信的信箱)
smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain
smtpd_sender_restrictions = permit_sasl_authenticated,reject_unknown_sender_domain,reject_non_fqdn_sender
收信人过滤
此功能并非过滤邮件标头里的收信人字段,而是过滤 rcpt to: 命令后面的字符串,默认值是不过滤,但由于广告信寄信程序为了能顺利寄信,经常会伪造此字符串,建议应该启用。
可以使用的选项包括:
permit_auth_destination        收信人网域符合 $relay_domains、$mydestination、$inet_interfaces、$vitual_alias_domains、$virtual_mailbox_domains 的定义时,接受联机。
reject_unauth_destination        收信人网域不符合上述设定时,拒绝联机。
permit_mx_backup        当 从 DNS 上查到本机为收信人网域的备份 MX 时,接受联机。使用此功能有安全漏洞,可以配合 permit_mx_backup_networks = 172.16.0.0/16 来检查主要 MX 是否在该网段内,来加强过滤功能(避免被不信任的网域设定为转信 MX)。 
check_relay_domains        允许代收要给 relay_domians 的信件。
check_recipient_access        根据 access 设定过滤存取权限。
check_recipient_maps        当 收信人网域不符合 permit_auth_destination 之要求,或是收信人信箱不符合 $local_recipient_maps、$virtual_alias_maps、$virtual_mailbox_maps、$ relay_recipient_maps 的定义时,拒绝联机。此参数可以放在收信人过滤规则的最后面,当作过滤政策。
reject_unknown_recipient_domain        收信人的网域名称无法从 DNS 查询验证时,拒绝联机。
reject_rhsbl_recipient        收信人信箱如果被纪录在 SPAM 数据库站台,就拒绝他联机。
reject_non_fqdn_recipient        收信人的网域名称不是完整 FQDN 格式时,拒绝其联机。
其它 permit、defer、reject、warn_if_reject、reject_unauth_pipelining 请参考前面的说明。
设定范例如下:
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination,reject_non_fqdn_recipient
ETRN 命令过滤
用 来过滤哪些网域或哪些客户端,可以使用 ETRN 命令。ETRN 命令用来一次处理大量邮件,当某个客户端使用 ETRN 时,有时候会影响到其它用户寄信的效能,通常只有拨接用户、帮拨接用户转信的 mail gateway、邮件讨论群组(mailing list)或电子报发行站台,需要使用此功能。postfix 的默认值是所有客户端都可以使用 ETRN 命令。
能使用的特殊参数只有 check_etrn_access,其余与客户端过滤参数相同,请自行查阅前文。设定范例如下:
smtpd_etrn_restrictions = permit_mynetworks, hash:/etc/postfix/etrn_access, reject
(个人觉得: 对于sender domain 和recipient domain 是在做反向域名解析,加上了这个,那么大多数的信件都不用投递了,你可以用host –t mx abc.com , host abc.com ,host 11.22.33.44 命令查询 . 便可知哪个做域名解析了 . sbl也是不要的. fqdn倒是可以加 )

效能调整是很有用的 ,如下

同步处理限制

postfix 采用同步处理限制来进行流量调整和控制,当 postfix 寄信到某个邮件主机时,首先传两封信过去(initial_destination_concurrency = 2),如果一切正常则逐步增加每次传送的量,一直到传输失败或者是到达同步上限每次 20 封信(default_destination_concurrency_limit = 20)。

如果想要针对不同 agent 来设定同步上限,也可以使用底下的参数(未设定的参数将会沿用 default_destination_concurrency_limit 限制):

local_destination_concurrency_limit = 2

uucp_destination_concurrency_limit = 2

smtp_destination_concurrency_limit = 10

收信人限制

这 是指一封信可以寄给多少人,postfix 预设可以处理 50 个收信人(default_destination_recipient_limit = 50),如果一封信的收信人超过 50 人,postfix 会自动将此信复制成很多份,以 50 人为单位分批寄送。

和同步处理限制一样,可以针对不同 agent 来设定不同上限:

uucp_destination_recipient_limit = 2

smtp_destination_recipient_limit = 10

延迟传送

当 邮件服务器使用拨接线路联机时,由于部分时段处于断线状态,当 postfix 处理信件时会因为无法收发信件,持续产生错误讯息,为了避免发生这个现象,我们可以设定 defer_transports = smtp 来告知 postfix,要从 smtp agent 传送出去的邮件暂时不要传送。这些邮件可以等到上线后,再以 ETRN 指令全部寄出。

如果本机是前述邮件服务器的 mail gateway,由于该服务器只有部分时段上线,因此有可能 mail gateway 已经累积许多信件等待传送给它,为了避免 mail gateway 持续尝试传送,可以设定:

defer_transport = hold

接着在 /etc/postfix/transport 设定:

customer.com   hold:[gateway.customer.com]

这个设定的意思是,要给 customer.com 的邮件先暂存在 gateway.customer.com,等待前者上线后再全部传送给它(使用 ETRN 命令)。

设定好后,还需修改 master.cf,找到 smtp 行程设定(可参考前面小节),将 smtp 改为 hold 即可:

hold   unix   -   -   n   -   -   smtp

传送失败处理

当邮件传送失败的时候,负责传送邮件的 Agent 会将邮件退回给 qmgr 模块,qmgr 模块则会计算从邮件到达到现在的时间间隔,依此时间间隔将邮件排入延迟传送队列中,以等待下次传送。

如 果该封邮件传送到一半的时候失败了,也就是说有些收信人有收到,有些没有。这种情况下,除了将该邮件排入延迟传送队列外,也会将传送失败的对象排入 dead 清单一段时间,在这段时间内如果有其它邮件要传送给这些对象时,就会直接排入延迟传送队列,而不用徒劳无功地去尝试传送!

底下是有关于邮件传送失败处理的相关效能设定:

queue_run_delay = 1000s        qmgr 模块每 1000 秒(约 16 分钟)检查一次 defer 队列,查看是否有邮件须排入 active 队列

maximal_queue_lifetime = 5d        无法传送的信件在 defer 队列里最多保存 5 天,超过时间则退给寄信人

minimal_backoff_time = 1000s        传送失败的邮件至少在 defer 队列中暂停 1000 秒,而且被排入 dead 清单的收信人至少也要待 1000 秒,也就是说在这段时间内不再尝试寄信给他

maximal_backoff_time = 4000s        传送失败的邮件最多在 defer 队列中等待 4000 秒(约 1 小时)

qmgr_message_recipient_limit = 1000        dead 清单的大小,也就是说第 1001 个传送失败的对象,不会被排入 dead 清单

拖延战术

当怀有恶意的客户端连续传送大量邮件时,postfix 为了处理这些邮件耗掉太多资源,导致无法正常工作,这也就是经常被讨论的「阻断服务攻击」。

postfix 的设计者认为阻断服务攻击是不可能被解决的,因为我们无法单从邮件区分出它是恶意或善意,但是我们可以透过一些手段来降低损害。postfix 采用的方法是针对每条联机,设定一个联机错误计数器( session error count),当客户端联机时,开启计数器,如果客户端传送不存在的 SMTP 命令(这绝对是恶意想阻断服务),或是超过字数限制的长字符串(内存溢位攻击)、超过一行的标头(引发邮件剖析错误),计数器就会不断累加。当邮件交寄成 功时,计数器才会归零重新计算。

现在我们只要根据计数器采取适当的处理动作就行了:

smtpd_soft_error_limit = 10        当计数器到达 10 时,就暂停该联机一段时间

smtpd_hard_error_limit = 100        当计数器到达 100 时,直接断线

smtpd_error_sleep_time = 5s        每次暂停 5 秒钟

資源管制

postfix 可以在記憶體有限的系統上執行,而不會影響其它服務的效能,這是因為 postfix 提供的記憶體管理功能非常有彈性,可以依據各種需求加以調整。

每封郵件用量限制

當 postfix 處理郵件時,必須將郵件暫存於郵件佇列中,其中 maildrop 和 incoming 佇列使用硬碟,而 active 和 deferred 則使用記憶體,每封暫存在佇列中的郵件耗用多少記憶體是由郵件資料結構來決定,幸運的是這個資料結構的欄位大小是可以微調的,透過這些微調就能決定 postfix 的最大記憶體用量了!

line_length_limit = 2048        從用戶端接收待寄郵件時,每行最多 2 KB

header_size_limit = 102400        每封郵件的標頭大小不得超過 100 KB

extract_recipient_limit = 10240        每封郵件的收信人欄位不得超過 10 KB

message_size_limit = 10240000        每封郵件(包含信封)的大小,不得超過 10 MB

queue_minfree =         當記憶體剩下多少 Bytes 時,才可以處理下一封郵件,預設是沒有限制。

bounce_size_limit = 50000        警告信的大小限制為 50 KB。

假設通通使用預設值,也就是所有參數都不設置,那麼處理一封郵件須耗用 10.05 MB,再加上 postfix 模組程式的大小,總共約 20 MB,這也就是 postfix 運行的最小需求了!

郵件數量限制

當前述用量限制設置完畢後,接著我們還可以針對郵件佇列一次要處理多少郵件作出限制,把每封郵件記憶體用量乘上郵件數量,就可以算出所需的記憶體總量,當記憶體足夠時,我們當然希望儘可能多處理幾封郵件來增進 postfix 的效能。

qmgr_message_recipient_limit = 1000        這個參數之前介紹過了,除了用來控制 dead 清單的大小外,也控制著處理中的郵件收信人總量,兩者的預設限制都是 1000。

qmgr_message_active_limit = 1000        最多同時處理 1000 封郵件。

duplicate_filter_limit = 1000        在進行收信人過濾時,要快取多少已通過過濾的清單,這個功能是用來提高過濾效能,預設要快取 1000 個不同收信人

時間限制

postfix 某些模組在運作時,會依照設定檔的要求讀取外掛程式或是執行 shell 命令,有些則是會讀取外部檔案。如果無限制的讓 postfix 等待外部命令執行完畢或等待外部檔案讀取完畢,將會因為這些外部程式的設計不當或 I/O 衝突,而導致 postfix 無法運作,因此就需要設定等候時間限制,超過此時間限制 postfix 將逕行處理下一個程序。

舉例來說:當 local agent 將郵件分到使用者信箱時,會透過 proxymap 模組讀取 alias 資料庫,接著根據 alias 設定讀取 :include: 檔案,最後讀取 .forward 檔案,前述動作中如果其中一個因為系統 I/O 忙碌無法於時間限制內讀取檔案,local agent 就會直接跳過進行下一個處理動作。

command_time_limit = 1000s        等候外部命令或 I/O 的時間不可超過 16 分鐘。

service_time_limit =         這個參數的目的是允許不同 service 採用不同時間限制,因此它會取代前述參數的設定,其中 service 就是 master.cf 中的第一個欄位。

檔案鎖定

當 local agent 要將信件分到使用者信箱時,有時候使用者正透過 POP3 讀取信箱,因此信箱被鎖定無法開啟,這種情況發生時,local agent 必須等候一段時間重新嘗試讀取檔案,但也不能一直等下去,所以必須要有一些限制。

postfix 支援兩種的檔案鎖定機制:一、使用系統函式 fcntl( ) 或 flock( ),二、使用 local file,postfix 將根據作業系統的不同,選擇其中一種或兩種並用。有關檔案鎖定機制在這裡不予討論,有興趣的讀者可以從「專業 Linux 程式設計」(Wrox 出版,碁峯翻譯經銷)一書一窺究竟。

deliver_lock_attempts = 5        檔案被鎖定時,嘗試讀取 5 次。

deliver_lock_delay = 1s        每次嘗試讀取前,先等候一秒鐘。

stale_lock_time = 500        當 lock file 存在超過 500s 時,強制刪除 lock file 解除其鎖定狀態。使用 lock file 其實是透過程式設計技巧來模擬檔案鎖定功能,它必須由程式設計師自行維護鎖定狀態,萬一有粗心的設計者鎖定檔案後忘記解除,或是程式當掉無法解除鎖定,都 會造成檔案長期被鎖定的假象,所以需要此設定來排除問題。

行程自動回復

當 行程或子執行緒因為某些原因當掉,例如:記憶體不足......等,這個時候 master 將會延遲一段時間後嘗試重新啟動該行程。當然,如果程式當掉的原因是 main.cf 檔案損毀所造成的,就算是不斷重複啟動也不能恢復正常,因此 postfix 也會將當掉的情形紀錄在系統日誌裡,以便管理員偵錯並人工修復。

fork_attempts = 5        行程當掉以後,會嘗試重新啟動它 5 次!

fork_delay = 1s        每次重新啟動前,先等候一秒鐘。

transport_retry_time = 60s        qmgr 每隔 60 秒嘗試驅動 agent 進行分信。

关于clamd,amavisd,spamassassin的配置,做的最好的是易人居士的了.我基本是按照他写的,然后根据自己的因数改一部分内容.现在直接copy过来,然后说一下自己的看法.

Clamav (/usr/local/etc/clamd.conf )

# This option enables scanning of Microsoft Office document macros.

# Default: enabled

ScanOLE2                 打开office文档扫描

# Enable internal e-mail scanner.

# Default: enabled

ScanMail                 打开邮件扫描

# ClamAV can scan within archives and compressed files.

# Default: enabled

ScanArchive             扫描压缩包

# Due to license issues libclamav does not support RAR 3.0 archives (only the

# old 2.0 format is supported). Because some users report stability problems

# with unrarlib it's disabled by default and you must uncomment the directive

# below to enable RAR 2.0 support.

# Default: disabled

ScanRAR                 扫描RAR压缩包

# Files in archives larger than this limit won't be scanned.

# Value of 0 disables the limit.

# Default: 10M

ArchiveMaxFileSize 10M     最大扫描压缩包文件为10兆

# Nested archives are scanned recursively, e.g. if a Zip archive contains a RAR

# file, all files within it will also be scanned. This options specifies how

# deep the process should be continued.

# Value of 0 disables the limit.

# Default: 8

ArchiveMaxRecursion 9         扫描压缩包9层

# Number of files to be scanned within an archive.

 

# Value of 0 disables the limit.

# Default: 1000

ArchiveMaxFiles 1000         最多扫描压缩包内1500个文件

# Set access mask for Clamuko.

# Default: disabled

ClamukoScanOnOpen

ClamukoScanOnClose

ClamukoScanOnExec

# Don't scan files larger than ClamukoMaxFileSize

# Value of 0 disables the limit.

# Default: 5M

ClamukoMaxFileSize 10M

-----------------------------------------------------------------------------------------------

(关于clamd,其实过滤效果是很好的,随便设置一下,都会达到100%过滤的,反病毒还是做的很好.不过我后来注释掉了很多)

Amavisd-new   (/etc/ amavisd.conf   )

D_PASS:   不做任何处理,直接传送给收件人。

D_DISCARD:   邮件不传送给发件人及收件人。

D_BOUNCE:   不传送给收件人。除了定义在 $viruses_that_fake_sender_re 病毒名称外的信件,amavisd-new 皆会传送 DSN 讯息给发件人。

D_REJECT:   不传送给收件人,发件人会收到拒绝传送的信息。

$sa_auto_whitelist = 1;   # 启用自动学习白名单 White List

$sa_mail_body_size_limit = 200*1024;   # 超过某个特定大小的邮件就不经过

SpamAssassin 的扫描。

$sa_tag_level_deflt = 4.0;   # 超过这个分数标准者,才视为垃圾邮件打分数。

加入 X-Spam-Status 及 X-Spam-Level 信息头

$sa_tag2_level_deflt = 6.3;   #   超过这个分数标准者,才允许在邮件标题加入

Spam 信息。

加入 X-Spam-Flag:YES 及改写主题

(你如果细心查看maillog ,就会发现sa_tag2_level_deflt才是垃圾信的标准,超过6.3的pass,低于的就Passed SPAM了 ,所以我把这个值提高到7 , 另外我的$max_servers = 10

$sa_kill_level_deflt = 10 ;   #   超过这个分数标准者,就直接將信件备份后删除。

$sa_dsn_cutoff_level = 9;   # 超过这个分数标准者,將不会送出 DSN 信息。

--------------------------------------------------------------------------------

Spamassassin   (/etc/mail/spamassassin/local.cf )

# SpamAssassin config file for version 3.x

# NOTE: NOT COMPATIBLE WITH VERSIONS 2.5 or 2.6

# See http://www.yrex.com/spam/spamconfig25.php for earlier versions

# Generated by http://www.yrex.com/spam/spamconfig.php (version 1.50)

# How many hits before a message is considered spam. 得分多少以上就会被判定为垃圾邮件。

required_hits       6.3

(不知道自己的spamassassin的version 可以输入spamassassin –version查看 ,  我的值都高点,我设成6.5 )

# Whether to change the subject of suspected spam. 在已判定的垃圾邮件之标题加上标记。( 如果是使用amaivsd来呼叫spamassass进行过滤的,请修改 Amavisd-new 的配置文件amavisd.conf 中的相应选项:$sa_spam_subject_tag = '***[ Junk Mail ]*** '; )

rewrite_header Subject ****SPAM(_SCORE_)****

# Encapsulate spam in an attachment.

# 要如何处理垃圾邮件。如果邮件还会经过防毒程序的扫描处理,所以必须设定为 0。

# 0:将信息写入邮件表头。

# 1:将垃圾邮件转为附件。

# 2:将垃圾邮件转为纯文字附件。

report_safe         0

# Use terse version of the spam report. 用精简的方式来回复垃圾邮件信息给管理者

use_terse_report     0

# Enable the Bayes system. 使用贝叶斯学习系统

use_bayes           1

(光启用了似乎还不可以吧,还需要指定一些参数,参考如下

# 是否使用 Bayesian

use_bayes 1

# Bayesian 之資料庫位置

bayes_path /var/lib/amavis/.spamassassin/bayes

# 是否啟用 Bayesian 自動學習功能?

auto_learn 1

不过我没有找到我的bayes的资料库位置 ,所以就没有写出来  )

# Enable Bayes auto-learning. 开启贝叶斯自动学习功能

auto_learn         1

# Enable or Disable network checks. 略过 RBLs 检查、使用 Razor version 2、使用 DCC (Distributed Checksum Clearinghouse)、使用 Pyzor

skip_rbl_checks       0

use_razor2         1

use_dcc           1

use_pyzor           1

# Blacklist. 黑名单,判定減 + 100 分

blacklist_from *@sohu.com *@mailfb.com

# Whitelist . 白名单,判定加 — 100 分 (这个很管用,一定要用好)

whitelist_from *@yahoo.com.tw *@yahoo.com.hk *@yahoogroups.com.hk

whitelist_from [email protected]

# Mail using languages used in these country codes will not be marked

# as being possibly spam in a foreign language.

# - chinese

ok_languages         zh en

# Mail using locales used in these country codes will not be marked

# as being possibly spam in a foreign language.

ok_locales         zh en

# Disabled scores. 防止中文主旨和中文收件者误判,建议再加上下列几行

score HEADER_8BITS 0

score HTML_COMMENT_8BITS 0

score SUBJ_FULL_OF_8BITS 0

score UPPERCASE_25_50 0

score UPPERCASE_50_75 0

score UPPERCASE_75_100 0

# local domain from but ip not match. 域名和 IP 不符合,疑为垃圾邮件

header __FROM_TEATIME Received =~ /from test.com.cn/i

header __FROM_TEATIME_IP Received =~ /[12.34.56.78]/

meta FROM_TEATIME_BUT_IP_ERROR (__FROM_TEATIME)

describe FROM_TEATIME_BUT_IP_ERROR From test.com.cn but ip not match

score FROM_TEATIME_BUT_IP_ERROR 8

score NO_REAL_NAME 4.000

score SPF_FAIL 10.000

score SPF_HELO_FAIL 10.000

score BAYES_99 4.300

score BAYES_90 3.500

score BAYES_80 3.000

Spamassassin 系统设置之 黑白名单

-----------------------------------------------------------------------------------------------------

vi /etc/amavisd.conf (加入以下两行)

-----------------------------------------------------------------------------------------------------

read_hash(%whitelist_sender, '/var/amavis/var/.spamassassin/whitelist');

read_hash(%blacklist_sender, '/var/amavis/var/.spamassassin/blacklist');

-------------------------------------------------------------------------------------------------------

注明:以上两个文件 whitelist 和 blacklist 要手动建立

 

touch > /var/amavis/var/.spamassassin/whitelist

touch > /var/amavis/var/.spamassassin/blacklist

两个文件的属主属性为:

chown amavis:amavis whitelist

chown amavis:amavis blacklist

1)建立后,执行 /etc/rc.d/init.d/amavisd reload 让 amavisd 重新读取配置文件信息。

2)登记在 whitelist 的邮件地址或域名均不会被 Spamassassin 打分为垃圾邮件。

3)登记在 blacklist 的邮件地址或域名均会被 Spamassassin 打分为垃圾邮件。

4)whitelist 和 blacklist 的写法,例如:

[email protected]

*@boss.com

5)修改了 whitelist 或 blacklist 文件,均需要执行 /etc/rc.d/init.d/amavisd restart 让 amavisd 重新启动,否则,黑白名单不能生效 !!!(我似乎感觉不到这两行的威力,加了之后还是打分,判断是否垃圾 ….. 如果大家有什么好的判断,请说出来,一起研究  )

修改好了这些后时候就万事大吉了呢  ,不是的  . 每个mail server都不同,都会有不同的垃圾源盯上你的mail server的.所以必须量身定做 适合自己的垃圾规则集, 我以前一直忽略了这个问题,只是在postfix配置 和clamd amavisd参数上下功夫,事倍功半的 .

仔细search你的maillog ,grep 你的昨天 前天的mail的收发信息,  然后grep  Passed SPAM ,或者 grep Passed CLEAN 挑出通过的和没通过的,自习研究他们的数量和规律,例如你查处有个叫debora**的sb总是向你发mail ,每天上百封,你就可以过滤掉它. 而某某好的邮箱给你发信,竟被你拒掉了,那么添加规则 凡是它发过来的都pass . 或者进入/var/virusmails, gunzip –d * ,然后grep 某人 ,查看他的邮件的打分情况  ,例如下面的

X-Priority: 3

X-MSMail-Priority: Normal

X-Mailer: Microsoft Outlook Express 6.00.2800.1437

X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1437

X-Spam-Status: Yes, score=22.214 tag=4 tag2=6 kill=10 tests=[BAYES_00=-2.599,

EN_SUBJECT_147=11, EXTRA_MPART_TYPE=1.091, HELO_DYNAMIC_DHCP=3.066,

HELO_DYNAMIC_IPADDR=4.2, HTML_MESSAGE=0.001, RCVD_IN_BL_SPAMCOP_NET=1.558,

RCVD_IN_XBL=3.897]

X-Spam-Score: 22.214

X-Spam-Level: *********************

X-Spam-Flag: YES就知道自己打分的情况了 .

你可以vi /usr/share/spamassassin/aaa.cf  定义自己的垃圾标准    ,例如

header EN_SUBJECT_147           Subject =~ /all/

score EN_SUBJECT_147            11.00

header EN_SUBJECT_148           Subject =~ /hi all/

score EN_SUBJECT_148            11.00

header EN_SUBJECT_149           Subject =~ /It's/

score EN_SUBJECT_149            11.00

header EN_SUBJECT_150           Subject =~ /this it/

score EN_SUBJECT_150            11.00

header EN_SUBJECT_151           Subject =~ /Your/

score EN_SUBJECT_151            11.00

header EN_SUBJECT_152           Subject =~ /wrote/

score EN_SUBJECT_152            11.00

header EN_SUBJECT_153           Subject =~ /QBQ/

score EN_SUBJECT_153            11.00

邮件from呢

header EN_FROM_017              From:name =~ /4tune/

score EN_FROM_017               11.00

header EN_FROM_018              From:name =~ /newsletter/

score EN_FROM_018               11.00

header EN_FROM_019              From:name =~ /debora/

score EN_FROM_019               11.00

及对邮件内容打分 等等   ,以上匹配的都是要加11分的  ,垃圾嫌疑值可自己酌情定义. 最后累加 看是否超过及格线,超过为垃圾

添加完后都是需要重启服务的   .

好了,基本上先写这些东西,大家有什么想法可说出来,不对的地方请指正批评