如何在Ubuntu 16.04上设置Postfix邮件服务器

时间:2020-03-05 15:32:47  来源:igfitidea点击:

通常,所有MoverServers都包含三个主要组件:MTA,MDA和MUA。
每个组件在移动和管理电子邮件的过程中扮演特定角色,并且对于确保正确的电子邮件传递非常重要。
因此,设置邮件服务器是涉及这些组件的正确配置的难度过程。
最好的方法是逐个安装和配置每个组件,确保每个都有工作并逐步构建邮件服务器。

在本文中,我正在提供关于如何使用Postix(MTA)和DoveCot(MDA)在Ubuntu 16.04服务器上配置邮件服务器的教程,用于使用外部数据库(MySQL)来管理虚拟用户。
首先让我们从准备工作开始,以构建我们的邮件服务器。

安装包

首先,我们需要更新我们的APT存储库包,并开始安装所需的Postfix和Dovecot软件包。

root@ubuntu:~# apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql

在PostFix安装期间,设置窗口将弹出初始配置。
我们需要选择"互联点"并在安装阶段将FQDN设置为我们的系统邮件名称。
这会继续安装所需的包如下。

Postfix is now set up with a default configuration. If you need to make
changes, edit
/etc/postfix/main.cf (and others) as needed. To view Postfix configuration
values, see postconf(1).
After modifying main.cf, be sure to run '/etc/init.d/postfix reload'.
Running newaliases
Setting up postfix-mysql (3.1.0-3) ...
Processing triggers for libc-bin (2.23-0ubuntu3) ...
Processing triggers for ureadahead (0.100.0-19) ...
Processing triggers for systemd (229-4ubuntu4) ...
Processing triggers for ufw (0.35-0ubuntu2) ...
Processing triggers for dovecot-core (1:2.2.22-1ubuntu2) ..

创建一个用于管理邮件用户的数据库

下一步是创建一个数据库,用于在邮件服务器上管理电子邮件用户和域。
正如我之前所说的那样,我们正在使用此MySQL数据库管理电子邮件用户。
如果运行此命令未安装,我们可以安装mysql apt-get安装mysql-server-5.7.

我们将创建一个名为"lnmailserver"的数据库,其中三个表如下:

  • 虚拟域:用于管理域
  • 虚拟用户:用于管理电子邮件用户
  • 虚拟别名:用于设置别名

让我们使用所有这些表创建我们的数据库。

  • 创建名为lnmailserver的数据库。
mysql> CREATE DATABASE lnmailserver;
Query OK, 1 row affected (0.00 sec)
  • 创建DB用户LNMailuser并使用密码授予对此数据库的访问权限。
mysql> GRANT SELECT ON lnmailserver.* TO 'lnmailuser'@'127.0.0.1' IDENTIFIED BY 'lnmail123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
  • 切换到数据库LNMailServer并创建我们的三个表,即具有规范和表格格式的Virtual_Domains,Virtual_Users和Virtual_aliases。
mysql> USE lnmailserver;
Database changed
mysql> CREATE TABLE `virtual_domains` (
-> `id` INT NOT NULL AUTO_INCREMENT,
-> `name` VARCHAR(50) NOT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE `virtual_users` (
-> `id` INT NOT NULL AUTO_INCREMENT,
-> `domain_id` INT NOT NULL,
-> `password` VARCHAR(106) NOT NULL,
-> `email` VARCHAR(120) NOT NULL,
-> PRIMARY KEY (`id`),
-> UNIQUE KEY `email` (`email`),
-> FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.03 sec)
mysql> CREATE TABLE `virtual_aliases` (
-> `id` INT NOT NULL AUTO_INCREMENT,
-> `domain_id` INT NOT NULL,
-> `source` varchar(100) NOT NULL,
-> `destination` varchar(100) NOT NULL,
-> PRIMARY KEY (`id`),
-> FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)
  • 根据我们的要求将域名,用户和别名添加到每个表中。
mysql> INSERT INTO `lnmailserver`.`virtual_domains`
-> (`id` ,`name`)
-> VALUES
-> ('1', 'theitroadmail.com'),
-> ('2', 'ubuntu.theitroadmail.com');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> INSERT INTO `lnmailserver`.`virtual_users`
-> (`id`, `domain_id`, `password` , `email`)
-> VALUES
-> ('1', '1', ENCRYPT('blogger123', CONCAT('$', SUBSTRING(SHA(RAND()), -16))), '[email protected]'),
-> ('2', '1', ENCRYPT('blogger321', CONCAT('$', SUBSTRING(SHA(RAND()), -16))), '[email protected]');
Query OK, 2 rows affected, 2 warnings (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 2
mysql> INSERT INTO `lnmailserver`.`virtual_aliases`
-> (`id`, `domain_id`, `source`, `destination`)
-> VALUES
-> ('1', '1', '[email protected]', '[email protected]');
Query OK, 1 row affected (0.00 sec)
  • 验证每个表内容
mysql> select * from virtual_domains;
+----+-------------------------+
| id | name |
+----+-------------------------+
| 1 | theitroadmail.com |
| 2 | ubuntu.theitroadmail.com |
+----+-------------------------+
2 rows in set (0.00 sec)
mysql> select * from virtual_users;
+----+-----------+------------------------------------------------------------------------------------------------------------+---------------------------+
| id | domain_id | password | email |
+----+-----------+------------------------------------------------------------------------------------------------------------+---------------------------+
| 1 | 1 | $da4aa6fc680940d4$jt1plE8Lvo4hcjdP3N0pNxSC/o1ZsN4mpJ4WCcwk2mSqyY7/2l4ayyI7GcipeTf0uwzk5HnWbjddvv/jGomh41 | [email protected] |
| 2 | 1 | d2dc2e68ab56f6$L2b/D44yuT7qXsw22kTFPfxTbEbUuRDhr0RDoBnRc/q/LGcRF3NsLQCyapXdYKyA2zkSE9MJIXL7nHAbbCmlO. | [email protected] |
+----+-----------+------------------------------------------------------------------------------------------------------------+---------------------------+
2 rows in set (0.00 sec)
mysql> select * from virtual_aliases;
+----+-----------+-----------------------+---------------------------+
| id | domain_id | source | destination |
+----+-----------+-----------------------+---------------------------+
| 1 | 1 | [email protected] | [email protected] |
+----+-----------+-----------------------+---------------------------+
1 row in set (0.00 sec)
mysql > exit

配置Postfix.

我们的下一步是根据我们需要接受SMTP连接的配置计划修改Postfix配置。
在对配置进行任何更改之前,总是建议为文件备份备份。

root@ubuntu:~# cp -rp /etc/postfix/main.cf /etc/postfix/main.cf-bkp

现在我们可以打开文件并进行以下更改。

  • 修改以下条目以启用TLS对用户连接的支持,请指定用于保护连接的SSL证书。
This section is modified from:
#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#smtpd_use_tls=yes
#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
To :
smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem
smtpd_tls_key_file=/etc/ssl/private/dovecot.key
smtpd_use_tls = yes
smtpd_tls_auth_only = yes

我正在使用这里指定的免费Dovecot SSL证书。
我们可以使用以下命令生成Dovecot Selo签名的SSL证书。
如果我们对主机名有效的SSL证书,则可以指定这些。

openssl req -new -x509 -days 1000 -nodes -out "/etc/ssl/certs/dovecot.pem" -keyout "/etc/ssl/private/dovecot.pem"
  • 我们需要将这些TLS参数添加到Postfix配置,这使得Postfix使用DoveCot进行身份验证并初始化连接。
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated permit_mynetworks reject_unauth_destination
  • 我们需要注释"MyDestination"的默认条目并更新它以单独使用"localhost"。
mydestination = localhost
  • 确认MyHostName部分,无论是正常设置为FQDN主机名。
root@ubuntu:~# grep myhostname /etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
myhostname = ubuntu.theitroadmail.com
  • 修改此参数使Postfix能够使用DoveCot的LMTP而不是其自己的LDA来将电子邮件保存到本地邮箱,从而为MySQL数据库中列出的所有域都启用本地邮件传递。
virtual_transport = lmtp:unix:private/dovecot-lmtp
  • 最后,但并非最不重要的是,我们需要告诉Postfix我们正在使用外部数据库来管理域,用户和别名。我们需要添加配置路径以从数据库表中获取这些详细信息。
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

现在我们需要逐个创建上面提到的这些文件。
请看下面的文件详细信息:

/etc/postfix/mysql-virtual-mailbox-domains.cf.

root@ubuntu:~# cat /etc/postfix/mysql-virtual-mailbox-domains.cf
user = lnmailuser
password = lnmail123
hosts = 127.0.0.1
dbname = lnmailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
root@ubuntu:~#

/etc/postfix/mysql-virtual-mailbox-maps.cf.

root@ubuntu:~# cat /etc/postfix/mysql-virtual-mailbox-maps.cf
user = lnmailuser
password = lnmail123
hosts = 127.0.0.1
dbname = lnmailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'
root@ubuntu:~#

/etc/postfix/mysql-virtual-alias-maps.cf.

root@ubuntu:~# cat /etc/postfix/mysql-virtual-alias-maps.cf
user = lnmailuser
password = lnmail123
hosts = 127.0.0.1
dbname = lnmailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'

这些文件描述了Postfix如何与外部数据库连接。
我们需要在进行这些变化后重新启动Postfix。

root@ubuntu:~# service postfix restart

我们需要运行以下命令以确认连接并检查Postfix是否能够从数据库获取所需信息。

  • 要检查Postfix是否从数据库中找到域,我们可以运行此功能。如果尝试成功,这应该返回'1'。
root@ubuntu:/etc/ssl/certs# postmap -q theitroadmail.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
1
  • 要检查Postfix是否从数据库中查找所需的电子邮件地址,我们可以运行此功能。如果它成功,这也应该返回'1'。
root@ubuntu:/etc/ssl/certs# postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
1
  • 要检查POSFIX是否从数据库中找到电子邮件转发器,我们可以运行此功能。如果尝试成功,则应返回电子邮件转发器集。
root@ubuntu:/etc/ssl/certs# postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-alias-maps.cf
[email protected]

请注意:我们可以使用Postfix在端口587上使用Postfix进行安全地连接,通过在PostFix Master Computation:/etc/postfix/master.cf中取消注释以下部分来打开端口。

在对配置进行任何更改后,我们需要重新启动Postfix。
通过使用Telnet命令,我们可以确认端口是否打开。

配置Dovecot.

我们的下一步是配置我们的MDA,以允许POP3或者IMAP协议和其他配置设置连接到外部数据库和Postfix。
我们主要是修改以下文件。

/etc/dovecot/dovecot.conf
/etc/dovecot/conf.d/10-mail.conf
/etc/dovecot/conf.d/10-auth.conf
/etc/dovecot/conf.d/auth-sql.conf.ext
/etc/dovecot/dovecot-sql.conf.ext
/etc/dovecot/conf.d/10-master.conf
/etc/dovecot/conf.d/10-ssl.conf

在进行任何配置更改之前,总是建议备份这些文件。
我们可以逐个修改每个文件。

修改DoveCot主配置文件:/etc/dovecot/dovecot.conf

  • 默认情况下,以下设置取消注释。但我们需要确保它取消关注。
!include conf.d/*.conf
  • 我们可以在此指令中启用所有必需的协议。如果我们需要启用POP3,我们可以将POP3添加到此行,并确保安装所需的Dovecot软件包"DoveCot-Pop3d"以启用。
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp

修改Dovecot邮件配置文件:/etc/dovecot/conf.d/10-mail.conf

  • 我们需要使用邮件存储路径在配置和更新中找到以下参数"mail_location"。我的邮件文件夹位于"/var/mail/vhosts /"文件夹中。因此,我修改了文件路径,如下所示:
mail_location = maildir:/var/mail/vhosts/%d/%n
  • 我们需要将"mail_privileged_group"参数设置为"mail"。
mail_privileged_group = mail

完成此操作后,我们需要使我们为邮件文件夹设置正确的所有权和权限。
为我们已经在此文件夹中的MySQL表中注册的每个域创建邮件文件夹"/var/mail/vhosts"并设置适当的所有权/权限。

root@ubuntu:~# ls -ld /var/mail
drwxrwsr-x 2 root mail 4096 Apr 21 16:56 /var/mail
root@ubuntu:~# mkdir -p /var/mail/vhosts/theitroadmail.com
Created a separate user/group named "vmail" with an id 5000 and changed the mail folders ownerships to that.
root@ubuntu:~# groupadd -g 5000 vmail
root@ubuntu:~# useradd -g vmail -u 5000 vmail -d /var/mail
root@ubuntu:~# chown -R vmail:vmail /var/mail

修改Dovecot身份验证文件:/etc/dovecot/conf.d/10-auth.conf

  • 禁用纯文本身份验证以通过将以下参数修改为"是"来确保安全性。
disable_plaintext_auth = yes
  • 修改以下"auth_mechanisms"参数如下所示:
auth_mechanisms = plain login
  • 我们需要通过解读auth-sql.conf.ext行如下取消注释所提到的行并启用MySQL身份验证:
#!include auth-system.conf.ext
!include auth-sql.conf.ext

修改身份验证SQL文件:/etc/dovecot/conf.d/auth-sql.conf.ext

确保MySQL身份验证文件如下所示。

修改Dovecot + MySQL配置文件:/etc/dovecot/dovecot-sql.conf.ext

  • 我们需要取消注释"驱动程序"参数并设置为MySQL,如下所示:
driver = mysql
  • 根据我们的数据库名称和用户修改和设置连接参数。
connect = host=127.0.0.1 dbname=lnmailserver user=lnmailuser password=lnmail123
  • 将Default_pass_scheme修改为SHA-512和Password_Query行,如下所示:
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

请注意:设置/etc/dovecot目录上的权限,以便vmail用户可以使用它。

chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

修改Dovecot主配置文件:/etc/dovecot/conf.d/10-master.conf

我们在此配置文件中修改四个部分。
IMAP部分,本地邮件传输部分,身份验证部分和上次验证工作过程部分。
请参阅下面每个部分的屏幕截图以查看修改:

修改SSL配置:/etc/dovecot/conf.d/10-ssl.conf

我们正在修改此部分以启用传入/传出连接的SSL。
此配置设置是可选的。
但我推荐这些安全。

  • 将SSL参数更改为必填
ssl = required
  • 为我们的配置指定SSL Cert和密钥文件位置。我们可以查看屏幕截图以获取更多详细信息。

所有这些修改后,我们需要重新启动Dovecot。