还剩20页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
邮件系统postfix安装与配置
(一)邮件系统postfix安装与配置
一、postfix概述postfix是WietseVenema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件下面一段话摘自postfix的官方站点()postfix是WietseVenema想要为运用最广泛的sendmail供应替代品的一个尝试在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户运用sendmail每天投递上亿封邮件这真实一个让人惊讶的数字Postfix试图更快、更简洁管理、更平安,同时还与sendmail保持足够的兼容性〃postfix的特点postfix是免费的:postfix想要作用的范围是广阔的Internet用户,试图影响大多数的Internet上的电子邮件系统,因此它是免费的.更快:postfix在性能上大约比sendmail快三倍一部运行postfix的台式PC每天可以收发上百万封邮件.兼容性好postfix是sendmail兼容的,从而使sendmail用户可以很便利地迁移到postfix0Postfix支持/var[/spool]/mail、/etc/aliases、NIS、和-/.forward文件.更健壮postfix被设计成在重负荷之下仍旧可以正常工作当系统运行超出了可用的内存或磁盘空间时,postfix会自动削减运行进程的数目当处理的邮件数目增长时,postfix运行的进程不会跟着增加.更敏捷postfix是由超过一打的小程序组成的,每个程序完成特定的功能你可以通过配置文件设置每个程序的运行参数.平安性postfix具有多层防卫结构,可以有效地抵挡恶意入侵者如大多数的postfix程序可以运行在较低的权限之下,不行以通过网络访问平安性相关的本地投递程序等等
1.2postfix的总体结构postfix由十几个具有不同功能的半驻留进程组成,并且在这些进程中并无特定的进程间父子关系某一个特定的进程可以为其他进程供应特定的服务大多数的postfix进程由一个进程统一进行管理,该进程负责在须要的时候调用其他进程,这个管理进程就是master进程该进程也是•个后台程序这些postfix进程是可以配置的,我们可以配置每个进程运行的数目,可重用的次数,生存的时间等等通过敏捷的配置特性可以使整个系统的运行成本大大降低postfix的邮件队列(mailqueues)postfix有四种不同的邮件队列,并且由队列管理进程统一进行管理maildrop本地邮件放置在maildrop中,同时也被拷贝到incoming中incoming放置正在到达或队列管理进程尚未发觉的邮件active放置队列管理进程已经打开了并正打算投递的邮件,该队列有长度的限制deferred放置不能被投递的邮件reject_unknown_recipient_domain假如收件人的邮件地址在DNS中没有相应的A或MX记录则拒绝该客户端的连接恳求可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)reject_non_fqdn_recipient假如发件人在执行RCPTTO吩咐时供应的地址不是完整的域名则拒绝其SMTP连接恳求可以用Thenon_fqdn_reject_code参数指定返回给客户机的错误代码(缺省为504)
4.4posftfix的性能限制之所以对postfix的性能进行限制,是为了在遇到邮件风暴时保证postfix可以正常运行通常,我们可以通过对下.列postfix参数的配置来调整postfix的性能,这些参数都是通过mail.cf配置文件进行配置的,修改以后不要忘了运行postfixreload吩咐来使配置生效.进程数限制可以通过default_process」imit参数来限制postfix系统同时可以运行的最大进程数目缺省值是50个.对同一目标主机的并发连接限制当向同一目标主机发出SMTP连接时,postfix初始化发出两个SMTP连接,假如投递胜利则增加并发的SMTP连接数目,遇到拥塞时又削减并发连接的数目postfix中通过以下的参数对同一目标主机的并发连接进行限制*initiaLdestination_concurrency限制对同一目标主机的初始化并发连接数目缺省值为2*default_destination_concurrency_limit限制初始化连接后对同一目标主机的最大并发连接数目缺省值为10*local_destination_concurrency_limit限制对同一本地收件人的最大同时投递的邮件数目缺省值为2因为对本地同一收件人投递邮件时投递工作只能一个接一个的进行,所以设得在大也没用.对同一封邮件的收件人数目限制通过default_destination_recipient_limit参数来限制postfix的投递代理(如smtp进程)可以将同一封邮件发送给多少个收件人缺省值为50也可以用明确指出该投递代理的参数来覆盖该缺省值如用smtpd_recipient_limit来指定smtp投递代理可以将同一封邮件发送给多少个收件人,该参数的缺省值为
1000.推迟投递限制通过defer_transports参数,我们可以推迟投递该参数指定的邮件直到postfix明确的提出投递要求下面我们看一个例子有一个小型的局域网,用户都将邮件发送给局域网内部的一台postfix邮件服务器,然后通过在该服务器上拨号将邮件发送出去这时我们可以这样指定该参数的值defer_transports=smtp该语句表示postfix推迟投递全部的邮件直到执行sendmail-q吩咐,这样我们就可以在ppp的脚本中加上sendmail-q以便在拨号胜利后让postfix起先投递邮件邮件系统postfix安装与配置
(二)01-01-1211:26318pbye
2000.关于延迟邮件的再投递限制可以通过以下的几个参数实现对延迟邮件的再投递限制queue_run_deldy设置队列管理进行扫描deferred邮件队列的频率,缺省值为1000秒maximal_queue」ifetime设置postfix在放弃投递而返回不行投递信息前,被延迟邮件再deferred邮件队列中的生存时间minimal_backoff_time当一封邮件投递失败后,邮件队列将在一段时间内忽视该邮件的存在,也就是我们前面讲的时间邮票该参数就是用来设置最小的时间邮票缺省值为1000秒maximal_backoff_time设置最大的时间邮票.对拒绝服务攻击的处理postfix对每一个SMTP会话都设置一个错误计数器,当该客户端的恳求未被接受或违反那UCE规则时,该计数器就增1随着计数器的增加,postfix将实行不同的措施来防止恶意用户的拒绝服务攻击smtpd_error_sleep_time当该错误计数器的值还很小时,postfix将暂停smtpd_error_sleep_time指定的时间,然后向客户端报告-一个错误该参数的缺省值为5秒smtpd_soft_errorjimit当错误计数器的值超过该参数指定的值时,postfix在响应当客户端恳求前将沉睡一段时间缺省值为10smtpd_hard_error_limit当错误计数器的值超过该参数指定的值时,postfix中断同该客户端的连接缺省值为
100.5postfix对运用资源的限制通过特定的postfix配置参数,我们可以实现postfix运行时对所消耗的资源的敏捷限制可以通过以下几个方面来限制postfix消耗的资源.限制内存中的对象的大小要限制对内存资源的消耗,必需限制内存中对象的大小可以用以卜.的参数来进行对象大小的限制line」ength」imit限制读入数据时每一行的大小,假如太长则强行将其分割成更短的行,太长的行在投递时再重组缺省值为2048bytesoheader_size_limit限制信头长度缺省值为102400bytesamessage_size_limit限制postfix队列文件的大小缺省值为10240000bytesqueue_minfree邮件队列中可用的空间大小缺省为无限制建议该值最好时message_size_limit的数倍以便于处理大邮件bounce_size_limit限制某一邮件不行投递时,返回给发件人不行投递报告的大小,缺省值为50000bytes.限制内存中对象的数目qmgr_message_recipientjimit设置内存中收件人地址的最大数目缺省值为
10000.qmgr_message_active_limit设置active邮件队列中邮件数目的最大值缺省值为1000duplicate_filter_limit设置须要local和cleanup后台程序记住的收件人地址的最大数目缺省值为
1000..限制等待一个外部吩咐完成的时间command_time」imit设置local程序等待一个外部吩咐完成的时间缺省值为1000秒.限制文件锁定的操作时间deliver_lock_attempts设置锁定一个文件的最大尝试次数缺省值为5次deliver_lock_delay设置假如锁定一个文件失败后再次尝试的等待时间,缺省值为1秒.限制错误复原在某些状况下(如高负载),postfix的某个进程可能会死掉,这时master进程会试图重新启动该进程,我们可以通过下面的参数来限制这种行为fo「k_dttempts试图重启动一个进程的最大尝试次数缺省值为5次fork_delay每两次尝试之间的等待时间,缺省值为1秒transport_retry_time队列管理进程每两次尝试连接一个不正常的投递代理进程之间的等待时间缺省为60秒
4.6postfix中的地址操作
1.将地址改写为标准格式在cleanup进程进行表杳询之前,它首选恳求trivial-rewrite进程将新改写的目的是为了削减查询表中的条目,从而供应查询的效率t「ivial-「ewrite进程可以实现以下的地址改写*将包含源路由信息的地址如@hosta@hostb:user@site写成user@site因为postfix不支持包含源路由信息的地址格式*将形如user%domain的地址改写成user@domain的形式该特性可通过allow_percent_hack参数进行限制,其缺省值为yes“*将只包含user的地址改写成user@$myorigirio该特性可通过append_at_myorigin参数进行限制,其缺省值为yes最好不要改动其缺省值,因为大多数的postfix进程更擅特长理地址形如user@$myorigin的邮件*将形如user@host的地址改写成user@host.$mydomain该特性可通过append_dot_mydomain参数进行限制,其缺省值为yes.*user@site也即除去了最终的点号.规范地址映射在cleanup进程将一封新邮件存入incoming邮件队列之前,cleanup进程将依据查询规范表来进行地址改写,从而使之更具可读性主要是替换形如Firstname.Lastname风格的地址以及清除无效的域缺省postfix是不进行规范地址改写的你可以通过指定canonical_maps参数的值来使其生效如canonical_maps=hash:/etc/postfix/canonical也可以分别为收件人和发件人地址分别指定不同的改写规范,这时参数sender_canonical_maps和recipient_canonical_maps的优先级比canonical_maps高如sender_canonical_maps=hash:/etc/postfix/sender_canonicalrecipient_canonical_maps=hash:/etc/postfix/recipient_canonical.地址欺瞒@似乎是从其他的邮件服务器发出的•样缺省该功能是被禁止的,可以用参数masquerade_domains使其生效,如masquerade_domains=$mydomain也可以通过masquerade_exceptions参数对特定的用户不进行地址欺瞒,如masquerade_exceptions=root留意地址欺瞒只对发件人地址有作用.虚拟地址映射在运用了规范地址映射和地址欺瞒之后,cleanup将运用虚拟表映射将邮件重定向到全部的收件人留意,该操作仅仅作用于信头上的收件人地址这样,我们就可以将发送到虚拟域的邮件投递到真好用户的邮箱系统的别名数据库同样可以起到相同的作用缺省该功能是被禁止的,可以用参数virtual_maps使其生效,如virtual_maps=hash:/etc/postfix/virtual.Relocated数据库查询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
五、postfix的配置实例
5.1为拨号用户配置postfix假设有一个小公司运用拨号上网,公司通过ISP的SMTP服务器(假设其域名为mail.ispip地址为
201.
110.
1.100)发送邮件公司内部的员工通过公司的SMTP服务器(运行postfix)收发邮件,下面我们一起来配置公司内部的SMTP服务器.因为没有自己的固定ip和域名,所以必需指定ISP的SMTP服务器作为邮件网关(智能主机)可以用如下的参数指定relayhost=[
201.
110.
1.100]留意relayhost的值可以是domain、host、host:port[address]或[address].当接收到新邮件时,postfix就会尝试投递该邮件假如将该公司内部的SMTP服务器设置为按需拨号,也就是•有程序恳求外联就拨号,则会增加上网的费用这时我们可以通过postfix的defer_transports参数推迟投递新邮件直到postfix提出明确的要求,如指定defer_transports=smtp这时假如我们在ppp的脚本(如/etc/ppp/ip-up.local)加上如下吩咐,则postfix只在拨号胜利后投递新邮件/usr/sbin/sendmail.因为我们是将邮件转发到邮件网关(
201.
110.
1.100)而不是自己进行投递,所以我们没有必要运用DNS因此我们通过如下的参数取消DNS查询disable_dns_lookups=yes.为了保证我们能收到回信,我们必需进行域伪装masquerade_domains=isp下面就是我们的配置文件mail.cf#指定邮件网关relayhost=[
201.
110.
1.100]#在拨号胜利后才投递邮件defer_transports=smtp#取消DNS查询disable_dnsjookups=yes#一般常规配置queue_directory=/var/spool/postfixprogram_directory=/usr/libexec/postfixcommand_directory=/usr/sbindaemon_directory=/usr/libexec/postfixmail_owner=postfixdefault_privs=nobodymail_spool_directory=/var/spool/mailmailbox_command=/usr/bin/procmaillocal_destination_concurrency_limit=2default_destination_concurrency_limit=10debug_peer_level=2debugger_command=PATH=/usr/bin:/usr/XllR6/binxxgdb$daemon_directory/$process_name$process_idsleep5#假设本地网络为
192.
168.
1.1/24mynetworks=
192.
168.
1.1/24#hostspecificinformationmyhostname=yourhost.ispmydomain=local.ispmyorigin=$mydomainwheredowereceivemailandwhodoweaccept/receivemailforinetjnterfaces=allmydestination=$myhostnamezlocalhost.$mydomain$mydomaindefault_transport=smtpmasquerade_domains=isp须要留意的是这里的$01丫€1001胡口、$myorigin、$mydestination不能为isp因为你假如设定为isp内部SMTP服务器就会认为你的邮件是转发给它的,故而在本地尝试投递邮件,结果只会返回unknownuser的错误其次,该配置只实现了将邮件通过SMTP发送到ISP的SMTP服务器的手段,缺乏从ISP的邮件服务器取信的方法,这一点就只能通过如outlook或foxmail等的mail客户端软件来实现了
5.2为中小型企业用户配置postfix假设有一家数千名员工的公司,该公司通过租用专线上网现在公司确定通过postfix来建立自己的邮件系统在这里我们假设该公司的域为some邮件服务器的域名mail.some地址为
202.
200.
180.2DNS服务器的域名为dns.some,地址为
202.
200.
180.
11.配置DNS服务器,设置MX记录指向mail.some相关的配置文件7j/var/named/some(假设其zone文件就叫some有关DNS配置的内容请参看本书的相关章节)的内容如下:@INSOAdns.some.root.dns.some2000011307;serial
2.配置postfix其配置文件及相关的说明如下:#设置一般的路径信息queue_directory=/var/spool/postfixcommand_directory=/usr/sbindaemon_directory=/usr/libexec/postfixmail_spool_directory=/var/spool/mail#设置邮件及邮件队列的全部者为postfixmail_owner=postfix#设置邮件服务器的主机名myhostname=mail.some#设置mydomain、myorigin和mydomain参数mydomain=somemyorigin=$mydomainmydestination=$mydomain#设置postfix服务监听的端口inetjnterfaces=all#设置本地收件人的用户名查询手段,缺省是杳词/etc/passwd文件#和别名数据库local_recipient_maps=$alias_mapsunix:passwd.bynamealias_maps=hash:/etc/aliasesalias_database=hash:/etc/aliases#设置最终的本地投递代理程序,在这里我们运用流行的procmailmailbox_command=/usr/bin/procmail#设置该值为$mydomain以便客户端的连接relay_domains=$mydomainmynetworks=
202.
200.
180.0/24#设置向用户显示的主机名和版本信息smtpd_banner=$myhostnameESMTP$mail_name#对于并发进程的限制,保持系统缺省值就可以满意要求了local_destination_concurrency_limit=2default_destination_concurrency_limit=10#假如你不知道你在做什么,最好不要变更下面的设置debug_peerjevel=2debugger_command=PATH=/usr/bin:/usr/XllR6/binxxgdb$daemon_directory/$process_name$processJdsleep
5.在RedHat中我们通常运用imap作为pop3服务器,可以通过rpm-qimap吩咐查看系统有没有安装imap假如没有安装则插入linux光盘,用rpm-ivhimap-
4.5-
4.rpm进行安装.缺省地,pop3服务器是由inet启动的,所以必需去掉/etc/inetd.conf文件中有关pop3的一行注释如下所示pop-3streamtcpnowaitroot/usr/sbin/ipop3dipop3d.重新启动inet服务器,启动postfix:#/etc/rc.d/init.d/inetrestart#postfixstart
5.3在防火墙内部配置postfix假设一公司通过租用专线上网,公司内部运用
192.
168.
0.0的私有ip然后通过防火墙双宿主主机的ip欺瞒上网,公司的邮件服务器mail.some也在内部网中,也运用私有ip我们假设在防火墙上进行了端口转发,可以将Internet对防火墙25端口的请求包转发到内部的邮件服务器上,并且运行DNS服务的防火墙的MX记录指向防火墙木身在这个例子中,我想着重说明的是有关映射文件的用法main.cf配置文件和相关的说明如下所示#表明自己的身份myhostname=mail.somemydomain=somemydestination=$mydomain$myhostnamezlocalhost.$mydomainmyorigin=$mydomain#让postfix监听全部接口inet_interfaces=all#通过mynetworks参数接受内部网用户的SMTP连接恳求mynetworks=
192.
168.
0.0/8#向postfix管理员报告的信息量notify_classes=resourcesoftwarebouncepolicy#假如客户端的ip地址符合$maps_rbl_domams参数中列出的则拒绝之maps_rbl_domains=rbl.maps.vixdul.maps.vix#对可以连接的客户端进行严格的限制smtpd_client_restrictions=#客户端IP符合$1¥1丫诃1\/70r15定义的范围则接受连接permit_mynetworksz#依据access的查询结果推断客户端连接的合法性check_client_accesshash:/etc/postfix/access#拒绝ip^^$maps_rbl_domains定义范围的连接reject_maps_rblz#假如客户端在DNS中没有记录则拒绝连接,要慎用reject_unknown_hostname#通过发件人的地址进行限制smtpd_sender_restrictions=permit_mynetworkscheck_sender_accesshash:/etc/postfix/access#设置虚拟主机数据库,别忘了执行“postmapvirtual”进行格式转换virtual_maps=hash:/etc/postfix/virtual#对无系统帐号的邮件进行转发设置,如离开公司的员工relocated_maps=hash:/etc/postfix/relocated#设置别名数据库alias_maps=hash:/etc/postfix/aliases#我们运用smtp投递代理default_transport=smtp#一些常规设置mail_owner=postfixdefault_privs=nobody#设置路径信息queue_directory=/var/spool/postfixprogram_directory=/usr/libexec/postfixcommand_directory=/usr/sbindaemon_directory=/usr/libexec/postfixmail_spool_directory=/var/spool/mailmailbox_command=/usr/bin/procmail#并发连接设置local_destination_concurrency_limit=2default_destination_concurrency_limit=10然后,我们执行以下吩咐#进入postfix配置书目cd/etc/postfix#用newaliases初始化别名数据库newaliases#用postmap分别建立virtuakaccess和relocated查询数据库postmapvirtualpostmapaccesspostmaprelocated#启动postfix/etc/rc.d/init.d/postfixstart现在我们来看看virtual、access和reloacted几个查询文件的格式,下面是这儿个文件的示例和注释#virtual文件示例#假设在这个例子中我们有个虚拟域为otherother#access文件示例#假如符合前面的条件则进行后面操作,可以有三种操作#
1.
[45]XX$messag拒绝接受并且向客户端显示预定义的信息#
2.REJECT拒绝接受,不显示信息#
3.0K允许连接550GoawayfriendOK
202.192REJECT#relocated文件示例#该文件主要是将发给无系统帐号的邮件进行转发
六、postfix中的吩咐行工具及其它下面我们来看一看postfix的吩咐行工具,通过这些工具的运用可能会使你对postfix的管理更简洁sendmail兼容的吩咐行工具mailq对邮件队列文件进行列表表中的每一个条目包含有以下信息队列文件ID、邮件的大小、到达的时间、发件人、收件人和投递延迟的缘由(假如投递有延迟的话)该吩咐主要是与showq后台程序通信来获得队列文件的相关信息该吩咐无参数newaliases该工具进行别名数据库的初始化假如没有指定数据库的类型,则运用系统默认的数据库类型(在linux下为hash)该吩咐可以不带参数执行postfix自带的吩咐行工具postcat打印邮件队列文件的内容后面界要显示的队列文件名,可以带一个-v的参数进行冗余显示postconf打印配置参数设置后的值或postfix的其他信息-d打印配置参数的缺省值-m列出全部支持的查询表类型不带参数则打印配置参数设置后的值postmap建立postfix杳询数据库在linux卜可以干脆跟上原始文件而不带任何参数来建立该数据库postfix的日志postfix的F1志文件位于/etc/log/maillog文件中包含有postfix的启动信息、出错信息以及同其他SMTP服务器的会话等等如下所示Sep1005:54:17mailpostfix/smtpd
[5072]:disconnectfromunknown[
204.
140.
244.150]Sep1006:06:00mailpostfix/qmgr
[467]:50D403DF8:from=;zsize=6591(queueactiveSep1006:11:06mailpostfix/smtp
[5085]:connecttobjmx
2.
163.net[
202.
108.
255.241]:readtimeoutport25Sep1006:16:07mailpostfix/smtp
[5085]:connecttobjmx
3.
163.net[
202.
108.
255.242]:readtimeoutport25Sep1006:21:08mailpostfix/smtp
[5085]:connecttobjmxl.
163.net[
202.
108.
255.240]:readtimeoutport
256.4在postfix中运用MySQL数据库ScottCotton和JoshuaMarcus写了一段可以在postfix中添加mysql映射类型的代码,从而我们可以将postfix查询的别名数据库等数据存储在mysql数据库中,让postfix进行mysql查询来得到结果这样做将有助于供应postfix的运行效率,有其对须要不断对映射数据的站点特殊有用
1.为postfix添加识别mysql数据库映射的功能a.由于这段代码运用了mysql客户端库,所以我们必需安装mysql的开包可以到等linux相关站点下载mysql开发包,也可以从某些linux的资源光盘中取得mysql的开发包,如MySQL-client-
3.
22.30-
1.
1386.rpmob.安装该开发包rpm-ivhMySQL-client-
3.
22.30-l.i
386.rpmc.下载postfix的源代码包,依据本章
3.1源代码包的安装〃的提示进行安装,但是留意在执行make吩咐之前先执行以下吩咐make-fMakemakefilesCCARGS=-DHAS_MYSQL-I/usr/include/mysqlAUXLIBS=/usr/lib/mysql/libmysqlclient.a-Im.配置postfix运用mysql数据库映射我们以alias_maps进行说明在main.cf中指定:alias_maps=mysql:/etc/postfix/mysql-aliases.cf.编辑mysql-aliases.cf#首先指定登录到mysql服务器的用户名和密码user=your_user_namepassword=your_password#连接的数据库名称dbname=your_database_name#查询的表名table=mytable#添加表的字段名称#forward_addr为转发地址#dlias为别名数据select_field=forward_addrwhere_field=alias#添加附加的查询条件additional_conditions=andstatus=paid#指定要连接的MySQL服务器hosts=your.mysql.server队列管理进程仅仅在内存中保留active队列,并且对该队列的长度进行限制,这样做的目的是为了避开进程运行内存超过系统的可用内存postfix对邮件风暴的处理当有新的邮件到达时,postfix进行初始化,初始化时postfix同时只接受两个并发的连接恳求当邮件投递胜利后,可以同时接受的并发连接的数日就会缓慢地增长至•个可以配置的值当然,假如这时系统的消耗已到达系统不能承受的负载就会停止增长还有一种状况时,假如postfix在处理邮件过程中遇到了问题,则该值会起先降低当接收到的新邮件的数量超过postfix的投递实力时,postfix会短暂停止投递deferred队列中的邮件而去处理新接收到的邮件这是因为处理新邮件的延迟要小于处理deferred队列中的邮件Postfix会在空闲时处理deferred中的邮件postfix对无法投递的邮件的处理当•封邮件第•次不能胜利投递时,postfix会给该邮件贴上•个将来的时间邮票邮件队列管理程序会忽视贴有将来时间邮票的邮件时间邮票到期时,postfix会尝试再对该邮件进行一次投递,假如这次投递再次失败,postfix就给该邮件贴上一个两倍于上次时间邮票的时间邮票,等时间邮票到期时再次进行投递,依此类推当然,经过肯定次数的尝试之后,postfix会放弃对该邮件的投递,返回一个错误信息给该邮件的发件人postfix对不行到达的目的地邮件的处理postfix会在内存中保存一个有长度限制的当前不行到达的地址列表这样就避开了对那些目的地为当前不行到达地址的邮件的投递尝试从而大大提高了系统的性能
1.
2.2postfix的平安性postfix通过一系列的措施来提高系统的平安性,这些措施包括.动态安排内存,从而防止系统缓冲区溢出;.把大邮件分割成几块进行处理,投递时再重组.Postfix的各种进程不在其他用户进程的限制之下运行,而是运行在驻留主进程master的限制之下,与其他用户进程无父子关系,全部有很好的绝缘性.Postfix的队列文件有其特殊的格式,只能被postfix本身识别;
二、postfix对邮件的处理过程
2.1接收邮件的过程图
二、postfix对接收邮件的处理当postfix接收到一封新邮件时,新邮件首选在incoming队列处停留,然后针对不同的状况进行不同的处理..对于来自于本地的邮件sendmail进程负责接收来自本地的邮件放在maildrop队列中,然后pickup进程对maildrop中的邮件进行完整性检测maildrop书目的权限必需设置为某一用户不能删除其他用户的邮件.对于来自于网络的邮件smtpd进程负责接收来自于网络的邮件,并且进行平安性检测可以通过UCE(unsolicitedcommercialemail)限制smtpd的行为.由postfix进程产生的邮件:这是为了将不行投递的信息返回给发件人这些邮件是由bounce后台程序产生的
5.由postfix自己产生的邮件提示postmaster(也即postfix管理员)postfix运行过程中出现的问题(如SMTP协议问题,违反UCE规则的记录等等)这样,当发生一个查询的时候,postfix是以这样的SQL语句进行查询的selectforward_addrfrommytablewherealias=$lookupandstatus=paid以上只是一个例子在实际的运用中您可以指定多个mysql数据库,运用多个数据表格关于cleanup后台程序的说明cleanup是对新邮件进行处理的最终一道工序它对新邮件进行以下的处理添加信头中丢失的Form信息;行排列;重信头中抽出收件人的地址;将邮件投入incoming队列中,并恳求邮件队列管理进程处理该邮件;恳求trivial-rewrite进程将地
2.2投递邮件的过程新邮件一旦到达incoming队列,卜.一步就是起先投递邮件,postfix投递邮件时的处理过程如图三所示相关的说明如下邮件队列管理进程是整个postfix邮件系统的心脏它和localsmtppipe等投递代理相联系,将包含有队列文件路径信息、邮件发件人地址、邮件收件人地址的投递恳求发送给投递代理队列管理进程维护着一个deferred队列,那些无法投递的邮件被投递到该队列中除此之外,队列管理进程还维护着一个active队列,该队列中的邮件数目是有限制的,这是为了防止在负载太大时内存溢出邮件队列管理程序还负责将收件人地址在relocated表中列出的邮件返回给发件人,该表包含无效的收件人地址假如邮件队列管理进程恳求,rewrite后台程序对收件人地址进行解析但是缺省地,rewrite只对邮件收件人是本地的还是远程的进行区分假如邮件对你管理进程恳求,bounce后台程序可以生成一个邮件不行投递的报告本地投递代理local进程可以理解类似UNIX风格的邮箱,sendmail风格的系统别名数据库和sendmail风格的.forward文件可以同时运行多个local进程,但是对同一个用户的并发投递进程数目是有限制的你可以配置local将邮件投递到用户的宿主书目,也可以配置local将邮件发送给一个外部吩咐,如流行的本地投递代理procmaiL在流行的linux发行版本RedHat中,我们就运用procmail作为最终的本地投递代理远程投递代理SMTP进程依据收件人地址查询一个SMTP服务器列表,依据依次连接每一个SMTP服务器,依据性能对该表进行排序在系统负载太大时,可以有数个并发的SMTP进程同时运行pipe是用于UUCP协议的投递代理
三、postfix的安装过程
3.1源代码包的安装.获得postfix的源代码包从postfix官方站点取得postfix的源代码包postfix-1999123l-pl
08.tar.gzo将其拷贝到/tmp.解开源代码包将生成/tmp/postfix-19991231-pl08书目tarxvzfpostfix-19991231-pl
08.tar.gz.编译源代码包cd/tmp/postfix-1999123l-pl08make.建立一个新用户postfix该用户必需具有唯一的用户id和组id号,同时应当让该用户不能登录到系统,也即不为该用户指定可执行的登录外壳程序和可用的用户宿主书目我们可以先用adduserpostfix添加用户再编辑/etc/passwd文件中的相关条目如下所postfix:*:12345:12345:postfix:/no/where:/no/shell.确定/etc/aliases文件中包含如下的条目postfix:root.以root用户登录,在/tmp/postfix-19991231-pl08书目下执行吩咐./INSTALL.sh.启动postfix#postfixstart
8.关于maildrop书目权限的说明postfix可以运用一个全部用户都可写的(也即书目权限为1773)的maildrop书目来让本地用户提交邮件这种方法避开了运用set-uid或set-gid软件,并且在邮件系统不行用时,用户仍旧可以提交邮件其他用户没有访问该书目中的队列文件的权限接收来自网络的邮件时postfix不运用maildrop书目但是,由于该书目的权限是733其他用户可以建立•个硬连接到该书目中的文件从而导致该邮件被投递多次或无法删除,也就是说这将导致平安性问题假如你想要运用这种方式来让用户提交邮件,就要在INSTALL.sh脚本问你是否须要set-gid时回答no假如你的系统有多个用户的话,最好取消以上的方式而采纳利用set-gid用户权限提交邮件的方式这时,我们首先须要建立一个组id唯一的组maildrop”并且确定该组中没有用户成员然后在INSTALL.sh问你是否须要set-gid时指定maildrop”提示在安装postfix之前,请删除已经安装的sendmail
3.2rpm包的安装.获得postfix的rpm软件包我们可以从获得postfix的rpm软件包当前的最新版本是postfix-20000531-
2.i
386.rpmo.备份你的/etc/aliasesFli/etc/aliases.db因为postfix要运用该别名数据库.用以下吩咐查看系统是否安装了sendmail:[root@mail/root]#rpm-qa|grepsendmailsendmail-doc-
8.
9.3-15sendmail-
8.
9.3-15sendmail-cf-
8.
9.3-
15.用以下吩咐强行卸载sendmail[root@mail/root]#rpm-esendmailsendmail-cfsendmail-doc-nodeps.用以下吩咐杀死运行中的sendmail进程[root@mail/root]#killallsendmail.安装postfix[root@mail/root]#rpm-Uvhpostfix-20000531-
2.i
386.rpmpostfix##################################################postfix-script:warning:creatingmissingPostfixpiddirectorypostfix-script:warning:creatingmissingPostfixincomingdirectorypostfix-script:warning:creatingmissingPostfixactivedirectorypostfix-script:warning:creatingmissingPostfixbouncedirectorypostfix-script:warning:creatingmissingPostfixdeferdirectorypostfix-script:warning:creatingmissingPostfixdeferreddirectorypostfix-script:warning:creatingmissingPostfixsaveddirectorypostfix-script:warning:creatingmissingPostfixcorruptdirectorypostfix-script:warning:creatingmissingPostfixpublicdirectorypostfix-script:warning:creatingmissingPostfixprivatedirectory[root@mail/root]#.启动postfix[root@mail/root]#/etc/rc.d/init.d/postfixstart
3.3配置系统每次启动时自动启动postfix.假如你安装的是postfix的源代码包,可以在/etc/rc.d/rc.local文件中加入如下的语句让系统每次启动时自动启动postfix if[-f/usr/libexec/postfix];then/usr/libexec/postfixstartfi.假如你安装的是postfix的rpm包,可以通过setup吩咐来设置在系统启动时启动postfix0
四、postfix的配置详解postfix的配置文件结构postfix的配置文件位于/etc/postfix下,安装完postfix以后,我们可以通过Is吩咐查看postfix的配置文件[root@mailpostfix]#Isinstall.cfmain.cfmaster.cfpostfix-script这四个文件就是postfix最基本的配置文件,它们的区分在于mail.cf是postfix主耍的配置文件Install.cf包含安装过程中安装程序产生的postfix初始化设置master.cf是postfix的master进程的配置文件,该文件中的每一行都是用来配置postfix的组件进程的运行方式postfix-script包装了一些postfix吩咐,以便我们在linux环境中平安地执行这些postfix吩咐postfix的基本配置postfix大约有100个配置参数,这些参数都可以通过main.cf指定配置的格式是这样的,用等号连接参数和参数的值如myhostname=mail.mydomain等号的左边是参数的名称,等号的右边是参数的值;当然,我们也可以在参数的前面加上$来引用该参数,如:myorigin=$myhostname虽然postfix有100个左右的参数,但是postfix为大多数的参数都设置了缺省值,所以在让postfix正常为你服务之前,你只须要配置为数不多的几个参数卜.面我们一起来看一看这些基本的postfix参数须要留意的是,一旦你更改了main.cf文件的内容,则必需运行postfixreload吩咐使其生效myoriginmyorigin参数指明发件人所在的域名,则该参数指定@后面的域名缺省地,postfix运用本地主机名作为myorigin但是建议你最好运用你的域名,因为这样更具有可读性比如安装postfix的主机为mail.domain则我们可以这样指定myorigin:myorigin=domain当然我们也可以引用其他参数,如myorigin=$mydomainmydestinationmydestination参数指定postfix接收邮件时收件人的域名,换句话说,也就是你的postfix系统要接收什么样的邮件比如,也就是你的域为domain与myorigin一样,缺省地,postfix运用本地主机名作为mydestination如mydestination=$mydomainmydestination=domainnotify_classes在postfix系统中,必需指定一个postfix系统管理员的别名指向一个用户,只有这样,在用户遇到问题时才有报告的对象,postfix也才能将系统的问题报告给管理员notify_classes参数就是用来指定向postfix管理员报告错误时的信息级别共有以卜.几种级别bounce将不行以投递的邮件的拷贝发送给postfix管理员出于个人隐私的原因,该邮件的拷贝不包含信头2bounce将两次不行投递的邮件拷贝发送给postfix管理员delay将邮件的投递延迟信息发送给管理员,仅仅包含信头policy将由于UCE规则限制而被拒绝的用户恳求发送给postfix管理员,包含整个SMTP会话的内容protocol将协议的错误信息或用户企图执行不支持的吩咐的记录发送给postfix管理员同样包含整个SMTP会话的内容resource将由于资源错误而不行投递的错误信息发送给postfix管理员,比如队列文件写错误等等so代ware将由于软件错误而导致不行投递的错误信息发送给postfix管理员缺省值为notify_classes=resourcesoftwaremyhostnamemyhostname参数指定运行postfix邮件系统的主机的主机名缺省地,该值被设定为本地机器名你也可以指定该值,须要留意的是,要指定完整的主机名如myhostname=mail.domainmydomainmydomain参数指定你的域名,缺省地,postfix将myhostname的第一部分删除而作为mydomain的值你也可以自己指定该值如mydomain=domainmynetworksmynetworks参数指定你所在的网络的网络地址,postfix系统依据其值来区分用户是远程的还是本地的,假如是本地网络用户则允许其访问你可以用标准的A、B、C类网络地址,也可以用CIDR(无类域间路由)地址来表示,如
192.
168.
1.0/
24192.
168.
1.0/26inet_interfacesinetjnterfaces参数指定postfix系统监听的网络接口缺省地,postfix监听全部的网络接口假如你的postfix运行在一个虚拟的ip地址上,则必需指定其监听的地址如inetjnterfaces=allinet_interface=
192.
168.
1.
14.3postfix的UCE(unsolicitedcommercialemail)限制所谓UCE限制就是指限制postfix接收或转发来自于什么地方的邮件缺省地,postfix转发符合以下条件的邮件*来自客户端ip地址符合$171丫的口70「15的邮件*来自客户端主机名符合$代匕丫_0100^访$及其子域的邮件*目的地为$relay_domains及其子域的邮件缺省地,postfix接受符合以卜条件的邮件*目的地为$inet_interfaces的邮件*目的地为$01丫(^5匕的甘0门的邮件*目的地为$丫1巾1131_171*$的邮件但是我们也可以通过下面的规则来实现更强大的限制功能.信头过滤通过headejchecks参数限制接收邮件的信头的格式,假如符合指定的格式,则拒绝接收该邮件可以指定一个或多个查询列表,假如新邮件的信头符合列表中的某一项则拒绝该接收邮件如header_checks=regexp:/etc/postfix/header_checksheader_checks=pcre:/etc/postfix/header_checks缺省地,postfix不进行信头过滤.客户端主机名/地址限制通过smtpd_client_restrictions参数限制可以向postfix发起SMTP连接的客户端的主机名或ip地址可以指定•个或多个参数值,中间用逗号隔开限制规则是依据查询的依次进行的第一条符合条件的规则被执行可用的规则有reject_unknown_client假如客户端的ip地址在DNS中没有PTR记录则拒绝转发该客户端的连接恳求可以用unknown_dient_reject_code参数指定返回给客户机的错误代码(缺省为450)假如你有用户没有作DNS记录则不要启用该选项permit_mynetworks假如客户端的ip地址符合$01丫门61770「15参数定义的范围则接受该客户端的连接恳求,并转发该邮件check_client_accessmaptype:mapname依据客户端的主机名、父域名、ip地址或属于的网络搜寻access数据库假如搜寻的结果为REJECT或者”
[45]XXtext”则拒绝该客户端的连接恳求;假如搜寻的结果为OK、RELAY或数字则接受该客户端的连接恳求,并转发该邮件可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)oreject_maps_rbl假如客户端的网络地址符合$^1用5_21_€10013仁5参数的值则拒绝该客户端的连接恳求可以用maps_rbLreject_code参数指定返回给客户机的错误代码(缺省为554)示例smtpd_client_restrictions=hash:/etc/postfix/accesszreject_maps_rblsmtpd_client_restrictions=permit_mynetworkszreject_unknown_client该参数的缺省值为smtpd_client_restrictions=也即接收来自任何客户端的SMTP连接.是否恳求HELO吩咐可以通过smtpd_helo_required参数指定客户端在SMTP会话的起先是否发送一个HELO吩咐你可以指定该参数的值为yes或no缺省值为smtpd_helo_required=no.HELO主机名限制可以通过smtpd.helo.restrictions参数指定客户端在执行HELO吩咐时发送给postfix的主机名缺省地,postfix接收客户端发送的随意形式的主机名可以指定一个或多个参数值,中间用逗号隔开限制规则是依据杳询的依次进行的,第一条符合条件的规则被执行可用的规则有reject_invalid_hostname假如HELO吩咐所带的主机名参数不符合语法规范则拒绝客户机的连接恳求可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为501)permit_naked_ip_address RFC要求客户端的HELO吩咐包含的ip地址放在方括号内,你可以用permit_naked_ip_address参数取消该限制因为有的mail客户端不遵守该RFC的规定reject_unknown_hostname假如客户端执行HELO吩咐时的主机名在DNS中没有相应的A或MX记录则拒绝该客户端的连接恳求可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为450)reject_non_fqdn_hostname假如客户端执行HELO吩咐时的主机名不是RFC规定的完整的域名则拒绝客户端的连接恳求可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为504)check_helo_accessmaptype:mapname依据客户端HELO的主机名、父域名搜寻access数据库假如搜寻的结果为REJECT或者
[45]XXtext则拒绝该客户端的连接恳求;假如搜寻的结果为OK、RELAY或数字则接受该客户端的连接请求可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)示例smtpd_helo_restrictions=permit_mynetworkszreject_invalid_hostname.RFC821信头限制RFC821对邮件的信头做了严格的规定,但是广泛运用的sendmail并不支持该规定,所以对于该参数我们只能说不,即strict_rfc82l_envelopes=no.通过发件人地址进行限制可以用smtpd_sender_restrictions参数通过发件人在执行MAILFROM吩咐时供应的地址进行限制可以指定一个或多个参数值,中间用逗号隔开限制规则是依据查询的依次进行的,第一条符合条件的规则被执行可用的规则有reject_unknown_sender_domain假如MAILFROM吩咐供应的主机名在DNS中没有相应的A或MX记录则拒绝该客户端的连接恳求可以用unknown_address_「eject_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_code参数指定返回给客户机的错误代码(缺省为504)缺省地,postfix接受来自任何发件人的邮件示例smtpd_sender_restrictions=hash:/etc/postfix/accessreject_unknown_sender_domain
7.通过收件人地址进行过滤可以用smtpd_recipient_restrictions参数通过发件人在执行RCPTTO吩咐时供应的地址进行限制缺省值为smtpd_recipient_restrictions=permit_mynetworkszcheck_relay_domains可以指定一个或多个参数值,中间用逗号隔开限制规则是依据查询的依次进行的,第一条符合条件的规则被执行可用的规则有check_relay_domains假如符合以下的条件,则接受SMTP连接恳求,否则拒绝该连接,可以用relay_domains_reject_code参数指定返回给客户机的错误代码(缺省为504)*客户端主机名符合$「elay_domains及其子域*目的t也为$inet_interfaces、$mydestination^$virtual_mapspermit_auth_destination不管客户端的主机名,只要符合以下的条件,就接受SMTP连接恳求*解析后的目标地址符合$作1»_€1[71引股及其子域*解析后的目标地址符合$inet:_interfaces、$mydestinationidc$virtual_mapsreject_unauth_destination不管客户端的主机名,只要符合以下的条件,就拒绝该客户端SMTP连接恳求*解析后的目标地址符合$m匕丫_€)00^访5及其子域*解析后的目标地址符$mydestination«Jc$virtual_mapscheck_recipient_access依据解析后的目标地址、父域搜寻access数据库假如搜寻的结果为REJECT或者”
[45]XXtext则拒绝该客户端的连接恳求;假如搜寻的结果为OK、RELAY或数字则接受该客户端的连接恳求可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。