Postfix简介:
在IBM的GPL协议下开发的MTA(邮件传输代理)软件,Postfix更快更容易管理,更安全,同时与sendmail保持兼容。
官网地址:http://www.postfix.org/
邮件服务器发信原理图:
postfix构建组成图:
要点:
Postfix mail queue(Postfix队列):
1 maildrop queue
maildrop queue 是通过Postfix sendmail 命令发送但是还未被Postfix pickup 服务加到postfix 主队列的邮件所处的队列
2 hold queue
smtpd access 策略或者是cleanup的检查可以将部分邮件长时间的放置在hold queue队列
3 incoming queue
所有进入postfix队列的邮件都会由cleanup放置到incoming queue里。
4 active queue
准备发送的邮件队列
瓶颈:CPU、I/O
5 deferred queue
一些发送失败的邮件队列
Postfix收件流程图:
Postfix基本配置:
Postfix的配置项大概有100个,所以这还真是个问题
1、myorigin 参数指明发件人所处的域
2、mydestination 参数指明Postfix接收邮件中收件人所处的域
3、myhostname 参数指明Postfix运行的主机名
4、mynetworks 参数指定Postfix所在的网络地址
5、inet_interfaces 参数指定postfix系统监听的端口
Postfix内容检查模块:
1、内置检查
2、前置队列检查
3、后置队列检查(简单设置、高级设置):
简单Filter:效率低,鲁棒性低,命令行调用
高级Filter:效率高,鲁棒,SMTP协议调用
Postfix性能调优
在postfix已经能够正常工作之后进行的性能优化工作。
1. 邮件接收
- 可以使用性能调优工具ashape,来查看maildrop queue,incoming queue,和activequeue的状态,根据情况调节
- DNS查找性能:可以运行一个本地DNS server 用来提高DNS查找所需要的时间
- 消除不必要的LDAP查询
- 当Postfix对客户端的响应过慢时:
- 通过debug的方式查找日志排查问题,postfix收发邮件失败或成功都会记录日志
- 关闭header_checks和body——checks模式
- 关闭chroot_operation
- 如果日志中记录client unkown则可能是因为DNS出错
- smtpd的进程数达到了master.cf中的限制
更多关于smtpd server processes的性能问题:
- postfix2.0或更新的版本在想smtp client 报告一个错误的时候会暂停,这会造成延迟,可以通过关闭错误邮件回复的延时设定来规避这个问题。
- 通过以上设定,postfix或者更新的版本在同样数目的SMTP server 进程数的基础上能够更多的处理SMTP客户端的链接。
- 其他…
2. 邮件分发
- 可以使用性能调优工具ashape,来查看maildrop queue,incoming queue,和activequeue的状态,根据情况调节
- 通过qshape检查
- 每个消息提交多个收件人。而不是分条多个提交
- 使用SMTP协议提交邮件,而不是使用“sendmail”命令,调整smtpd_recipient_limit设置
- 通过优化提交mail的并行参数或者打开postfix 的in_flow_delay设置,使得邮件的提交速度不要超过硬盘的I/O
- 新建一个本地的DNS server
- 减少smtp_connect_timeout and smtp_helo_timeout 的值,以减少发送邮件到没有回复SMTP server 所消耗的时间
- 为有问题的邮件设置专用的邮件传输策略
- 对第一次投递失败的右键使用fallback_relay
- 加大缓存
- 使用固态硬盘
- 调整递延邮件传递尝试的频率
- 调整同时投递的数量
- 调整每次投递的收件人数量
3. 其他
- 调整Postfix 的进程数
- 调整系统上的进程数
- 调整打开的文件数和sockets数(节约资源)
Postfix瓶颈分析
Postfix系统内置了性能分析工具qshape,通过qshape能够定位导致Postfix性能问题的位置。
该分析的关注点在Postfix queue队列拥塞问题上,可以查看各个队列的统计信息
qshape的使用:
运行在root账号下的qshape能够提供一个Postfix 队列信息的表格视图,在横轴上它为当前消息提供了细粒度队列年龄,为旧消息提供了粗粒度的队列年龄薪资,纵轴提供了消息的目的地址,对于域名消息数最多的最先显示。
比如我们可以查看一下前十名的垃圾邮件信息:
命令qshape -s hold | head
用qshape做问题定位:
- qshape incoming
- qshape active
- qshape deferred | head
- etc..
Postfix SASL认证
配置SASL需要两部,一是配置SASL认证列表和认证所需的后端,比如密码文件或其他数据源,二是配置postfix使其启用SASL。
目前Postfix 支持Cyrus SASL和Dovecot SASL两种认证的实现方式。
以Dovecot为例:
Dovecot配置:
Postfix启用SASL:
如果Dovecot使用Unix 套接字
/etc/postfix/main.cf:
smtpd_sasl_type = dovecot
如果Dovecot使用TCP套接字(将127.0.0.1改成远端IP可进行远程认证)
/etc/postfix/main.cf:
smtpd_sasl_path = inet:127.0.0.1:12345
启用SASL认证:
/etc/postfix/main.cf:
smtpd_sasl_auth_enable = yes
配置好之后重启或reload Postfix即可
验证:
其他SMTP server SASL可选的配置参数:
- 单点登录
- 默认验证域
- 可指定网段免认证
- 在邮件头添加SALS认证用户名
- 客户端SASL认证配置:略..
Postfic TLS 支持
(TLS能够提供基于证书的加密和认证会话)
开启Postfix 的TLS支持,不仅意味着获得了加密邮件加密远程SMTP客户端认证信息的能力,还意味着打开了成千上万行代码(意味着会有性能损失或者产生BUG)
Postfix TSL工作流程:
- smtpd8实现了基于TLS的SMTP服务端
- smtp8实现了基于TLS的SMTP 客户端
- tlsmgr8负责生成伪随机数,保持会话
配置TLS:
- 生成证书文件
- 指定证书文件
- /etc/postfix/main.cf:
smtpd_tls_cert_file = /etc/postfix/server.pem
- smtpd_tls_key_file = $smtpd_tls_cert_file
- 启用TLS
- /etc/postfix/main.cf:
smtpd_tls_security_level = may
Debug的几种方法:
移植Postfix到各个系统难免会遇到各种各样的错误,对于调试而言,或许没有什么比查看Log更好的办法了
是吧?那些删掉log的人,你们感觉怎么样啊...
好了,言归正传
移植Postfix的时候,启动Postfix使用的是 /usr/sbin/postfix start 命令,如果在一个陌生的系统下单纯的拷贝移植可能会遇到缺失库与配置文件等等的问题,这个时候会在命令行下打印出来。接着就是系统启动之后的事情了。
Postfix采用的是独立分布的架构,整个系统由各个模块分别独立运行,通过常驻的master进程进行调度,当遇到问题的时候可以在syslog 生成的/var/log/mail.log去查看日志,当然也可能是更好用的rsyslog,不过都一样。但是呢,你也可能遇到比较奇葩的,你的系统没有syslog!!! [呵呵.gif]
这时候你可以用系统的nc命令监听/dev/log这样同样能够监听到日志消息
还有一种查看内部错误的方式就是
sendmail -v root@localhost [addr] 这个时候会将调试的debug记录发送到系统用户的mailbox里边,so,这也是一种方法
对当然还有一种更通用的strace命令,这个估计对sendmail会好用些,对于Postfix这种分离的架构而言,亲测不太好用
总之呢,还是有log好,没有就只能走偏门了,是吧!
其他:
telnet 25 端口加密发件:
openssl s_client -debug -starttls smtp -crlf -connect localhost:25
来源:oschina
链接:https://my.oschina.net/u/2504425/blog/715388