转载编辑自金豆的博客http://blog.sina.com.cn/iwjbhttp://blog.sina.com.cn/iwjb原文地址 链接http://blog.sina.com.cn/s/blog_4c1541be0100chtr.htmlhttp://blog .sina.com.cn/s/blog_4c1541be0100chtr.htmlpostfix的配置文件结构postfix的配置 文件位于/etc/postfix下,安装完postfix以后,我们可以通过ls命令查看postfix的配置文件:[root@mai lpostfix]#lsinstall.cfmain.cfmaster.cfpostfix-script这四个文件就是p ostfix最基本的配置文件,它们的区别在于:mail.cf:是postfix主要的配置文件。install.cf:包含安装过程中 安装程序产生的postfix初始化设置。master.cf:是postfix的master进程的配置文件,该文件中的每一行都是用来 配置postfix的组件进程的运行方式。postfix-script:包装了一些postfix命令,以便我们在linux环境中安全 地执行这些postfix命令。postfix的基本配置postfix大约有100个配置参数,这些参数都可以通过main.cf指定 。配置的格式是这样的,用等号连接参数和参数的值。如:myhostname=mail.mydomain.com等号的左边是参数的 名称,等号的右边是参数的值;当然,我们也可以在参数的前面加上$来引用该参数,如:myorigin=$myhostname虽然 postfix有100个左右的参数,但是postfix为大多数的参数都设置了缺省值,所以在让postfix正常为你服务之前,你只需 要配置为数不多的几个参数。下面我们一起来看一看这些基本的postfix参数。需要注意的是,一旦你更改了main.cf文件的内容,则 必须运行postfixreload命令使其生效。myoriginmyorigin参数指明发件人所在的域名。如果你的用户的邮件地址 为user@domain.com,则该参数指定@后面的域名。缺省地,postfix使用本地主机名作为myorigin,但是建议你最 好使用你的域名,因为这样更具有可读性。比如:安装postfix的主机为mail.domain.com则我们可以这样指定myorig in:myorigin=domain.com当然我们也可以引用其他参数,如:myorigin=$mydomain?myde stinationmydestination参数指定postfix接收邮件时收件人的域名,换句话说,也就是你的postfix系统要 接收什么样的邮件。比如:你的用户的邮件地址为user@domain.com,也就是你的域为domain.com,则你就需要接收所 有收件人为user@domain.com的邮件。与myorigin一样,缺省地,postfix使用本地主机名作为mydestina tion。如:mydestination=$mydomainmydestination=domain.comnotify_ classes在postfix系统中,必须指定一个postfix系统管理员的别名指向一个用户,只有这样,在用户遇到问题时才有报告的 对象,postfix也才能将系统的问题报告给管理员。notify_classes参数就是用来指定向postfix管理员报告错误时的 信息级别。共有以下几种级别:?bounce:将不可以投递的邮件的拷贝发送给postfix管理员。出于个人隐私的缘故,该邮件的拷贝不 包含信头。?2bounce:将两次不可投递的邮件拷贝发送给postfix管理员。delay:将邮件的投递延迟信息发送给管理员,仅仅 包含信头。policy:将由于UCE规则限制而被拒绝的用户请求发送给postfix管理员,包含整个SMTP会话的内容。protoc ol:将协议的错误信息或用户企图执行不支持的命令的记录发送给postfix管理员。同样包含整个SMTP会话的内容。resource :将由于资源错误而不可投递的错误信息发送给postfix管理员,比如:队列文件写错误等等。?software:将由于软件错误而导致 不可投递的错误信息发送给postfix管理员。缺省值为:notify_classes=resource,softwaremy hostnamemyhostname参数指定运行postfix邮件系统的主机的主机名。缺省地,该值被设定为本地机器名。你也可以指 定该值,需要注意的是,要指定完整的主机名。如:myhostname=mail.domain.com?mydomainmydom ain参数指定你的域名,缺省地,postfix将myhostname的第一部分删除而作为mydomain的值。你也可以自己指定该值 ,如:mydomain=domain.commynetworksmynetworks参数指定你所在的网络的网络地址,post fix系统根据其值来区别用户是远程的还是本地的,如果是本地网络用户则允许其访问。你可以用标准的A、B、C类网络地址,也可以用CID R(无类域间路由)地址来表示,如:192.168.1.0/24192.168.1.0/26inet_interfacesinet_ interfaces参数指定postfix系统监听的网络接口。缺省地,postfix监听所有的网络接口。如果你的postfix运 行在一个虚拟的ip地址上,则必须指定其监听的地址。如:inet_interfaces=allinet_interface= 192.168.1.1postfix的UCE(unsolicitedcommercialemail)控制所谓UCE控制就是指控 制postfix接收或转发来自于什么地方的邮件。缺省地,postfix转发符合以下条件的邮件:来自客户端ip地址符合$myne tworks的邮件。来自客户端主机名符合$relay_domains及其子域的邮件。目的地为$relay_domains及 其子域的邮件。缺省地,postfix接受符合以下条件的邮件:目的地为$inet_interfaces的邮件。目的地为$my destination的邮件。目的地为$virtual_maps的邮件。但是我们也可以通过下面的规则来实现更强大的控制功能。信 头过滤通过header_checks参数限制接收邮件的信头的格式,如果符合指定的格式,则拒绝接收该邮件。可以指定一个或多个查询列表 ,如果新邮件的信头符合列表中的某一项则拒绝该接收邮件。如:header_checks=regexp:/etc/postfix/ header_checksheader_checks=pcre:/etc/postfix/header_checks缺省地,p ostfix不进行信头过滤。客户端主机名/地址限制通过smtpd_client_restrictions参数限制可以向postfi x发起SMTP连接的客户端的主机名或ip地址。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符 合条件的规则被执行。可用的规则有:reject_unknown_client:如果客户端的ip地址在DNS中没有PTR记录则拒绝转 发该客户端的连接请求。可以用unknown_client_reject_code参数指定返回给客户机的错误代码(缺省为450)。如 果你有用户没有作DNS记录则不要启用该选项。permit_mynetworks:如果客户端的ip地址符合$mynetworks参数 定义的范围则接受该客户端的连接请求,并转发该邮件。check_client_accessmaptype:mapname:根据客户 端的主机名、父域名、ip地址或属于的网络搜索access数据库。如果搜索的结果为REJECT或者"[45]XXtext"则 拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY或数字则接受该客户端的连接请求,并转发该邮件。。可以用access_ma p_reject_code参数指定返回给客户机的错误代码(缺省为554)。reject_maps_rbl:如果客户端的网络地址符合 $maps_rbl_domains参数的值则拒绝该客户端的连接请求。可以用maps_rbl_reject_code参数指定返回给客 户机的错误代码(缺省为554)。示例:smtpd_client_restrictions=hash:/etc/postfix/ access,reject_maps_rblsmtpd_client_restrictions=permit_mynetwo rks,reject_unknown_client该参数的缺省值为:smtpd_client_restrictions=也即接 收来自任何客户端的SMTP连接。是否请求HELO命令可以通过smtpd_helo_required参数指定客户端在SMTP会话的开 始是否发送一个HELO命令。你可以指定该参数的值为yes或no。缺省值为:smtpd_helo_required=noHELO 主机名限制可以通过smtpd_helo_restrictions参数指定客户端在执行HELO命令时发送给postfix的主机名。缺 省地,postfix接收客户端发送的任意形式的主机名。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第 一条符合条件的规则被执行。可用的规则有:reject_invalid_hostname:如果HELO命令所带的主机名参数不符合语法 规范则拒绝客户机的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为5 01)。permit_naked_ip_address:RFC要求客户端的HELO命令包含的ip地址放在方括号内,你可以用per mit_naked_ip_address参数取消该限制。因为有的mail客户端不遵守该RFC的规定。reject_unknown_ hostname:如果客户端执行HELO命令时的主机名在DNS中没有相应的A或MX记录则拒绝该客户端的连接请求。可以用inv alid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为450)。reject_non_fqdn_ hostname:如果客户端执行HELO命令时的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用invalid_ho stname_reject_code参数指定返回给客户机的错误代码(缺省为504)。check_helo_accessmapty pe:mapname:根据客户端HELO的主机名、父域名搜索access数据库。如果搜索的结果为REJECT或者"[45]XX text"则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY或数字则接受该客户端的连接请求。可以用access_ma p_reject_code参数指定返回给客户机的错误代码(缺省为554)。示例:smtpd_helo_restrictions= permit_mynetworks,reject_invalid_hostnameRFC821信头限制RFC821对邮件的 信头做了严格的规定,但是广泛使用的sendmail并不支持该规定,所以对于该参数我们只能说不,即:strict_rfc821_en velopes=no通过发件人地址进行限制可以用smtpd_sender_restrictions参数通过发件人在执行MAIL FROM命令时提供的地址进行限制。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则 被执行。可用的规则有:reject_unknown_sender_domain:如果MAILFROM命令提供的主机名在DNS中没 有相应的A或MX记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户 机的错误代码(缺省为450)。check_sender_accessmaptype:mapname:根据MAILFROM命令提 供的主机名、父域搜索access数据库。如果搜索的结果为REJECT或者"[45]XXtext"则拒绝该客户端的连接请求; 如果搜索的结果为OK、RELAY或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给 客户机的错误代码(缺省为554)。可以通过该参数过滤来自某些不受欢迎的发件人的邮件。reject_non_fqdn_sender: 如果MAILFROM命令提供的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用non_fqdn_reject_co de参数指定返回给客户机的错误代码(缺省为504)。缺省地,postfix接受来自任何发件人的邮件。示例:smtpd_sende r_restrictions=hash:/etc/postfix/access,reject_unknown_sender_ domain通过收件人地址进行过滤可以用smtpd_recipient_restrictions参数通过发件人在执行RCPTTO 命令时提供的地址进行限制。缺省值为:smtpd_recipient_restrictions=permit_mynetwork s,check_relay_domains可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条 件的规则被执行。可用的规则有:check_relay_domains:如果符合以下的条件,则接受SMTP连接请求,否则拒绝该连接, 可以用relay_domains_reject_code参数指定返回给客户机的错误代码(缺省为504)。客户端主机名符合$ relay_domains及其子域目的地为$inet_interfaces、$mydestination或$virtual_m apspermit_auth_destination:不管客户端的主机名,只要符合以下的条件,就接受SMTP连接请求:解析后的 目标地址符合$relay_domains及其子域解析后的目标地址符合$inet_interfaces、$mydestinati on或$virtual_mapsreject_unauth_destination:不管客户端的主机名,只要符合以下的条件,就拒绝 该客户端SMTP连接请求:解析后的目标地址符合$relay_domains及其子域解析后的目标地址符合$inet_inte rfaces、$mydestination或$virtual_mapscheck_recipient_access:根据解析后的目 标地址、父域搜索access数据库。如果搜索的结果为REJECT或者"[45]XXtext"则拒绝该客户端的连接请求;如果 搜索的结果为OK、RELAY或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户 机的错误代码(缺省为554)。reject_unknown_recipient_domain:如果收件人的邮件地址在DNS中没有相 应的A或MX记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的 错误代码(缺省为450)。reject_non_fqdn_recipient:如果发件人在执行RCPTTO命令时提供的地址不是完 整的域名则拒绝其SMTP连接请求。可以用Thenon_fqdn_reject_code参数指定返回给客户机的错误代码(缺省为50 4)。posftfix的性能控制之所以对postfix的性能进行控制,是为了在遇到邮件风暴时保证postfix可以正常运行。通常, 我们可以通过对下列postfix参数的配置来调节postfix的性能,这些参数都是通过mail.cf配置文件进行配置的,修改以后不 要忘了运行postfixreload命令来使配置生效。进程数限制可以通过default_process_limit参数来控制p ostfix系统同时可以运行的最大进程数目。缺省值是50个。对同一目标主机的并发连接限制当向同一目标主机发出SMTP连接时,pos tfix初始化发出两个SMTP连接,如果投递成功则增加并发的SMTP连接数目,遇到拥塞时又减少并发连接的数目。postfix中通过 以下的参数对同一目标主机的并发连接进行控制:initial_destination_concurrency:控制对同一目标主机 的初始化并发连接数目。缺省值为2。default_destination_concurrency_limit:控制初始化连接后 对同一目标主机的最大并发连接数目。缺省值为10。local_destination_concurrency_limit:控制对 同一本地收件人的最大同时投递的邮件数目。缺省值为2,因为对本地同一收件人投递邮件时投递工作只能一个接一个的进行,所以设得在大也没用 。对同一封邮件的收件人数目限制通过default_destination_recipient_limit参数来控制postfix的 投递代理(如smtp进程)可以将同一封邮件发送给多少个收件人。缺省值为50。也可以用明确指出该投递代理的参数来覆盖该缺省值。如用s mtpd_recipient_limit来指定smtp投递代理可以将同一封邮件发送给多少个收件人,该参数的缺省值为1000。推迟投 递控制通过defer_transports参数,我们可以推迟投递该参数指定的邮件直到postfix明确的提出投递要求。下面我们看一 个例子:有一个小型的局域网,用户都将邮件发送给局域网内部的一台postfix邮件服务器,然后通过在该服务器上拨号将邮件发送出去。这 时我们可以这样指定该参数的值:defer_transports=smtp该语句表示postfix推迟投递所有的邮件直到执行se ndmail-q命令,这样我们就可以在ppp的脚本中加上sendmail-q,以便在拨号成功后让postfix开始投递邮件。关 于延迟邮件的再投递控制可以通过以下的几个参数实现对延迟邮件的再投递控制:queue_run_delay:设置队列管理进行扫描def erred邮件队列的频率,缺省值为1000秒。maximal_queue_lifetime:设置postfix在放弃投递而返回不可 投递信息前,被延迟邮件再deferred邮件队列中的生存时间。minimal_backoff_time:当一封邮件投递失败后,邮件 队列将在一段时间内忽视该邮件的存在,也就是我们前面讲的时间邮票。该参数就是用来设置最小的时间邮票。缺省值为1000秒。maxima l_backoff_time:设置最大的时间邮票。对拒绝服务攻击的处理postfix对每一个SMTP会话都设置一个错误计数器,当该 客户端的请求未被接受或违反那UCE规则时,该计数器就增1。随着计数器的增加,postfix将采取不同的措施来防止恶意用户的拒绝服务 攻击。smtpd_error_sleep_time:当该错误计数器的值还很小时,postfix将暂停smtpd_error_sle ep_time指定的时间,然后向客户端报告一个错误。该参数的缺省值为5秒。smtpd_soft_error_limit:当错误计数 器的值超过该参数指定的值时,postfix在响应该客户端请求前将沉睡一段时间。缺省值为10。smtpd_hard_error_li mit:当错误计数器的值超过该参数指定的值时,postfix中断同该客户端的连接。缺省值为100。postfix对使用资源的控制通 过特定的postfix配置参数,我们可以实现postfix运行时对所消耗的资源的灵活控制。可以通过以下几个方面来控制postfix 消耗的资源:限制内存中的对象的大小要控制对内存资源的消耗,必须控制内存中对象的大小。可以用以下的参数来进行对象大小的控制:line _length_limit:控制读入数据时每一行的大小,如果太长则强行将其分割成更短的行,太长的行在投递时再重组。缺省值为2048 bytes。header_size_limit:限制信头长度。缺省值为102400bytes。message_size_limi t:限制postfix队列文件的大小。缺省值为10240000bytes。queue_minfree:邮件队列中可用的空间大小。 缺省为无限制。建议该值最好时message_size_limit的数倍以便于处理大邮件。bounce_size_limit:限制某 一邮件不可投递时,返回给发件人不可投递报告的大小,缺省值为50000bytes。限制内存中对象的数目qmgr_message_r ecipient_limit:设置内存中收件人地址的最大数目。缺省值为10000。qmgr_message_active_limi t:设置active邮件队列中邮件数目的最大值。缺省值为1000。duplicate_filter_limit:设置需要local 和cleanup后台程序记住的收件人地址的最大数目。缺省值为1000。限制等待一个外部命令完成的时间command_time_li mit:设置local程序等待一个外部命令完成的时间。缺省值为1000秒。限制文件锁定的操作时间deliver_lock_atte mpts:设置锁定一个文件的最大尝试次数。缺省值为5次。deliver_lock_delay:设置如果锁定一个文件失败后再次尝试的 等待时间,缺省值为1秒。控制错误恢复在某些情况下(如高负载),postfix的某个进程可能会死掉,这时master进程会试图重新启 动该进程,我们可以通过下面的参数来控制这种行为:fork_attempts:试图重启动一个进程的最大尝试次数。缺省值为5次。for k_delay:每两次尝试之间的等待时间,缺省值为1秒。transport_retry_time:队列管理进程每两次尝试连接一个不 正常的投递代理进程之间的等待时间。缺省为60秒。postfix中的地址操作将地址改写为标准格式在cleanup进程进行表查询之前, 它首选请求trivial-rewrite进程将新邮件地址改写成标准的user@fully.qualified.domain格式。改 写的目的是为了减少查询表中的条目,从而提供查询的效率。trivial-rewrite进程可以实现以下的地址改写:将包含源路由信 息的地址如@hosta,@hostb:user@site写成user@site,因为postfix不支持包含源路由信息的地址格式。 将形如user%domain的地址改写成mailto:user@domainuser@domain的形式。该特性可通过allo w_percent_hack参数进行控制,其缺省值为yes。将只包含user的地址改写成mailto:user@$myorig inuser@$myorigin。该特性可通过append_at_myorigin参数进行控制,其缺省值为yes。最好不要改动其缺 省值,因为大多数的postfix进程更擅长处理地址形如mailto:user@$myoriginuser@$myorigin的邮件 。将形如mailto:user@hostuser@host的地址改写成mailto:user@host.$mydomainus er@host.$mydomain。该特性可通过append_dot_mydomain参数进行控制,其缺省值为yes。将形如m ailto:user@siteuser@site.的地址改写成mailto:user@siteuser@site,也即除去了最后 的点号。规范地址映射在cleanup进程将一封新邮件存入incoming邮件队列之前,cleanup进程将根据查询规范表来进行地址 改写,从而使之更具可读性。主要是替换形如firstname.lastname风格的地址以及清除无效的域。缺省postfix是不进 行规范地址改写的,你可以通过指定canonical_maps参数的值来使其生效。如:canonical_maps=hash:/ etc/postfix/canonical也可以分别为收件人和发件人地址分别指定不同的改写规范,这时参数sender_canoni cal_maps和recipient_canonical_maps的优先级比canonical_maps高。如:sender_ca nonical_maps=hash:/etc/postfix/sender_canonicalrecipient_canoni cal_maps=hash:/etc/postfix/recipient_canonical地址欺骗就是将形如mailto:u ser@host.domainuser@host.domain的地址改写成mailto:user@domainuser@domai n或mailto:user@other.domainuser@other.domain,好像是从其他的邮件服务器发出的一样。缺省该功能是被禁止的,可以用参数masquerade_domains使其生效,如:masquerade_domains=$mydomain也可以通过masquerade_exceptions参数对特定的用户不进行地址欺骗,如:masquerade_exceptions=root注意:地址欺骗只对发件人地址有作用。虚拟地址映射在运用了规范地址映射和地址欺骗之后,cleanup将使用虚拟表映射将邮件重定向到所有的收件人。注意,该操作仅仅作用于信头上的收件人地址。这样,我们就可以将发送到虚拟域的邮件投递到真实用户的邮箱。系统的别名数据库同样可以起到相同的作用。缺省该功能是被禁止的,可以用参数virtual_maps使其生效,如:virtual_maps=hash:/etc/postfix/virtualrelocated数据库查询relocated表格提供如何将邮件发送给在系统中没有帐号的用户。缺省该功能是被禁止的,可以用参数relocated_maps使其生效,如:relocated_maps=hash:/etc/postfix/relocated别名数据库查询当邮件在本地投递时,local投递代理进程会在别名数据库(linux下为/etc/aliases)中查询收件人的别名。该操作不会作用于邮件信头中的地址。可以用alias_maps指定使用的别名数据库。缺省地,该功能是有效的,如:alias_maps=hash:/etc/aliases可以通过alias_database参数控制别名数据库的路径,如:alias_database=hash:/etc/aliases |
|