登录 |  注册 |  繁體中文


postfix 安装配置详解

分类: 服务器相关 颜色:橙色 默认  字号: 阅读(1668) | 评论(0)

1、相关基础知识

我们熟悉的Outlook,Foxmail等都是用来收信和发信的,称之为MUA:Mail User Agent,邮件用户代理。

MUA并非直接将邮件发送至收件人手中,而是通过MTA:Mail Transfer Agent,邮件传输代理代为传递,Sendmail和Postfix就是扮演MTA的角色。

一封邮件从MUA发出后,可能通过一个或多个MTA传递,最终到达MDA:Mail Delivery Agent,邮件投递代理,邮件到达MDA后,就存放在某个文件或特殊的数据库里,我们将这个长期保存邮件的地方称之为邮箱。

MUA到MTA,以及MTA到MTA之间使用的协议就是SMTP协议,而收邮件时,MUA到MDA之间使用的协议最常用的是POP3或IMAP。

2、软件功能介绍

cyrus-sasl、postfix、dovecot 分别有各自的功能。下面就分别一一介绍各自的功能。
Postfix:提供邮件发送服务,即SMTP。
Dovecot:提供邮件收取服务,即POP3

2.1 cyrus-sasl功能介绍

cyrus-sasl(Simple Authentication Security Layer)简单认证安全层, SASL主要是用于SMTP认证。而cyrus-sasl在OS里面,saslauthd是其守护进程。

2.2 postfix功能介绍

postfix是一个电子邮件服务器,它为了改良sendmail邮件服务器而产生的,并且它的配置文件比sendmail简单得多,配置相当容易。

postfix作为发送邮件服务器。

2.3 dovecot功能介绍

dovecot是一个开源的IMAP和POP3邮件服务器,支持Linux/Unix系统。

POP/IMAP是MUA从邮件服务器中读取邮件时使用的协议。其中,与POP3是从邮件服务器中下载邮件存起来,IMAP则是将邮件留在服务器端直接对邮件进行管理、操作。

dovecot可以被其他具有相同功能的软件替代,比如:cyrus-imapd。

dovecot作为接收邮件服务器。

详见 postfix 接收邮件配置

3、cyrus-sasl安装与配置

在本章节会介绍cyrus-sasl的安装和配置,先来介绍cyrus-sasl的安装。

cyrus-sasl的安装很简单,使用如下命令:

yum install cyrus-sasl #提供smtp的虚拟账户和密码服务

查看版本cyrus-sasl,使用如下命令:

/usr/sbin/saslauthd -v

saslauthd是认证服务cyrus-sasl的守护进程

#cat /etc/sysconfig/saslauthd #配置文件

# ps aux |grep saslauthd 查看saslauthd进程,如果没有发现些进程,则要开启:
# /etc/rc.d/init.d/saslauthd start

4、postfix安装与基本配置

4.1 postfix安装

安装postfix,使用如下命令:

yum -y install postfix

注意:postconf是检查posftix配置的命令。

4.2 postfix基本配置

下面这四个文件是postfix最基本的配置文件,它们的区别在于:
mail.cf:是postfix主要的配置文件。
Install.cf:包含安装过程中安装程序产生的postfix初始化设置。
master.cf:是postfix的master进程的配置文件,该文件中的每一行都是用来配置postfix的组件进程的运行方式。
postfix-script:包装了一些postfix命令,以便我们在linux环境中安全地执行这些postfix命令。

4.3、Postfix的目录:

/etc/postfix:该目录中包括Postfix服务的主配置文件、各类脚本、查询表等。

/usr/libexec/postfix/:该目录中包括Postfix服务的各个服务器程序文件。

/var/spool/postfix/:该目录中包括Postfix服务的邮件队列相关的子目录。

postfix最常使用的配置文件是main.cf, 如下:

vim /etc/postfix/main.cf

myhostname = mail.test.com  ← 设置系统的主机名

mydomain = test.com  ← 设置域名(我们将让此处设置将成为E-mail地址“@”后面的部分)

myorigin = $mydomain  ← 将发信地址“@”后面的部分设置为域名(非系统主机名)
myorigin参数指明发件人所在的域名。如果你的用户的邮件地址为user@domain.com,则该参数指定@后面的域名。缺省地,postfix使用本地主机名作为myorigin

inet_interfaces = all   #如果 inet_interfaces= localhost,则邮箱不接收外网的邮件,只接受内网的邮件。设定inet_interfaces= all 则邮箱会接收外网的邮件

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain  ← 指定发给本地邮件的域名
这里只能写自己的主机名和域名,比如写入163.com,那么给163.com发送邮件,自己就会收到

mynetworks = 127.0.0.0/8
 #mynetwork中的IP可以“任意”链接postfix的smtp端口来发送邮件,而不需要smtp认证,可以把这个变量理解为免SMTP认证IP白名单,
该值设置后, mynetworks_style 参数将被忽略掉。 

mynetworks_style = host //指定信任网段类型

relay_domains = $mydestination //指定允许中转邮件的域名

local_recipient_maps = //209行,把前面的注释拿掉。如果不加local_recipient_maps这个配置,收件可能收不到,。

home_mailbox = Maildir/  (表示要使用maildir格式的邮箱), 具体说明,详见 https://www.php3.cn/a/204.html

修改好文件后,保存并退出。然后重启psotfix:service postfix restart

4.4 测试postfix配置

postfix配置完毕后,我们需要测试postfix是否可以正常发送邮件。

现在来启动postfix,使用如下命令:

/etc/init.d/postfix start

postfix启动后,我们也可以通过postfix的日志进行查看。postfix的日志文件为/var/log/maillog。如下:

tail -f /var/log/maillog

现在我们来测试postfix是否可以发送邮件,如下:

	telnet mail.php3.cn 25 
S: 220 smtp.example.com ESMTP Postfix
C: HELO mydomain.com
S: 250 Hello mydomain.com
C: MAIL FROM: sender@mydomain.com
S: 250 Ok
C: RCPT TO: friend@example.com
S: 250 Ok
C: DATA
S: 354 End data with .
C: Subject: test message
C: From: sender@mydomain.com
C: To: friend@example.com
C:
C: Hello,
C: This is a test.
C: Goodbye.
C: .
S: 250 Ok: queued as 12345
C: quit
S: 221 Bye

注意:上述命令中mail from:admin@php3.cn中的admin@php3.cn是随便填写的,而rcpt to:89xxxxx@qq.com中的邮箱则是确实存在的。

以上发送邮件,是不需要认证用户的。

4.5 配置系统用户来认证smtp

第一步 main.cf 增加如下内容

 smtpd_sasl_security_options = noanonymous
 #取消smtp的匿名登录 此项默认值为noanonymous smtp若能匿名登录危害非常大 此项请务必指定为noanonymous
 smtpd_sasl_auth_enable = yes #指定postfix使用sasl验证 通俗的将就是启用smtp并要求进行账号、密码效验
 smtpd_sasl_local_domain = $myhostname
 broken_sasl_auth_clients = yes #指定postfix兼容MUA使用不规则的smtp协议--主要针对老版本的outlook
 smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated, reject_unauth_destination, permit
 #限制每一封邮件最大容量为 20M
#message_size_limit = 20480000
#限制postfix 最大并发连接数
#default_process_limit = 100
第二步 修改: vim /etc/sasl2/smtpd.conf
  pwcheck_method: saslauthd
  mech_list: PLAIN LOGIN
  log_level:3
 
第三步 修改: vi /etc/sysconfig/saslauthd
 MECH=shadow  //使用系统用户进行认证
5.重启动postfix和sasl
service postfix restart
service saslauthd restart

缺省地,postfix转发符合以下条件的邮件:
* 来自客户端ip地址符合$mynetworks的邮件。
* 来自客户端主机名符合$relay_domains及其子域的邮件。
* 目的地为$relay_domains及其子域的邮件。

缺省地,postfix接受符合以下条件的邮件:
* 目的地为$inet_interfaces的邮件。
* 目的地为$mydestination的邮件。
* 目的地为$virtual_maps的邮件。
但是我们也可以通过下面的规则来实现更强大的控制功能。

smtpd_recipient_restrictions =
    permit_mynetworks,        #检测客户端是否来自mynetworks或者mynetworks_style的网络,是的话返回OK,否则返回DUNNO状态码。
   permit_sasl_authenticated,    #检测用户认证是否通过的,认证通过的返回状态OK,否则返回DUNNO状态码。
   reject_non_fqdn_hostname,    #HELO/EHLO时:客户端提供的主机名不是RFC要求的完整形式(FQND),返回REJECT,否则返回DUNNO状态码。 
   reject_non_fqdn_sender,        #MAIL FROM时:客户端提供的主机名不是RFC要求的完整形式(FQND),返回REJECT,否则返回DUNNO状态码。
    reject_non_fqdn_recipient,    #RCPT TO时:客户端提供的主机名不是RFC要求的完整形式(FQND),返回REJECT,否则返回DUNNO状态码。
   reject_unauth_destination,    #RCPT TO时:收件人不在postfix管辖的区域(由mydestination定义),返回REJECT,否则返回DUNNO状态码。
   reject_unauth_pipelining,    #禁止非授权客户端使用pipelining
    reject_invalid_hostname        #HELO/EHLO时:客户端提供的主机名不是有效的主机名时,返回REJECT,否则返回DUNNO状态码。
 
# SMTP sender login matching config
smtpd_sender_restrictions =
        permit_mynetworks,        #检测客户端是否来自mynetworks或者mynetworks_style的网络,是的话返回OK,否则返回DUNNO状态码。
        reject_sender_login_mismatch,    #拒绝发送者在$smtpd_sender_owner_maps中所匹配的用户名和sasl登录名不一致的连接。
        reject_authenticated_sender_login_mismatch,    #拒绝认证成功的发送者在$smtpd_sender_owner_maps中所匹配的用户名和sasl登录名不一致的连接。
        reject_unauthenticated_sender_login_mismatch    #拒绝认证失败的发送者在$smtpd_sender_owner_maps中所匹配的用户名和sasl登录名不一致的连接。
 

其中每个队列子目录用于保存不同的邮件,比如说:

1>.Incoming(传入):刚接收到的邮件。

2>.Active(活动):正在投递的邮件。

3>.Deferred(推迟):以前投递失败的邮件。

4>.Hold(约束):被阻止发送的邮件。

5>.Corrupt(错误):不可读或不可分析的邮件。

Postfix的邮件状态在日志中是:status=XXXXXX
一般来说Postfix的邮件状态有以下几种:
sent 发送成功
deferred 延期发送
bounced 弹回
deferral 延期
reject 拒绝

 4.6 sasldb2建立smtp用户和密码

修改如下:

#编辑通过sasl启用smtp账号密码效验的配置
vi /etc/sasl2/smtpd.conf #vi写入或编辑内容如下:
#####
pwcheck_method: auxprop
auxprop_plugin: sasldb
#创建smtp账号
saslpasswd2 -c -u `postconf -h mydomain` test #回车会要求输入密码,连续两次
#表示创建test@$mydomain的邮箱账号(也是smtp的账号)和密码
#本例就是创建test@php3.cn账号和密码
#此处注意的是smtp登录用的账号并不是单纯的用户名  而是整个邮箱地址字符串
#假设此处设置的smtp账号test@php3.cn密码为test123  下方测试时要用到
 
#查看sasldb2的用户和密码
sasldblistusers2
#此命令进用户查看sasldb的用户情况
#此命令回车后会输出诸如这样的内容:test@php3.cn: userPassword
 
 #更改sasldb2数据的权限,让postfix可以读取
chmod 755 /etc/sasldb2

#每次添加smtp用户完毕之后需重启postfix或reload

5、dovecot安装与基本配置

在本章节会介绍dovecot的安装和基本配置,先来介绍dovecot的安装。

5.1 dovecot安装

安装dovecot,使用如下命令:

yum -y install dovecot dovecot-devel dovecot-mysql pam-devel

dovecot –version

6 SPF 记录

SPF 记录是一种通过 DNS 信息,验证邮件发送主机是否可信的主机的方法。之所以需要额外的验证方式,是因为 Email 的发送地址很容易伪造,没有有效 SPF 记录的邮件很可能被归为垃圾邮件。后面的 DKIM 也是验证邮件可信度的一种方式。

配置 SPF 记录分为设置发信和校验来信两种情况。

设置发信 SPF

发信的 SPF 记录不需要 Postfix 设置,而完全在 DNS 上。

为自己的域名添加一条 TXT 记录:

example.com IN TXT "v=spf1 mx ~all"  

这条记录表示域名自身 MX 记录指向的主机为可信主机, ~all 表示除此以外的主机为软拒绝。

 

 设置邮件服务器的域名解析

         在域名服务提供商那里设置域名解析,我的 example.cn设置了5个域名解析:
         第一个是:记录类型A, 主机记录mail,   指向服务器的IP地址
         第二个是:记录类型MX,主机记录@,指向example.cn         
         第四个是:记录类型CNAME,主机记录pop3.example.cn.,指向 mail.example.cn
         第四个是:记录类型CNAME,主机记录smtp.example.cn.,指向 mail.example.cn
 

7 什么是PAM呢?

  PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系 统中添加新的认证手段。说白了就是一种可插入模块,是一个用于认证用户的灵活机制.




姓 名: *
邮 箱:
内 容: *
验证码: 点击刷新 *   

回到顶部