搭建邮件服务器(2) – 使用Postfix搭建简单发件服务器

了解了邮件系统的基本工作原理,下面我们来实践一下,来搭建一个简单的Postfix发件服务器。

1 了解Postfix配置文件

Postfix配置文件一般位于/etc/postfix下,文件名一般以.cf结尾。其中两个主要配置文件为main.cf和master.cf,master.cf主要控制服务的开关,main.cf则控制其他的选项。此外若安装了postfix-mysql, postfix-ldap这种拓展后,可能还会创建其他的拓展配置。

2 安装Postfix

直接从发行版的软件仓库中安装Postfix即可。在安装过程中可能会要求选择配置模板:

安装过程中的提示

一般来说我们选择Internet Site. 毕竟搭建的是简单的邮件服务器,我们不需要使用邮件路由等高级功能。况且高级功能也可在安装后通过修改配置文件的方式添加。

选择后会要求输入邮箱域名。这里输入解析到你的邮箱服务器的域名。比如说你想创建foo@example.com的邮箱用户,而你的MX记录是mail.example.com,那么你应该输入mail.example.com。

3 配置Postfix

3.1 域名配置

编辑main.cf文件,我们需要更改或者添加几个配置:

myhostname:设置Postfix如何称呼本机。我们最好设置成邮件域名的MX记录的域名(如mail.example.com而不是example.com)。EHLO命令后跟着的就是这个配置的内容。不正确的声明可能会导致一些严格的收件方在EHLO命令结束后直接拒收邮件。

mydomain:填写本机服务的邮箱域名,即邮箱地址“@”后面的部分,如example.com。默认为myhostname。

mydestination:设置你要接收的邮箱域名。就是邮箱地址“@”后面的部分。在这里面配置的域名将投递到本机。默认值为本机的主机名构成的域名。

myorigin:设置从本机发出的邮件的默认域名。比如若配置成example.com,那么用户root发出的邮件就为root@example.com。默认为$myhostname。

如邮件服务器MX记录为mail.example.com,邮箱域名为example.com,那么可配置如下:

myhostname = mail.example.com
mydomain = example.com
mydestination = example.com
myorigin = example.com

验证配置

确保Postfix服务开启,在本机telnet localhost 25,若220后正确输出了邮件服务器域名,那么成功了一半了:

3.2 认证配置/账户配置

默认情况下MTA在接收从另一邮局MTA发来的邮件的时候,是不需要进行账户认证的,你也无法要求所有的邮件服务提供商都记住登陆你的邮局的帐号。但是我们的邮局MTA在接收用户连接的时候需要进行认证,否则所有人都可从我们的邮局伪造账户并发送邮件,这当然是不允许的。

SMTP的认证一般使用SASL认证方式。在本节我们主要讨论认证的具体后端设置,下面我们来看看Postfix几种常用的认证配置。

3.2.1 PAM认证

PAM认证是由Cyrus SASL框架支持的,Postfix已经内置这种框架。我们只需要安装SASL数据库软件并配置Postfix如何使用SASL认证。

3.2.1.1 SASL2安装和配置

首先安装软件包sasl2-bin,对于Ubuntu用户:

sudo apt install sasl2-bin

编辑/etc/default/saslauthd,找到并修改:

START=yes
MECHANISMS="pam"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

启动服务:

sudo systemctl start saslauthd
sudo systemctl enable saslauthd

测试认证:

testsaslauthd -u username -p password
0: OK "Success."
3.2.1.2 配置Postfix如何使用SASL认证

在main.cf中添加定义sasl配置文件:

smtpd_sasl_path = smtpd

这个配置文件的路径根据不同的发行版而不同。如Ubuntu使用的路径为/etc/postfix/sasl/。以Ubuntu为例,接下来创建并编辑/etc/postfix/sasl/smtpd.conf,写入:

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

这样Postfix就可使用saslauthd认证了。测试方法见下面。

3.2.2 SASL数据库认证

3.2.2.1 配置Postfix和SASL2

同上,先安装sasl2-bin软件包,然后修改SASL2配置文件/etc/default/saslauthd为:

START=yes
MECHANISMS="sasldb"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

同样地,修改Postfix配置文件/etc/postfix/main.cf:

smtpd_sasl_path = smtpd

修改/etc/postfix/sasl/smtpd.conf,这个和上面也不同:

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

注意这里并没有使用官方文档中的配置。(官方文档中配置适用于未运行在chroot环境下的postfix实例。如果要按照官方文档的配置,还需将数据库文件/etc/sasldb2复制到/var/spool/postfix/etc/下,也不用修改/etc/default/saslauthd中OPTIONS的配置。)

允许postfix读取数据库,将postfix用户添加至sasl组:

sudo adduser postfix sasl

向数据库添加用户:

sudo saslpasswd2 -c -u example.com username

列出用户:

sudo sasldblistusers2

启动相关服务:

sudo systemctl restart postfix
3.2.2.2 测试

为了通过Telnet 25端口测试,我们在Postfix配置文件main.cf中临时添加一条配置,允许通过25端口认证登录(在实际情况中请不要这么做,因为25端口是不加密的,在不加密的情况下进行用户认证非常危险,使用Submission或者SMTPS认证):

smtpd_sasl_auth_enable = yes

然后通过Telnet测试,用户名和密码都是通过BASE64编码方式输入:

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.example.com ESMTP Postfix (Ubuntu)
EHLO test
250-mail.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING
AUTH LOGIN
334 VXNlcm5hbWU6
xxxxx(输入BASE64编码的用户名)
334 UGFzc3dvcmQ6
xxxxx(输入BASE64编码的密码)
235 2.7.0 Authentication successful

测试完成后,别忘了删除main.cf中smtpd_sasl_auth_enable = yes行。

3.2.3 使用Dovecot认证

请参考http://www.postfix.org/SASL_README.html#server_dovecot

3.2.4 使用MySQL认证

请参考http://www.postfix.org/SASL_README.html#auxprop_sql

对于Postfix的SASL认证更加详细的配置可参照http://www.postfix.org/SASL_README.html

3.3 策略配置

3.3.1 收件人策略 smtpd_recipient_restrictions

Postfix可根据邮件的收件人使用不同的策略,在main.cf中使用smtpd_recipient_restrictions配置。常用参数如下表:

参数说明
permit_mynetworks运行$mynetworks选项中列出的网段或主机
permit_sasl_authenticated允许经过认证的连接
reject_unauth_destination拒绝不认识的域名
reject_unlisted_recipient拒绝不在列表中的收件人(收件人白名单)
常用策略参数列表

所有的参数可参考http://www.postfix.org/postconf.5.html#smtpd_client_restrictions

3.3.2 发件人策略 smtpd_sender_restrictions

发件人策略使用smtpd_sender_restrictions配置,默认为全部允许。

3.3.3 传输策略 transport_maps

可指定一个文件配置特定域名邮件的传输方式。一般在main.cf配置如下:

transport_maps = hash:/etc/postfix/transport

编辑/etc/postfix/transport,按照以下格式书写:

gmail.com    relay:[gmail-smtp-in.l.google.com]:587

然后执行postmap生成hash格式文件transport.db:

sudo postmap /etc/postfix/transport

以上例子实现了:所有收件人域名为gmail.com的邮件都发往Gmail MTA的587端口。

3.4 加密认证配置 (SMTPS/Submission)

3.4.1 收件加密认证配置

smtpd_sasl_auth_enable:在SMTP协议中是否启用认证,默认为off,也推荐设置为off,因为在未加密的SMTP协议中传输帐号信息很危险。

smtpd_tls_security_level:这个选项可配置为none, may, encrypt,分别表示在25端口中不使用加密、可以使用加密、强制加密。建议配置为may,但事实上配置为none也完全可以,但不建议配置为encrypt,因为大多数邮局还是愿意明文传输邮件。

3.4.2 发件加密认证配置

smtp_sasl_auth_enable:发件时是否启用认证,是发件认证的总开关。

smtp_sasl_password_maps:发件时认证的账户密码表。一般使用hash文件指定(见下面子小节)

smtp_sasl_mechanism_filter:指定认证数据的发送方式,一般配置为plain, login。

smtp_tls_security_level:发件是否启用加密,建议配置为may。

示例:为特定主机配置认证

有时我们需要将邮件发往需要认证的主机,以下是示例配置:

编辑main.cf:

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_mechanism_filter = login
smtp_sasl_security_options = noanonymous

编辑/etc/postfix/sasl_passwd:

[example.com]  username@example.com:password
[10.0.0.1]     username@another.com:password

生成hash文件:

sudo postmap /etc/postfix/sasl_passwd

重启Postfix,发往example.com和10.0.0.1的邮件将在使用特定用户名和密码认证后发送。

4. 测试发件

可以前往mail-tester.com测试发件情况,通过Telnet尝试发件。不过注意,该网站一天只能免费评测三封邮件。

发表评论