alias怎样不延迟不稳定

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
从IT。懂点php,会点js,熟悉html, 了解点linux,折腾过c 。 爱隋唐,爱三国,爱水浒...
近而立却未立。
LOFTER精选
阅读(1453)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'YII与他的延迟加载技术',
blogAbstract:' 对于 YII的性能,网上已经有作过测试,这里也不再作性能比较的讨论。本文的重点是对他高性能原因的一个分析。这里借用网友提到的一个知识点“延迟加载”. 先说下什么是延迟加载? Jquery 里有个图片的延迟加载,具体原理是当浏览器滚动到该图片的显示的区域才加载该图片,也就说用户要看图片的时候才现实,不看不显示。 典型的按需分配原则。那么什么是YII里的延迟加载技术呢? 其实简单的说就是对于框架里的各类库,在真正要用的时候才会被include进来,【这一点和drupal 就不同, Drupal是一次将需要的不需要的都include 进来】,对于各组件【其实也就是一些类】,需要用到的时候才创建【new class】!原则仍然是按需分配。那么YII是怎么做到的呢? 弄清楚这些问题之前,需要了解下Yii的基本类结构。',
blogTag:'yii,php,延迟加载,性能',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'从IT。懂点php,会点js,熟悉html, 了解点linux,折腾过c 。 爱隋唐,爱三国,爱水浒...
近而立却未立。',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}postfix 是除了 sendmail 以外 ,最被广泛采用的 Linux 邮件服务器,一般使用的观感不外乎两点:一、安全:垃圾信过滤机制较聪明,就算什么都没设定,也能滤掉许多 sendmail 挡不到的信。二、简单:不需设定,服务器就能正常运作。虽然以上谈的这两点特色,到底是好是坏还有许多争议,但 Postfix 对于邮件服务需求量不高的校园来说,可以说是一个很好的选择!本文是假设您已经读过 Linux 进阶班讲义,因此对于 MUA、MTA、MDA、MSA 已经有概念,并且了解电子邮件结构及其字段义涵,能自行设定启用 IMAP 及 POP3 服务,并能利用 telnet 工具检测服务器情形,但对于 postfix 运作原理不甚清楚,想知道如何依自己的需要作各种过滤设定!那么本文的内容应该对你很实用! 壹、从 sendmail 到 postfixredhat 系统预设的邮件服务器是 sendmail ,而 postfix 是不会自动安装的,如果一开始安装系统时忘记把 postfix 装起来,请放入系统光盘第二片,依底下指令安装:mount /mnt/cdromcd /mnt/cdrom/RedHat/RPMSrpm -Uvh postfix*cd /eject为了便利于 sendmail 和 postfix 之间进行切换,系统提供一个工具可以自动帮我们作设定迁移,请放入系统光盘第三片,依底下指令安装:mount /mnt/cdromcd /mnt/cdrom/RedHat/RPMSrpm -Uvh redhat-switch-mail*cd /eject要进行邮件服务器切换,请输入 redhat-switch-mail 然后选择您想要用的服务器(sendmail 或是 postfix),虽然选好后系统会自动将服务器关闭和启动好,但我们依然可以使用底下指定来确定这件事(假设您选中的是 postfix):service sendmail stopservice postfix start这样 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 改成 shane@mail.spps.tp.edu.tw),接着读取 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 加载设定档等等,作一连串动作!  叁、main.cf 基本设定postfix 最被人称道的地方在于设定档的可读性很高(当然是跟 sendmail 比),而在主要设定档 main.cf 中,需要自行定义的东西并不多,而且这些参数就算不去定义,依照默认值也可以运作:由本机寄出的邮件要使用哪个网域名称在 sendmail 中,这个功能称为网域伪装,也就是说可以和主机名称不同,例如:本机名称为 mail.spps.tp.edu.tw,而寄出的邮件其寄信人字段则可以使用 spps.tp.edu.tw。(须配合 DNS MX 纪录使用)myorigin=spps.tp.edu.tw不使用简略名称时,设定如下:myorigin=mail.spps.tp.edu.tw由于主机名称与网域名称会被反复引用在不同设定值,为了简化设定,通常是定义成变量:myhostname = mail.spps.tp.edu.twmydomain = spps.tp.edu.tw#myorigin=$mydomainmyorigin=$myhostname (省略时,视同此设定)当然以上变量也可以省略不定义,这种情况下 postfix 将使用 gethostname( ) 函数取得系统设定。如果是将 myorigin 省略,则视同为设定 $myhostname。另外,如果本机是某个网域的 mail gateway,也就是说网域内的所有邮件服务器,都必须把它们的邮件送到本机来处理,这种情形可以使用 masquerade_domains 让 postfix 自动缺省寄信人字段中的邮件主机名称,例如:masquerade_domains = $mydomain假设 $mydomain 是 spps.tp.edu.tw,则无论信件是来自 stu.spps.tp.edu.tw 或 mail.spps.tp.edu.tw 都将会被改写成 spps.tp.edu.tw。如果你有某些账号不想要让 mail gateway 改写寄信人字段,可以设定底下的参数(预设不启用):masquerade_exceptions = root启用 masquerade_domains 功能只会改写邮件标头与信封里的寄信人字段,如果想要将收信人字段一并改写,可以设置底下的参数:masquerade_classes = envelope_sender, envelope_recipient, header_sender, header_recipient注意:这样做将使得 mail gateway 无法寄信给下属邮件服务器,因为收信人字段 @ 后面的邮件网域名称会被改写成 mail gateway 自己。要接收来自哪些网络接口的邮件底下参数是用来定义要处理来自哪些网络接口的邮件,当未定义时,预设会处理本机所有网卡(可以使用 ifconfig 观察),如果定义成 localhost ,则只有 loopback 接口会接受邮件,也就是说只接受主控台或 WEB 接口寄出的邮件,不接受 MUA(outlook express)递交的邮件:inet_interfaces = localhost设定成 all ,表示接受所有网络接口的邮件,这是默认值:#inet_interfaces = all设定成 $myhostname ,表示要透过 DNS 反查 IP,当本机 IP 是由 DHCP 指派,而 DNS 又未被设定成 DDNS ,将会出现不可预期的错误!#inet_interfaces = $myhostname底下范例将会在有 DNS A 纪录的 IP 以及 loopback 接口上提供服务,在这里我们可以发现 main.cf 中有许多设定可以设定超过一个值,将它们用逗号区隔开来就行了!(底下的设定范例不适用于 postfix 本身兼 Proxy/NAT 的场合)#inet_interfaces = $myhostname, localhost哪些网域的邮件是给本机的定义在这里的网域将被视为是 local 网域,换句话说寄到这些网域的邮件,会被接收并分信给本机使用者,相当于 sendmail 中的 local-host-name,当不使用 DNS MX 纪录时,设定如下:mydestination = $myhostname localhost.$mydomain如果有使用 DNS MX 纪录,需修改为:mydestination = $myhostname localhost.$mydomain $mydomian假设该服务器在 DNS 上有多笔 A 或 CNAME 纪录,则须将这些纪录也写上去,例如:mydestination = $myhostname localhost.$mydomain $mydomian www.$mydomain ftp.$mydomain哪些邮件要进行 relay在 postfix 中针对转信网域作处理的参数有两个,一是用来定义局域网络网段的 mynetworks,另一个是 relay_domains,未被定义在这些参数里的网域,系统将拒绝转信!首先说明局域网络网段设定,相关参数共有两个:mynetworks_style 和 mynetworks,前者用来宣告局域网络类型,subnet 代表是子网络,这也是默认值,当未作设定时,postfix 将会自行根据 ifconfig 上登记的 IP 和 网络屏蔽作运算,自动求出子网络的范围;如果设定成 class,则是不理会屏蔽,自动信任同一个 class 等级的计算机,如果该服务器使用拨接上网,这样设定将使得同一家 ISP 的拨接用户,都可以利用本服务器转信,这是非常危险的(除非你是 ISP 公司);设定成 host 则仅该单机可以寄信。#mynetworks_style = class#mynetworks_style = subnet#mynetworks_style = hostmynetworks 用来设定局域网络的 IP 范围,刚才设定的 mynetworks_style 将会被此参数取代,如果省略不设定,则由 mynetworks_style 来决定要 binding 的网卡:mynetworks = 168.100.189.0/25或mynetworks = 168.100.189.10除了上面范例,设定成网段或单机外,也可以指定多个网段(多重 NAT 网域时),或是使用设定档(条列式),或使用杂凑表(makemap hash 或 postmap hash:)。#mynetworks = 168.100.189.0/28, 127.0.0.0/8#mynetworks = $config_directory/mynetworks#mynetworks = hash:/etc/postfix/network_table有关转信网域设定,以上两个参数就已经足以应付各种需求,但为了与 sendmail 兼容,仍然保留 relay_domains 设定,与 sendmail 不同的是,如果该 relay_domain 在 DNS 上有定义 MX 纪录,将会被 postfix 故意忽略,而当成 mynetworks 来处理,这是为了避免被利用作为广告信回信站台;relay domain 对 sendmail 而言是双向的,但对 postfix 而言则是单向的,只能寄信,而且不代收回信,因此如果要将本机设定成 mail gateway,请使用 mydestination,而不要使用 relay_domains(注意:很多介绍 postfix 的文章都犯此错误!)建议不要设置此参数,使用默认值「不启用」。#relay_domains = $mydestination当本机为某台 mail gateway 的下属服务器时,必须要将所有寄出的信件交给 mail gateway 代转,这时可以设定 relayhost 为该 mail gateway 的 IP。预设不启用。#relayhost = $mydomain#relayhost = mg.spps.tp.edu.tw#relayhost = [172.16.1.7]哪些情况须通知管理员所谓管理员是指 postmaster 信箱,请修改 alias 设定将 postmaster 对应成管理人员真正使用的信箱,以免警告邮件没人理会堆积在服务器上。notify_classes 参数用来决定哪些情形下须通知管理员,默认值如下:notify_classes = resource, software可以使用的参数包含:bounce当一般邮件无法交递时,产生警告信给管理员(会附上原始邮件的内文)。注意:邮件无法交递时,本来就会寄警告信给发信人,管理员收到的不过是复制版本。2bounce当寄给发信人的警告信无法交递时, 产生警告信给管理员。delay当对方站台忙碌要求延迟递送时,产生警告信给管理员(不会附上原始邮件)。policy对方寄信的要求因为不符合安全规范已经被回绝(被规则过滤掉),此时会产生警告信给管理员。protocol通讯协议错误时产生警告信通知管理员,我们比较感兴趣的是对方使用了哪些不合法的 SMTP 命令。resource系统资源短缺导致信件无法寄出,例如:硬盘 I/O 错误,此时会产生警告信给管理员。software软件安装不全或程序错误造成的问题,产生警告信给管理员。 Proxy/NAT 地址当邮件服务器位于 proxy 或 NAT 防火墙的后方时,此参数用来设定真实 IP,以避免因为 MX 纪录与本机 IP 不同,将该信误判成需 relay 到其它 MX 的邮件;当本机所查询的 DNS 其回复 MX 纪录为虚拟 IP 时,此种现象将不会发生,因此在 NAT 虚拟网域中,架设内部专用 DNS 是非常重要的,请参考一文的解说。默认值为:proxy_interfaces =当本机被设定成其它网域的备份 MX 时,如果未设置此参数,邮件会成为服务器间互踢的皮球(去询问其它网域的 DNS 查询 MX 纪录时,查到的必然是真实 IP,即使有架设内部专用 DNS 也没用)。设定如下:proxy_interfaces = 163.21.166.7 肆、main.cf UCE(unsolicited commercial email)过滤过去这类的邮件被称为垃圾邮件,比较正式的称呼是 SPAM 邮件,postfix 则称此种邮件为 UCE,有那么一点缩小打击范围的含意,因此使用 UCE 过滤并无法解决其它问题邮件(例如:匿迹邮件、病毒邮件、邮件炸弹)所带来的困扰,请不要期望过高。尽管如此,与 sendmail 使用 access 来进行存取控管相比较,postfix 的 UCE 过滤显然要精细得多,弹性也比较好,以外挂方式读取过滤规则使得管理员能随时修改设定,并将它模块化,可以说是 postfix 最大的优点。如前所述,postfix 并不使用复杂的宏语言来进行规则运算,而是采用较为单纯的查表法来控制,但各位可不要小看它,它所支持的查表方式可谓琳琅满目,诸如:字段比对(纯文字文件,字段以逗号或空格或定位点区隔)、DBM 检索、HASH 杂凑、NIS 查询、RBL 查询.....等,比对规则也可以选择采用正规表示法(regexp)或是 perl 改良过的正规表示法(pcre)。邮件标头过滤标头过滤所过滤的对象,除了邮件标头外,更扩大范围到附加档案的 MIME 标头,使得过滤可以更精确的进行,而不会因规则过于模糊,殃及无辜的邮件。用过 procmail 的使用者要特别注意:附加档案档名或档案类型是在此过滤,而非在邮件内文过滤。设定方式如下:header_checks = regexp:/etc/postfix/header_checksheader_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: / REJECT如果未设置此参数,则邮件标头过滤功能将会关闭不启用,这是系统默认值。邮件内文过滤这是用来过滤所有标头过滤没检查到的邮件内容,设定方式与前面相同:body_checks = regexp:/etc/postfix/body_checksbody_checks = pcre:/etc/postfix/body_checks 如果未设置此参数,则邮件标头过滤功能将会关闭不启用,这是系统默认值。客户端过滤当用户使用 SMTP 通讯协议连上服务器提出寄信请求时,针对客户端输入的指令进行过滤。在
中已经详细论及在 SMTP 联机阶段中出现的各种欺骗服务器的手法, postfix 提供非常详尽的设定可以针对这些问题加以预防。使用客户端过滤时,必须将 smtpd_delay_reject = yes 设定上去,这是系统默认值。当设定成 no 时,虽然效率较高,但是这样做将会使得 HELO 网域伪装、送信人信箱伪装、寄信人信箱伪装以外的其它过滤功能失效。客户端过滤能够使用的过滤功能,包括:reject_unknown_client客户端之 IP 或 Domain name 无法从 DNS 查询验证时,拒绝联机。permit_mynetworks符合 $mynetworks 定义的客户端允许联机。reject_rbl_client从 SPAM 数据库站台验证客户端网域名称,符合时拒绝联机,当这种情况发生时,postfix 将会依照 default_rbl_reply 的设定回复相关讯息,也可以依照 rbl_reply_maps 的设定根据不同客户端给予不同讯息,事实上我们根本不需要设置此两个参数(除非想将讯息改成中文)。这个参数必须放在最后面,当成过滤政策。reject_rhsbl_client同上,使用另一种 SPAM 数据库站台。这个参数必须放在最后面,当成过滤政策。check_client_access根据 access 设定过滤存取权限,与 sendmail 中的 access 数据库兼容。 可以省略参数名称,直接写档名,例如:hash:/etc/postfix/access。permit允许联机,设定在过滤规则的最后面,表示未被之前的规则拒绝的客户端一律允许联机,也就是采用黑名单政策。defer延迟联机,设定在过滤规则的最后面,表示未被之前的规则拒绝或接受的客户端,必须在稍后重新接受检验,也就是采用拖延政策。reject拒绝联机,设定在过滤规则的最后面,表示未被之前的规则接受的客户端一律拒绝联机,也就是采用白名单政策。warn_if_reject被拒绝时产生警告讯息,这是用来测试过滤规则用的。reject_unauth_pipelining当客户端持续一直传送 SMTP 命令时,拒绝其联机,这可以防止某些软件一次寄送大量邮件。使用客户端过滤跟稍后会介绍的各种 SMTP 过滤,可以把规则依照前后顺序编排成一组规则炼(写成一行,中间用逗号隔开或从逗号后面分行),由于组合出来的过滤功能并非单独运作的,因此顺序非常重要!smtpd_client_restrictions = reject_rbl_client dialup.ecenter.idv.tw(台湾免费的 SPAM 数据库:挡拨接发广告信)smtpd_client_restrictions = reject_rbl_client relays.ordb.org(国外免费的 SPAM 数据库:挡开放转信的服务器)smtpd_client_restrictions = reject_rbl_client spam.ecenter.idv.tw(台湾免费的 SPAM 数据库:挡寄广告信的信箱)smtpd_client_restrictions = hash:/etc/postfix/access, reject(采用白名单政策)smtpd_client_restrictions = permit_mynetworks,reject_unknown_clientsmtpd_client_restrictions = permit_mynetworks,hash:/etc/postfix/client_checks,reject_unknown_client,reject_unauth_pipelining(每日更新)是否要求使用 HELO 命令当启用此功能时,将要求客户端进行联机时须先传送 HELO 字符串,稍后我们可以根据 HELO 字符串传回来的网域名称进行过滤,由于某些寄信程序不会传送 HELO 命令,这样做有可能会使得这些客户端程序无法正常寄信。默认值是:smtpd_helo_required = noHELO 命令过滤用来过滤 HELO 命令后面的网域名称是否允许其联机,能够使用的过滤功能,包括:reject_invalid_hostname网域名称字符串不符合文法时,拒绝其联机。reject_unknown_hostname网域名称无法从 DNS 查到 A 或 MX 纪录时,拒绝其联机。reject_non_fqdn_hostname网域名称不是完整 FQDN 格式时,拒绝其联机。check_helo_access根据 access 设定过滤存取权限。其它 permit、defer、reject、warn_if_reject、reject_unauth_pipelining 请参考前面的说明。设定范例:smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname信封标头字段过滤此功能用来过滤邮件的信封标头是否符合 RFC 821 之规定,预设是不启用此过滤。因为目前最多人使用的 MUA 是 outlook express,它会使用许多额外的标头来进行邮件控制,例如:大家熟知的要求回复功能,如果启用此参数将使得这些信件被拒绝无法寄出。strict_rfc821_envelopes = yes寄信人过滤此功能并非过滤邮件标头里的寄信人字段,而是过滤 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_domainsmtpd_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_recipientETRN 命令过滤用来过滤哪些网域或哪些客户端,可以使用 ETRN 命令。ETRN 命令用来一次处理大量邮件,当某个客户端使用 ETRN 时,有时候会影响到其它用户寄信的效能,通常只有拨接用户、帮拨接用户转信的 mail gateway、邮件讨论群组(mailing list)或电子报发行站台,需要使用此功能。postfix 的默认值是所有客户端都可以使用 ETRN 命令。能使用的特殊参数只有 check_etrn_access,其余与客户端过滤参数相同,请自行查阅前文。设定范例如下:smtpd_etrn_restrictions = permit_mynetworks, hash:/etc/postfix/etrn_access, reject 伍、效能调校在这一章中,所有未特别说明的参数,都是设定在 main.cf 中!行程限制系统预设行程限制(default_process_limit)为 100,也就是说同时可以收发总共 100 封邮件,如果发现服务器效能很差,可以尝试降低此数值,请修改 master.cf:# ==========================================================================# service type private unpriv  chroot wakeup maxproc command + args#                  (yes)    (yes)    (yes)    (never)  (100)# ==========================================================================    . . .    smtp      inet      n           -               -               -               10               smtpd    . . .以上各字段意义说明如下:service识别名称type服务类型总共有三种:inet、unix、fifo。inet 是指透过网络接口 sockets 提供服务(例如:127.0.0.1:25),unix 指使用 unix sockets 提供服务(直接呼叫执行),fifo 是指使用 pipe name 提供服务(例如:网络传真) 。private切断对外服务,默认值是 yes。注意:inet 类型无法设定成 yes。unpriv不要以 root 身分执行,而是以 $mail_owner 身分执行。默认值是 yes。chroot开启邮件暂存数据夹时,要不要将该数据夹变成根目录,这是为了防止与 postfix 无关的数据夹遭到入侵者以 $mail_owner 身分闯入。默认值是 yes。注意:pipe、virtual 和 local 模块无法设定成 yes。wakeup服务每隔多久唤醒一次,默认值是 0(不唤醒)。只有 pickup、qmgr 和 flush 模块需要设定唤醒周期。maxproc最大执行绪。command + args该服务执行的命令及参数。master.cf 除了控制 postfix 各个模块的运作方式外,也可以加入外挂过滤引擎,postfix 希望透过这个方式与其它程序设计专家合作,后文将介绍两个经常使用的过滤程序 SapmAssassin 以及病毒过滤软件 amavisd + clamav。更详细的内容可以自行到
查看或阅读 /usr/share/doc/postfix-1.xx/README_FILES/FILTER_README!同步处理限制postfix 采用同步处理限制来进行流量调整和控制,当 postfix 寄信到某个邮件主机时,首先传两封信过去(initial_destination_concurrency = 2),如果一切正常则逐步增加每次传送的量,一直到传输失败或者是到达同步上限每次 20 封信(default_destination_concurrency_limit = 20)。如果想要针对不同 agent 来设定同步上限,也可以使用底下的参数(未设定的参数将会沿用 default_destination_concurrency_limit 限制):local_destination_concurrency_limit = 2uucp_destination_concurrency_limit = 2smtp_destination_concurrency_limit = 10收信人限制这是指一封信可以寄给多少人,postfix 预设可以处理 50 个收信人(default_destination_recipient_limit = 50),如果一封信的收信人超过 50 人,postfix 会自动将此信复制成很多份,以 50 人为单位分批寄送。和同步处理限制一样,可以针对不同 agent 来设定不同上限:uucp_destination_recipient_limit = 2smtp_destination_recipient_limit = 10延迟传送当邮件服务器使用拨接线路联机时,由于部分时段处于断线状态,当 postfix 处理信件时会因为无法收发信件,持续产生错误讯息,为了避免发生这个现象,我们可以设定 defer_transports = smtp 来告知 postfix,要从 smtp agent 传送出去的邮件暂时不要传送。这些邮件可以等到上线后,再以 ETRN 指令全部寄出。如果本机是前述邮件服务器的 mail gateway,由于该服务器只有部分时段上线,因此有可能 mail gateway 已经累积许多信件等待传送给它,为了避免 mail gateway 持续尝试传送,可以设定:defer_transport = hold接着在 /etc/postfix/transport 设定:   hold:[] 这个设定的意思是,要给
的邮件先暂存在 ,等待前者上线后再全部传送给它(使用 ETRN 命令)。设定好后,还需修改 master.cf,找到 smtp 行程设定(可参考前面小节),将 smtp 改为 hold 即可:hold   unix   -   -   n   -   -   smtp传送失败处理当邮件传送失败的时候,负责传送邮件的 Agent 会将邮件退回给 qmgr 模块,qmgr 模块则会计算从邮件到达到现在的时间间隔,依此时间间隔将邮件排入延迟传送队列中,以等待下次传送。如果该封邮件传送到一半的时候失败了,也就是说有些收信人有收到,有些没有。这种情况下,除了将该邮件排入延迟传送队列外,也会将传送失败的对象排入 dead 清单一段时间,在这段时间内如果有其它邮件要传送给这些对象时,就会直接排入延迟传送队列,而不用徒劳无功地去尝试传送!底下是有关于邮件传送失败处理的相关效能设定:queue_run_delay = 1000sqmgr 模块每 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 = 1000dead 清单的大小,也就是说第 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 KBheader_size_limit = 102400每封郵件的標頭大小不得超過 100 KBextract_recipient_limit = 10240每封郵件的收信人欄位不得超過 10 KBmessage_size_limit = 每封郵件(包含信封)的大小,不得超過 10 MBqueue_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 = 60sqmgr 每隔 60 秒嘗試驅動 agent 進行分信。 柒、郵件地址改寫機制 vs 相關設定檔當 cleanup 模組進行郵件過濾之前,會先依據各種設定檔呼叫 rewrite 模組,進行郵件地址改寫,這樣做的好處是可以減少標頭欄位的變化,使得過濾快取(請參考 duplicate_filter_limit 的說明)能更有效率的工作。郵件地址改寫的順序如下:將 @hosta,@hostb:user@site 改寫成 user@sitepostfix 不支援前面那種特殊寫法將 site!user 改寫成 user@site將 UUCP 格式改寫為現在使用的地址格式將 user%domain 改寫成 user@domain將 % 符號去掉將 user 改寫成 user@$myorigin從 local 寄出的信會缺少網域名稱,在此補上將 user@host 改寫成 user@host.$mydomain將 hostname 改成 FQDN 型式將 user@site. 改寫成 user@site去掉絕對網域名稱後面的小數點根據各種設定檔改寫郵件地址:alias、canonical、virtual。alias、canonical、virtual 等設定檔是為了達成某些特殊功能而設計的,底下說明這些設定檔的功能以及如何啟用它們:別名對應alias 是 sendmail 最被廣泛使用的一項功能,除了用來對應虛擬信箱外,也可以運用在郵遞清單或郵件討論群組上面,由於 postfix 在這部分完全與 sendmail 相容,因此我們就不再討論它,詳細應用方法請參考
一文。請在 main.cf 中加入這一行,以便啟用 alias:alias_maps = hash:/etc/aliases如果您的系統僅支援 dbm 格式的別名,或是透過 NIS 伺服器查詢別名,請使用底下的參數:alias_maps = dbm:/etc/aliases, nis:mail.aliases全名對應這個設定檔用來建立使用者全名與帳號的關係,例如:shane@mail.spps.tp.edu.tw    shane.lee@mail.spps.tp.edu.tw如果網域名稱,已經設定在 $myorigin、$mydestination 或 $inet_interfaces 中就可以省略不寫,直接使用底下的語法:shane    shane.lee此外這個設定檔還有一個用途,就是當網域遷移時,可以將信件對應到新的網域名稱,例如:@mail.spps.tp.edu.tw    @tp.edu.tw當本機是 mail gateway 時,透過底下的設定可以得知哪些使用者是位於哪一台郵件主機上,分信時會分給該主機,而非分到本機的 /var/spool/mail 中:shane    @stu.spps.tp.edu.tw(帳號相同時)shane    s60101@stu.spps.tp.edu.tw(帳號不同時)當設定檔輸入完成後,必須先將它雜湊成資料庫檔,以 btree 為例(與 sendmail 相容,但效能較差,建議改用 hash):postmap btree:/etc/postfix/canonical    (檔名可隨個人喜好更改)接著在 main.cf 中加入底下這一行:canonical_maps = btree:/etc/postfix/canonical如果只想對應收信人欄位則將該行,取代成:recipient_canonical_maps = hash:/etc/postfix/recipient_canonical如果只想對應寄信人欄位則將該行,取代成:sender_canonical_maps = hash:/etc/postfix/sender_canonical虛擬對應虛擬對應僅能作用在信封裡的收信人欄位,而不會去改寫郵件標頭,與全名對應相比較,虛擬對應的功能只能算是半套。虛擬對應一般應用在兩種場合:一、將收信人欄位中的全名改成帳號名稱,二、虛擬網域對應。想啟用虛擬對應,請在 main.cf 中加入底下這一行:virtual_maps = btree:/etc/postfix/virtual至於虛擬對應的設定方式與全名對應相同,請自行參考前面小節的介紹。使用者遷移當使用者已經不再使用此信箱,而改用其它伺服器提供的信箱時,並無法通知所有的親朋好友,因此仍然會有不知情的寄信人寄信過來,這些郵件到底該如何處理呢?首先使用者可以在自己的家目錄裡,建立 .forward 檔透過這個檔案將郵件轉寄到新的信箱,管理員也可以透過 alias 別名對應幫該名使用者轉信。雖然這樣做很人性化,但也有兩個缺點:一、轉信會增加 postfix 處理郵件的負擔,導致效能降低,二、親朋好友並不知道要把信寄去哪裡才對,所以不斷地麻煩我們!另一種處理的方法是不要替已經搬走的使用者轉信,而直接告訴對方該寄去哪裡才對,如果管理員也不清楚新的郵件地址,直接告訴對方不要再寄信過來也可以,使用這個功能請在 main.cf 加入:relocated_maps = hash:/etc/postfix/relocated/etc/postfix/relocated 的設定範例如下:shane    使用者 shane 已經不再使用此信箱了,請將信寄到 tp.edu.tw 主機,新帳號是 sean!在提示訊息中,我們不使用 @ 符號(sean@tp.edu.tw)是為了避免被信箱收集者賣給廣告商。郵件繞送路由transport_maps 允許我們直接將符合條件的郵件,透過特定的方式,傳送到特定的主機,而不需要依靠 DNS MX 紀錄,譬如前面已經介紹過的延遲傳送機制外(給撥接用戶使用的),要啟用 transport 功能,請在 main.cf 加入:transport_maps = hash:/etc/postfix/transport底下是 transport 設定檔的應用範例,意思是要將寄給 @spps.tp.edu.tw 網域的信件,傳送到 172.16.1.6 這台主機的 8025 port:spps.tp.edu.tw    smtp:[172.16.1.6]:8025應用場合優秀的管理員明白各種設定檔各有職司,就算功能可以互相取代,也不應該混合著用,例如:用全名對應機制作別名對應,用別名對應機制作虛擬對應......這樣作恐怕沒有人可以釐清其邏輯關係,將來要如何維護呢?到底什麼情況下要用哪一種機制來實作呢?筆者給大家的建議是:將寄信人帳號對應成全名sender_canonical_maps = hash:/etc/postfix/sender_fullname將收信人全名對應成帳號virtual_maps = hash:/etc/postfix/recipient_loginname網域名稱遷移canonical_maps = hash:/etc/postfix/domain_canonical使用者遷移relocated_maps = hash:/etc/postfix/relocated將寄給本機帳號的信件分到其它伺服器canonical_maps = hash:/etc/postfix/individual_user將寄給虛擬網域的郵件轉給真實存在的網域virtual_maps = hash:/etc/postfix/virtual_domain讓使用者登入後能改用虛擬信箱寄信smtpd_sender_login_maps = hash:/etc/postfix/unaliases將寄給虛擬信箱的郵件轉給真實存在的使用者alias_maps = hash:/etc/aliases將郵件導向某台郵件過濾或掃毒主機transport_maps = hash:/etc/postfix/transport 捌、SpamAssassinSpamAssassin 是一套用來協助過濾垃圾郵件的程式,它會針對信件中特定的比對樣式給予不同的分數,當分數超過指定的值後,該封郵件就會被當作垃圾郵件處理,處理方式依據設定的不同,會在信件標頭或郵件主旨欄位加入警告訊息。SpamAssassin 必須結合 MTA 來使用,單獨執行並不能發揮其功效,由於該程式是使用 perl 語言開發,因此如果剛開始安裝 Linux 作業系統時沒有一併安裝,事後要補裝有一點小麻煩,安裝所需的套件如下(省略版次號碼,請自行按 TAB 補字,依順序安裝),這些 RPM 檔案可以從 RedHat 光碟取得:perlperl-Time-HiResperl-Digest-HMACperl-Net-DNSspamassassin安裝好之後,請以下列指令啟動 spamd:service spamassassin start並將該服務設定為開機自動執行:chkconfig --level 3,5 spamassassin on請用底下指令,測試程式能否成功執行:spamc -c & /var/mail/username假設該使用者信箱已經有至少一封郵件,這時 spamc 程式會將該郵件傳送給 spamd(127.0.0.1:783)進行評分,如果執行成功應該會看到 SpamAssassin 的評分,例如:3.5/5.0讓 postfix 使用 SpamAssassin 過濾郵件確定 SpamAssassin 可以正常執行之後,接著設定 /etc/postfix/master.cf,請修改 smtp deamon 服務的設定:smtp inet ............中間五個欄位不用修改............. smtpd -o content_filter=spamfilter: 這一行的意思是要求 smtpd 在進行完郵件過濾後,透過 spamfilter 服務進行郵件全文過濾,因此我們還得定義 spamfilter 這個服務(服務名稱可以自行修改):spamfilter    unix    -    n    n    -    100    pipe  flags=Rq user=nobody  argv=/usr/sbin/spamc.sh -f ${sender} -- ${recipient}這裡定義 spamfilter 服務使用 unix socket 執行,最多同時進行 100 封信的過濾(如果記憶體不足請自行修改數量),過濾方式是透過 pipe 模組以 nobody 身分啟動 /usr/sbin/spamc.sh ,並且將目前佇列中的郵件其資料結構中的 sender 和 recipient 參數讀出來,連同 -f 參數傳遞給 spamc.sh 當作參數。旗號 R 表示要把信封中的寄信人地址,以 Return-Path: 標頭插入郵件中。旗號 q 表示參數中的特殊字元要用單引號括住,以避免被當成控制字元處理,在這個例子中用來避免郵件地址中的 @ 符號被當成控制字元。接著我們還得自己寫一支小小的 shell script,底下就是 /usr/sbin/spamc.sh 的內容(這個檔案須自己建立,之所以放在 /usr/sbin/ 是因為這個資料夾的權限比較嚴格,也比較安全):#!/bin/sh/usr/bin/spamc -t 30 -e /usr/sbin/sendmail -i &$@&不要忘記將該程式的檔案權限改成 755。pipe 模組傳遞參數給上面這支程式時,會將整封郵件的內容放在鍵盤的 input 佇列中,所以我們使用 sendmail -i 這道指令將郵件從 input 佇列讀進來,&$@& 會被 spamc.sh 的參數巨集取代,也就是說 &$@& 會變成 -f sender@sender.domain -- recipient@recipient.domain這個字串將當成參數傳遞給 sendmail 程式,意思是要 sendmail 把參數傳遞進來的「寄信人地址 -- 收信人地址」寫在信封的寄信人欄位裡。 mail from: 與 rcpt to: 原始參數的取得,是由 smtpd 於建立 SMTP 連線時,將該字串擷取出來放在郵件佇列的資料結構中,當 master 喚醒 spamfilter 服務時,透過 pipe 當白手套,把郵件資料結構中的字串傳遞給 spamc.sh 再傳遞給 sendmail。透過這些程式的接力表演,現在終於可以把這兩個參數當作過濾的鍵值。附帶一提:如果本機沒有安裝 SpamAssassin,想要透過別台主機安裝好的 SpamAssassin,這時候可以修改 spamc.sh:/usr/bin/spamc -d 172.16.1.6 -p 783 -t 30 -e /usr/sbin/sendmail -i &$@&使用這個方法前,請先確認從本機到過濾主機之間的防火牆已經放行 783 port。刪除可疑的垃圾郵件SapmAssassin 發現垃圾郵件的可疑對象時,會加入一個郵件標頭,至於要不要把信刪除,則不關它的事。我們可以透過 header_checks 機制(前參照第肆章 UCE 過濾的說明)把具有 SPAM 標頭的郵件刪除,然而這樣做是有風險的,萬一有些普通信件因為長得太像垃圾信而被標示為  SPAM,那就會一起被刪除!如果你真的想刪除可疑郵件,請修改 main.cf 設置下列參數:header_checks = pcre:/etc/postfix/header-checks找到 /etc/postfix/header-checks 檔案,如果檔案不存在請自己建立,加入底下這一行:/^X-Spam-Flag: Yes/    DISCARD 垃圾郵件經驗學習法SpamAssassin 判斷一個檔案是否為垃圾郵件,是透過郵件特徵比對 hits 比率(原理有點像 proxy server),也就是說必須使用一段時間後,才能從經驗中學習到哪些郵件內容反覆不斷出現,而要學會哪些郵件是垃圾郵件,最有效的方法是透過一個垃圾信箱來學習,首先我們建立一個沒人使用的信箱,接著以此信箱為名義在 news server 上發表測試文章。等幾天後,很快的就有一大堆垃圾信湧入該信箱,現在我們只要把信餵給 SpamAssassin 就行了,底下是透過 alias 來餵信:fakeuser: &| /usr/bin/spamassassin -r -w fakeuser&上面這個範例中,指令參數 -r 的意思是要 SpamAssassin 把所有郵件的寄信人信箱當成垃圾信的樣板,從此以後符合此樣板的郵件都會被認為是垃圾信。-w fakeuser 是一個非必要參數,SpamAssassin 將會以 fakeuser 信箱的名義寄警告信給對方,但是因為對方使用偽裝過的信箱,因此也沒有人會收到警告信,寄了也是白寄,建議不要使用此功能。除了透過 alias 可以餵信給 SpamAssassin 外,我們也可以利用 .forward 來餵信,請在 fakeuser 的家目錄建立此檔案,檔案內容如下:| /usr/bin/spamassassin -r -w fakeuser決定 SPAM 過濾門檻SpamAssassin 根據郵件比對的得分高低,來決定該郵件是否為垃圾信,預設值是 5 分,建議修改為 9 分。請修改 /etc/mail/spamassassin/local.cf:required_hits 9.0白名單與黑名單SapmAssassin 維護一個郵件資料庫,該資料庫將透過自動學習機制來增減郵件的分數,分數高於門檻的稱之為黑名單,分數低於門檻的稱之為白名單,一旦某種特徵的郵件被評為黑名單,以後該信箱寄出的郵件都會被認為是垃圾郵件,雖然自動學習機制對於主動發現垃圾郵件很有用,但難免也有誤判的時候,這個時候我們可以透過以下命令來調整:/usr/bin/spamassassin -W & message將該郵件加入白名單/usr/bin/spamassassin --add-to-blacklist & message將該郵件加入黑名單/usr/bin/spamassassin -R & message將該郵件移出白名單/usr/bin/spamassassin --add-addr-to-whitelist=mailbox將該信箱加入白名單/usr/bin/spamassassin --add-addr-to-blacklist=mailbox將該信箱加入黑名單/usr/bin/spamassassin --remove-addr-from-whitelist=mailbox將該信箱移出白名單當某個信箱被誤判為垃圾郵件,這時我們可以直接將該信箱加入白名單,例如:/usr/bin/spamassassin --add-addr-to-whitelist=shane@mail.spps.tp.edu.tw該信箱一旦加入白名單後,只能以手動方式移出或重新加入黑名單。如果要把具有某種特徵的郵件加入白名單(例如:校內郵件討論群組、校園電子報、網站更新通知......等,這類郵件經常被視為垃圾郵件),請先將該封郵件另存成純文字檔,接著將該信餵給 SapmAssassin 即可,請使用底下指令:/usr/bin/spamassassin -W & myletter.eml 玖、amavisd-new + clamavamavisd 用來將病毒過濾功能提供給郵件伺服器,和 SpamAssassin 一樣也是用 perl 開發的,而新版的 amavisd-new 更結合了 SpamAssassin 和許多額外設定,透過 perl NEt::Server 模組提供類似 Apache prefork 模式的效能,可以應付 ISP 龐大的郵件處理量。也就是說,使用了 amavisd-new 就不需要再去作前一章提到的 SpamAssassin 相關設定,同時也可以根據自己的需求來制定執行緒的數量。clamav 是一套免費的病毒過濾引擎,使用者不須註冊就可以透過病毒更新程式自動更新病毒碼,而且病毒碼的維護也很迅速,每天至少會更新一次。clamav 主要用來應付硬碟檔案的掃毒工作,它可以因應硬碟 IO 動作即時監控掃毒,也可以排程進行資料夾掃描,但它卻無法與各種伺服器結合一起運作,這也就是為什麼我們需要 amavisd 的原因。更精確的說,amavisd 只是將現成的掃毒功能提供給郵件伺服器而已,它自己並不會掃毒。設定 clamav在這裡我們將只介紹 clamav 的安裝程序,並不打算詳細介紹 clamav 的各種功能和使用方法,有興趣的學員可以自行到 clamav 的官方網站
查看詳細的內容。首先請,使用底下指令進行安裝:rpm -Uvh clamav-*安裝完成後,可以使用 man clamd 來查看詳細介紹,請使用 ntsysv 或底下指令將 clamav 設定為開機時自動啟動:chkconfig --level 3,5 clamd on手動啟動 clamav 的方式和其它的服務一樣:service clamd start要更新病毒碼可以使用 freshclam 指令,如果要讓它自動更新,則可以加以下參數(意思是每天檢查更新兩次):freshclam -d -c 2freshclam 也是一個 deamon ,因此我們可以使用 ntsysv 或底下指令將它設定為開機時自動啟動:chkconfig --level 3,5 freshclam on在網路上可以找到
發展計畫,該計畫以 GPL 精神來整合 Linux 平台上的各種掃毒引擎,clamav 只是其中之一,其它發展中的計畫還包括:mod_vscan(在 Apache 上掃毒)、squid_vscan(在 Proxy 上掃毒)、amavisd(在 Mail 上掃毒)、pop3_vscan(在 iptables 防火牆上直接掃掉郵件病毒),有興趣的學員不妨去逛一逛。安裝 amavisd-newamavisd-new 的原始套件可以在
取得,或。這個套件與 perl 模組的依存性很高,安裝異常複雜,開發者也未提供自動安裝程序,僅有一份簡要說明,使用開發者建議的方式裝,會因為 CPAN.pm 模組與特定模組有相依性的問題,導致某些特定模組安裝失敗,即使能成功安裝完成,也須自行修改 amavisd 原始程式碼,同時也無法將執行程序自動化,為了避免麻煩,請按照底下筆者的建議來安裝,安裝方式如下:安裝 amavisd 之前,請用底下指令先安裝 CPAN:perl -MCPAN -e 'install CPAN';安裝 cpan 時,會問一大堆問題,通通按 Enter 就可以了,一直到出現底下問題:(1) Africa(2) Asia(3) Central America(4) Europe(5) North America(6) Oceania(7) South AmericaSelect your continent (or several nearby continents) [] 問所在地區,請選 2(1) China(2) Indonesia(3) Israel(4) Japan(5) Malaysia(6) Philippines(7) Republic of Korea(8) Russian Federation(9) Saudi Arabia(10) Singapore(11) Taiwan(12) ThailandSelect your country (or several nearby countries) [] 問所在國家,請選 11(1) ftp://cpan.cdpa.nsysu.edu.tw/pub/CPAN(2) ftp://ftp.isu.edu.tw/pub/CPAN(3) ftp://ftp.nctu.edu.tw/UNIX/perl/CPAN(4) ftp://ftp.tku.edu.tw/pub/CPAN/(5) ftp://ftp1.sinica.edu.tw/pub1/perl/CPAN/Select as many URLs as you like,put them on one line, separated by blanks [] 問最近的映射站台,請選 5(中研院)剩下的其餘問題全部按 Enter 即可 CPAN 裝好後,請先將剛才下載回來的 amavisd tarball 解壓縮:tar xzvf amavisd-new-&TAB補字& 切換目錄到解開的資料夾:cd amavisd-new* 測試所需套件是否已經安裝:./amavisd debug 回應訊息如下(由於每台機器已安裝的 perl 模組不一樣多,因此底下訊息僅供參考):ERROR: MISSING REQUIRED BASIC MODULES:Time::HiResIO::WrapIO::StringyUnix::SyslogMail::FieldMail::AddressMail::HeaderMail::InternetMIME::WordsMIME::HeadMIME::BodyMIME::EntityMIME::ParserNet::ServerNet::Server::PreForkSimpleMIME::Decoder::Base64MIME::Decoder::BinaryMIME::Decoder::Gzip64MIME::Decoder::NBitMIME::Decoder::QuotedPrintMIME::Decoder::UUBEGIN failed--compilation aborted at ./amavisd line 123. 使用 cpan 指令安裝缺少的模組,例如:cpan Time::HiRes 由於某些模組可能被包在一起,安裝時會一併裝好,所以每安裝好一個就應該回頭來檢視一下,還剩哪些模組需要安裝,請再一次執行:./amavisd debug 反覆步驟 6~7 一直到出現其它錯誤訊息為止(假如很不幸剛好有的話!)例如:Can't locate Convert/TNEF.pm in @INC (@INC contains: /usr/lib/perl5/5.8.0/i386.........(略)BEGIN failed--compilation aborted at ./amavisd line 3525. 這也是相依套件沒裝好造成的(amavisd debug 模式沒發現此問題,而是由 perl 編譯器發現的),處理方式與前面相仿,只是要特別注意錯誤訊息中的 Convert/TNEF.pm 檔案,在進行安裝時要寫成:cpan Convert::TNEF 反覆執行 ./amavisd debug 一直到出現底下錯誤訊息為止find_program_path: relative paths not implemented: ./amavisd perl 模組的安裝到此已經完成,接下來就是建立服務帳號及相關目錄,這部分的工作可以透過筆者自行開發的安裝程式來作,請,將該程式放在解開的 amavisd-new* 資料夾中並執行:chmod 755 install.sh./install.sh 安裝完成後,amavisd 會自動被設定為開機啟動,你可以使用 ntsysv 或 chconfig 指令來修改啟動設定,也可以手動控制:service amavisd start 安裝外掛延伸套件雖然在前面已經將 amavisd 裝好,也可以運作了,但考量到掃毒成效,某些延伸套件也不得不安裝,舉例來說:有人把中毒的檔案壓縮後再寄出,假如沒有安裝解壓縮引擎,那豈不是掃不到病毒。要知道掃毒是透過病毒特徵的比對,一個被壓縮過的檔案,病毒特徵都消失了,當然就比對不出來!因此要讓 amavisd 發揮最大的掃毒效益,就必須安裝各種解壓縮軟體,底下是各種 Linux 版的解壓縮程式(非 RH 9.0 的使用者請下載 Tarball 安裝),你可以連到
下載,或點選下列的超連結:壓縮格式官方網站下載filecompress無gzipbzip2nomarcharc無lhaunarj無arj rar, unrar, zoo cpiolzop freeze無除了檔案壓縮部分的外掛套件外,如果希望讓 amavisd 幫我們管理 SpamAssassin,請使用 cpan 指令安裝該套件的 perl 模組,指令如下:cpan Mail::SpamAssassin如果想要利用 SQL 資料庫來存取中毒或垃圾郵件的黑、白名單,還必須安裝 DBD::DBI,這並不是一個模組,而是一群 perl 模組,你必須根據你使用的資料庫系統來挑選安裝,例如:mysql:cpan DBD::mysql如果要針對不同的使用者帳號進行不同的過濾規則設定,而使用者帳號是透過 LDAP 提供,你還必須安裝底下的模組:cpan Net::LDAP當然以上談到的三個外掛套件: SpamAssassin、mysql、openldap,也必須安裝才行,並不是只裝 perl 模組就可以運作,由於以上三個功能是針對 ISP 的需求而開發,校園內應該還用不上,所以不去理會也就算了!外掛掃毒引擎amavisd 支援 21 種掃毒軟體(包含前面介紹過的 clamav),其中大多數都是商業軟體,包括國內知名的趨勢科技和美國的賽門鐵克公司(當然得買 Linux 版,Windows 版的授權並不通用),因此在這裡我們就不介紹了!修改 amavisd.confamavisd 的設定分為底下八個部分,說明如下:Essential daemon and MTA settingsamavisd deamon 的基本設定以及指定使用何種 Mail server,需要手動修改的就是這個部分。MTA specificSMTP 通訊協定相關設定,使用預設值即可。Logging系統日誌設定,使用預設值即可。Notifications/DSN, BOUNCE/REJECT/DROP/PASS destiny, quarantine訂定郵件過濾政策,包括:郵件格式設定、警告訊息、中毒和垃圾郵件之處理......等等,請依需要修改,使用預設值也無妨(中毒時只警告不刪除)。Per-recipient and per-sender handling, whitelisting, etc.訂定中毒及垃圾郵件黑、白名單管理政策,是否要透過資料庫存取、特定網域或信箱排外處理......等等,不是 ISP 應該用不到,所以我們不去理會它!Resource limits系統資源限制,請依據自己的硬體設備等級來調整,原則上盡量調高效能才會好!(但會影響其它服務的效能)。External programs, virus scanners, SpamAssassin外掛套件的設定,由於程式會自動偵測,所以使用預設值就可以了!Debugging設定 debug 模式啟用時機,預設是不啟用。在第一個部分一定得設定的有底下這些參數:$MYHOME = '/var/a
有美一人,清扬婉兮。邂逅相遇,适我愿兮。这是《诗经》里的吟唱邂逅爱情的感觉。千百年过去了,人们依然在等待这种邂逅
赵咏华的一首老歌《早餐》里唱到:“心情特别好的早上,提前半个小时起床,为心爱的人做顿早餐,要他把我的爱一口一口吃完。”—...
mydarlingliling
小马发光520
请注意使用文明用语
文章总数:0
画报总数:0
画报点击数:0
文章点击数:0

我要回帖

更多关于 游戏延迟不稳定 的文章

 

随机推荐