一. postfix概述
  postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。下面一段话摘自postfix的官方站点( http://www.postfix.org):“postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试。在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件。这真实一个让人吃惊的数字。Postfix试图更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性。”--摘至百度百科.
二.    POSTFIX实现过程
环境:
需要搭建DNS服务做MX解析;
POSTFIX实现SMTP功能;
DOVECOT 提供pop3与imap服务;
CYRUS-SASL 提供SMTP认证;
DNS:
mail.example.com (邮件主机)
mail.sina.com (邮件主机)申明:此为实验环境。
POSTFIX:
配置前行备份:
#postconf -d     查看postfix default设置
#postconf -n     查看用户自定义设置
#postconf -e      修改用户自定义设置
MTA的选择:
启动postfix :
设置监听接口:(默认只监听在本地,ALL为监听所有接口)
这个设置只有重启服务才能生效:(已经监听在所有接口了)
查看当前用户设置:
使用TELNET工具测试:
发信流程:(借用鸟哥的图.感谢鸟哥:这张图让我的理清了思路)
这里分别涉及了/etc/postfix/main.cf里的三个设定项:
mydestination:        设置可收信的地址(用于收信)
mynetworks:           设置可信任的客户端(用于Relay)
relay_domains:        设置可信任的域(用于Relay)
现在来看图作文吧:
第一步:信件进来ehlo握手阶段,传递邮件头部信息也就是mail from: mail to:之类的.
邮件主机根据传递来的头部信息分析邮件是不是传给我自己的,也就是看Mail To的地址是不是与我的邮件主机地址匹配.如果是,再看是否符合mydestination的设定,如果符合则放入mailbox,如果不符合则丢弃或退回.
以上是针对于邮件目标地址是邮件主机本身的处理过程
第二步:Mail To 的地址不是给邮件主机的,我们称为Relay部分.
这时,邮件主机会查看邮件来源IP地址(注意是IP地址而不是什么Mail from:,因为mail from是可以伪装的.)是否符合mynetworks设定(postfix 默认只信任本机所在的网络)
如果符合则放入邮件队列中等待转发.如果不符合,则看来源或者目的是否符合relay_domans的设定,如果符合则转发,不符合则丢弃或退回.
注:mynetworks与relay_domains都是用来设定可信任的客户端,只是一个是基于IP地址,一个是基于域名的设定而已.
测试整个流程:
第一步:example.com 是邮件本机的,接收邮件,放入mailbox
邮件日志信息(状态:发送并放入mailbox)
收件人地址拒绝: (目标是邮件主机主机的,但不符合mydestination设定)
邮件日志信息:本地收信列表中不存在,reject (拒绝!!)
来源不符合mynetworks与relay_domains设定.拒绝!!
postfix默认只信任本地域.重新设定:信任sina.com这个域.
来源IP不符合mynetworks设定(此邮件主机mynetworks设定只信任主机.).但目标地址符合relay_domains设定,转发成功!!
说明:因为两台邮件主机处于同一网段的情况下,为了区分效果之前mynetworks设定为只信任自己,现在改为信任本网段.而relay_domains还原为默认的,即取消之前信任的sina.com域.
虽然不符合relay_domains设定,但来源符合mynetworks设定,为信任网络,转发.!!
日志信息说明的很清楚~~!!
SMTP控制:
控制文件: /etc/postfix/access  (sendmail的无标签版本)
可控制行为: client , sender , recipient (分别是客户端,发信者与收信者.)
执行动作: DISCARD(严厉拒绝,丢弃),REJECT(拒绝,退回信息),RELAY(转发),OK(允许,可以在一个拒绝范围内无条件允许个别.)
使用postmap /etc/postfix/access 进行重散列 (重要的一步!!)
/etc/postfix/access文件本身都带有配置实例,可以参考它的步骤~!
实例:
在/etc/postfix/main.cf主配置文件中加入以下内容.
smtp的客户端控制,先检查/etc/postfix/access/里有没有相应匹配的动作,没有匹配的全部reject (拒绝!!)
编辑/etc/postfix/access文件,此例只允许192.168.1.254这一个IP地址的访问.
#postmap /etc/postfix/access  (使用hash进行重散列!!)
使用192.168.1.254这个IP地址测试发送成功~~!
使用192.168.1.111这个IP地址给example.com这个邮件主机的本地域发邮件仍然拒绝!!
日志内容:
改动一下,首先允许mynetworks(这里是192.168.1.0/24这个信任网段!),再做后面的动作.
现在邮件发送成功了~!!
上面的mynetworks已经是允许了!下面再做一条发信策略,检查/etc/postfix/sender_access 文件,不匹配则执行后面的permit (允许!!)
如下图,拒绝了sina.com这个域.我们看一下,发信..
如下图,已经对发信人做了控制!!
做user2这个用户做例外!!
user2@sina.com 这个用户可以通过mail.example.com这个邮件主机发信了!!
下面再增加一条收信控制:
先检查recipient_access这个文件里的策略,不匹配则允许mynetworks,再拒绝没有被定义为可收信的主机名.
定义example.com这个域的user2这个用户收信拒绝!!注意不要和上面的那个 user2@sina.com 搞混淆了~!!
如下图,给user2发信被拒绝了~~! 给其他人发信ok~~!
日志信息..
以上情况只针对于在同一局域网内固定IP地址的行为控制,如果是不固定的IP地址想要通过这个邮件主机收发邮件而又不想让我的邮件主机open relay 成为垃圾邮件中转站.那么SMTP认证能够很好的解决这一问题.
cyrus-sasl认证:
先确定下以下软件包是否被安装
#saslauthd -v 可查看该论证版本以及可支持的认证方式.
这里我选择shadow验证机制.
#/usr/sbin/saslauthd -a shadow  执行,并写入开机脚本.
分别编辑以下配置文件,内容如图:
/etc/sysconfig/saslauthd 这是sasl认证的全局配置,定义socketdir与认证方式.
/usr/lib/sasl2/smtpd.conf  smtp的认证配置
在/etc/postfix/main.cf配置文件中开启smtp认证,并进行相关设置.
sasl 测试: 分别测试saslauthd 这个功能是否开启和smtp认证是否生效!成功了!
使用Dovecot 提供POP3与imap服务:
安装dovecot软件:
启用服务查看监听的端口110 143分别是pop3 ,imap监听的端口,993 995则是pop3s与imaps啦.
因为pop3与imap不够安全,这里我只提供加密的pop3s 与imaps,所以客户端要只能在他的MUA软件上设置为安全的连接.
编辑/etc/dovecot.conf  去掉imap与pop3
重启服务,现在只提供imaps与pop3s 了.
设置开机启动;自制证书
如下图: dovecot.pem  已经产生了.
dovecot是用的是对称加密的算法,所以公钥与私钥使用的都是dovecot.pem
这里将dovecot.pem放入一个/etc/pki/dovecot/serts这个目录里.(目录并不是特定的哦!)
编辑/etc/dovecot.conf
开启SSL的功能,并指定钥匙的路径,只需要对应刚才存放的路径就行了~!
测试~~!
测试ok~~!
使用MUA工具: Thunderbird
询问是否信任该证书..
如果你不确定请先查看该证书的相关细节部分,再决定是否信任,这里我当然要信任了.
postfix 其他功能:
使用always_bcc监控邮件~!注意开启这个功能必须经过授权.
此功能是将经过本邮件主机的邮件都抄送一份给某个用户.
这里是将邮件抄送给 admin@sina.com 这个用户~!
看一下,给 test@sina.com 的用户也送了一份给 admin@sina.com
日志信息:
虚拟别名:
编辑/etc/postfix/main.cf主配置文件
virtual_alias_domains = example.com baidu.com 这里指定了两个的虚拟域.
virtual_alias_maps = hash:/etc/postfix/virtual   (配置文件里有相关配置说明)
编辑/etc/postfix/virtual这个文件.编辑完也记得postmap一下~~!
通常用在公司域名变更之后,无须通知原来的客户邮件联系方式,使用别名就好了.
如图,发给 admin@example.com 的邮件最终发给 admin@sina.com 了.
日志信息:
用户别名:
alias_database = hash:/etc/aliases 在/etc/postfix/main.cf里指定用户别名文件.
使用的是/etc/aliases 这个文件.编辑完记得用postalias /etc/aliases 与postmap很相似~!
用户别名的功能可以用于群发,而且有效的保证的系统帐号不被泄漏~!
看一下群发的效果吧~!
地址重编:
测试一下..~
mail from: admin@mail.sina.com
日志信息:
接收查看: Mail From: admin.alias@sina.com  测试ok~!
回信~~!
admin收到~!
重新看了一下日志信息,有点儿疑惑,好像是之前做的bcc 还是别名的实验没有被清除,才收到了信件,因为在日志里出现了收信地址拒绝与bounced的状态,
解决:在/etc/aliases 添加以下内容就可以正常收信了。
admin.alias  admin
附:
mail.example.com邮件主机配置:
mail.sina.com邮件主机配置:
其它测试方式:
 
推荐文档:
 
完结~~!