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 的写法,例如: *@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分的 ,垃圾嫌疑值可自己酌情定义. 最后累加 看是否超过及格线,超过为垃圾 添加完后都是需要重启服务的 .
好了,基本上先写这些东西,大家有什么想法可说出来,不对的地方请指正批评 |