如何在Ubuntu 16.04上设置Postfix邮件服务器
通常,所有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。