邮件服务配置(虚拟域&虚拟用户)

本文首发:https://www.somata.net/2019/virtual_mail_server_config_with_mariadb.html

现在我做的是:

Linux + httpd + php + mariadb + postfix + dovecot + phpMyAdmin + postfixadmin + roundcubemail

这里我将会讲解 如何制作基于 虚拟域和虚拟用户 的邮件服务。需要的软件如下:

这里我已经整理好了 https://pan.baidu.com/s/1TT2EUGRnU2tqaiUwRsPUMQ 提取码:0i6x

再整理好需要的软件之后。 我们开始搭建邮件服务。

关闭selinux

邮件服务有太多的权限要求,为了方便配置, 直接关闭selinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config    # 使用这条命令进行修改
reboot # 重启电脑使其生效

配置yum源,然后开始安装软件

修改yum源

mkdir /root/back    # 建立备份目录
mv /etc/yum.repos.d/* /root/back/ # 将默认配置移动到备份目录
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 下载基础yum源
curl -o /etc/yum.repos.d/CentOS-Epel.repo http://mirrors.aliyun.com/repo/epel-7.repo # 下载扩展yum源
yum makecache # 建立缓存

安装软件

yum install httpd mod_ssl mariadb mariadb-server php dovecot dovecot-mysql vim wget nc php-xml php-mbstring php-mysql php-mcrypt php-imap php-intl php-ldap php-gd bash-completion bash-completion-extras bind bind-utils

配置LAMP环境,同时装载phpMyAdmin

启动lamp环境

systemctl enable httpd
systemctl enable mariadb
systemctl start httpd
systemctl start mariadb

初始化数据库:

mysql_secure_installation



开启防火墙

firewall-cmd --add-service=http    # 临时开启防火墙,允许http服务通过
# 临时防火墙再重启后就会失效。 后面会配置永久生效

上传phpMyAdmin-3.4.3-all-languages.tar.xz, 上传方法 和 过程 省略

# 切换到上传目录
tar -xf phpMyAdmin-3.4.3-all-languages.tar.xz # 解压web程序
mv phpMyAdmin-3.4.3-all-languages /var/www/html/ # 移动到web
根目录下
ln -s phpMyAdmin-3.4.3-all-languages phpMyAdmin # 创建一个软连接便于访问
cd phpMyAdmin # 切换到phpMyAdmin目录
cp config.sample.inc.php config.inc.php # 复制配置文件
openssl rand -base64 32 # 生成一串随机数, 然后需要导入到配置文件中。 自行复制
vim config.inc.php # 编辑配置文件



这样phpMyAdmin 就可以正常访问了

装载postfixadmin

同样的先上传postfixadmin。

# 切换到上传目录
tar -xf postfixadmin-3.2.tar.gz # 解压文件
mv postfixadmin-3.2 /var/www/html/ # 移动到web根目录
ln -s postfixadmin-3.2/public/ postfixadmin # 创建软连接便于访问

后面的步骤开始初始化postfixadmin。 如有疑问, 请查看 postfixadmin-3.2/INSTALL.TXT

创建数据库用户

通过phpMyAdmin 创建用户



配置用户信息。然后新建用户。 即可

通过命令行完成配置

mysql -uroot -p123456    # mysql 通过客户端配置数据库。 -p 后面直接跟密码

create database postfix;
GRANT ALL ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY 'postfixadmin'; # 设定权限, 由于没有检测到用户。所以同时创建用户
FLUSH PRIVILEGES; # 刷新权限

创建和编辑配置文件

# 切换到postfixadmin 的根目录
# cd /var/www/html/postfixadmin-3.2/
vim config.local.php # 编辑新建配置文件。 然后输入以下内容
<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix'; $CONF['configured'] = true;
?>
vim config.inc.php    # 编辑第二个配置文件

找到,并修改如下内容

$CONF['configured'] = true;

$CONF['default_language'] = 'cn';

$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix'; $CONF['admin_email'] = 'root@localhost';

这样就完成了postfix的基础配置

还有, 需要创建一个缓存目录

mkdir templates_c    # 创建缓存目录
chown -R apache:apache templates_c # 更改属主组

进入postfix配置界面,继续完成配置

进入setup.php完成配置。



然后拉到底。 添加以下setup.php的密码



然后创建管理员用户。



然后出现如下提示,即为成功:



然后登入账户。





新建somata.com域



创建用户



创建用户mail1 和 mail2





提示如下,即为成功

那么到此为止, postfixadmin 的配置就已经完成了。 后面会开始 postfix 和 dovecot 的服务配置。

注意: 以上创建域 和 用户 等 其实都是存储在数据库当中,并非真是存在的用户。 所以我们需要通过配置postfix 和 dovecot 通过读取数据库中的信息来完成配置。

配置DNS服务器

这里我使用bind 来做DNS服务器。

DNS 我就不多解释了。直接上配置文件

配置/etc/named.conf

options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "somata.com" IN {
type master;
file "named.somata.com";
};

配置/var/named/named.somata.com

$TTL 1D
somata.com. IN SOA ns.somata.com. root.somata.com. (
2019052701 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.somata.com.
MX 10 mail.somata.com.
ns A 172.16.102.141
mail A 172.16.102.141
www A 172.16.102.141

启动named

chgrp named /var/named/named.somata.com
systemctl restart named
firewall-cmd --add-service=dns

配置postfix

postfixadmin中 也介绍了如何配置postfix, 他的介绍在这里DOCUMENTS/POSTFIX_CONF.txt 如果没有看懂我接下来的步骤,可以尝试去看看这个文件

添加用于读取和写入邮件用的用户:

groupadd -g 2000 vmail
useradd -r -u 2000 -g 2000 -d /var/spool/mail/vmail -c "Virtual mail user" vmail
# 这里还是需要注意。 UID必须超过1000, 我也不知道为什么。

配置/etc/postfix/main.cf

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
# 配置主机名等信息
myhostname = mail.somata.com
mydomain = somata.com
myorigin = $mydomain
# 配置监听端口
inet_interfaces = all
inet_protocols = ipv4
# 配置接受的域列表。 注意这里绝对不能添加与虚拟域相同的域名。否则会导致邮件无法发送。
mydestination = $myhostname, localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP $mail_name
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
# 以下是虚拟用户配置
# 设置postfix 读取和写入是的uid 和 gid
virtual_gid_maps = static:2000
virtual_uid_maps = static:2000
# 虚拟域, 这里配置通过mysql来实现。 这里指定的文件 后面就会创建
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
# 虚拟域中,的别名设置
virtual_alias_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
# 虚拟域中,用户邮箱设置
virtual_mailbox_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
# 设置基本路径。 上面查询到的邮箱地址是相对的。所以需要设置基本路径来确认邮箱位置。
virtual_mailbox_base = /var/mail/vmail
# 以上的这些虚拟化配置其实还可以简化为如下。同样可以使用,但是缺少了别名的功能
#virtual_gid_maps = static:2000
#virtual_uid_maps = static:2000
#virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
#virtual_mailbox_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf
#virtual_mailbox_base = /var/mail/vmail # 用户认证配置。 smtp 可以不用设置用户认证。也能使用
# 拒绝非正常的客户端
broken_sasl_auth_clients = yes
# 启用sasl认证
smtpd_sasl_auth_enable = yes
# 配置认证方式为dovecot
smtpd_sasl_type = dovecot
# 配置认证套接字的相对路径
smtpd_sasl_path = private/auth
# 配置拒绝规则
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,reject_unknown_sender_domain
# permit_mynetworks 允许本地网络发送邮件
# permit_sasl_authenticated 允许通过认证的用户发送邮件
# reject_unauth_destination 拒绝不是发往本地的邮件
# reject_unknown_sender_domain 拒绝未知发件域名

然后我们通过postfixadmin提供的脚本生成以上虚拟域所需要的文件

切换到postfix的安装目录,执行如下命令

su nobody -s /bin/bash -c 'bash POSTFIX_CONF.txt'



然后这里会返回文件路径,我们进入脚本创建的目录,复制到指定目录

mkdir /etc/postfix/sql
cp /tmp/postfixadmin-D4SOxG/* /etc/postfix/sql/

配置dovecot

postfixadmin 也提供了的 dovecot的配置方法:DOCUMENTS/DOVECOT.txt 如果我的配置没有看懂可以选择查看

先配置第一个文件dovecot.conf

protocols = pop3 imap    # 开启pop3 和 imap 服务
listen = * # 监听ipv4端口

然后配置第二个文件conf.d/10-auth.conf

disable_plaintext_auth = no    # 设置关闭强制加密认证
auth_mechanisms = plain login # 设置认证方法
#!include auth-system.conf.ext # 注释使用auth-system的认证方式
!include auth-sql.conf.ext # 使用auth-sql的认证方式

配置第三个文件conf.d/10-mail.conf

mail_location = maildir:/var/mail/vmail/%d/%n    # 设置邮箱格式
first_valid_uid = 2000 # 设置读取和写入的uid 下面使gid
first_valid_gid = 2000

配置第三个文件conf.d/10-ssl.conf

ssl = no    # 取消ssl加密    注释下面内容
#ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
#ssl_key = </etc/pki/dovecot/private/dovecot.pem

配置第四个文件conf.d/10-master.conf

  unix_listener /var/spool/postfix/private/auth {    # 为postfix 提供认证服务套接字
mode = 0666 # 设置权限
user = postfix # 设置属主
group = postfix # 设置属组
}

配置第五个文件dovecot-sql.conf.ext

driver = mysql    # 设置驱动为mysql
default_pass_scheme = MD5-CRYPT # 设置加密方法为MD5
connect = host=localhost dbname=postfix user=postfix password=postfixadmin # 设置连接参数
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1' # 设置查询密码的sql语句
user_query = SELECT CONCAT('/var/mail/vmail/', maildir) AS home, 2000 AS uid, 2000 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active='1' # 设置查询用户和邮箱的sql语句

测试是否可以使用

添加临时防火墙

firewall-cmd --add-service=pop3
firewall-cmd --add-service=smtp
firewall-cmd --add-service=dns

配置mariadb 记录 日志, 用于查看是否正常。 如果有问题先看看/var/log/mariadb/access.log 中的查询请求是否正常。

[mysqld]
log=/var/log/mariadb/access.log
systemctl restart mariadb

然后我们使用foxmail 来测试 服务是否可用。





这里我们也可以看到,收到了邮件,完全可以使用了。

装载webmail

这里我使用了roundcubemail, 下面是配置步骤。

tar -xf roundcubemail-1.3.9-complete.tar.gz    # 解压roundcubemail
mv roundcubemail-1.3.9 /var/www/html/ # 移动
cd /var/www/html/ # 切换目录
ln -s roundcubemail-1.3.9 webmail # 创建一个软连接 方便访问

与 postfix 相同, 进入 phpMyAdmin 或者 命令行。 创建数据库用户



然后进入安装界面, 这里先确认环境是否可以使用



然后拉到底,点击next

到了第二步。 配置 config

  1. 配置数据库

  2. 配置imap

  3. 设置语言 和 主题



    最后点击 CREATE CONFIG

然后根据提示将返回内容保存至指定位置

vim /var/www/html/webmail/config/config.inc.php    # 编辑这个文件。 然后复制上图的内容即可。



最后回到登入界面。 使用邮件账号登入即可。



用户界面如下, roundcube 还是挺好看。而且挺好用的:

安全配置

上面的所有步骤都已经配置完成了,那么现在就开始安全方便的配置。 比如说这些服务如果是明文传输肯定是会泄露的。所以都需要配置SSL。 然后还需要配置防火墙,禁止连接其余端口。

  1. httpd 的SSl 配置

    这里我们已经安装了mod_ssl 。 而且mod_ssl 已经为我们提供了默认的配置。 所以我们只需要修改以下使用的密钥即可。

这里我在自己的服务器上使用openssl做了一个证书服务器。 并且已经为测试主机安装了证书 。 操作步骤就省略了。

# 创建证书
openssl genrsa -out private/postfix.pem 2048 # 创建密钥
openssl req -new -key private/postfix.key -out postfix.csr # 创建证书申请
openssl ca -in postfix.csr -out certs/postfix.crt -days 365 # 使用证书服务签发证书

编辑文件/etc/httpd/conf.d/ssl.conf

主要修改如下2点:

SSLCertificateFile /etc/pki/tls/certs/postfix.crt
SSLCertificateKeyFile /etc/pki/tls/private/postfix.key

编辑文件/etc/httpd/conf/httpd.conf

# URL重定向。 设置自动重定向到www.somata.com
<VirtualHost *:80>
RewriteEngine on
Rewritecond %{HTTPS} !=on
RewriteRule ^(.*)?$ https://www.somata.com$1 [L,R]
</VirtualHost>
# 限制 postfixadmin 和 phpMyAdmin 的访问权限
<Directory "/var/www/html/postfixadmin-3.2/">
Order allow,deny
allow from 172.16.102.188/32
deny from all
</Directory>
<Directory "/var/www/html/phpMyAdmin-3.4.3-all-languages/">
Order allow,deny
allow from 172.16.102.188/32
deny from all
</Directory>
<Directory "/var/www/html/postfixadmin/">
Order allow,deny
allow from 172.16.102.188/32
deny from all
</Directory>
<Directory "/var/www/html/phpMyAdmin/">
Order allow,deny
allow from 172.16.102.188/32
deny from all
</Directory>

然后移除 几个web程序的初始化 网页

mv /var/www/html/postfixadmin-3.2/public/setup.php  /tmp/
mv /var/www/html/roundcubemail-1.3.9/installer/ /tmp/
mv /var/www/html/phpMyAdmin-3.4.3-all-languages/setup/ /tmp/
  1. postfix 配置支持SSL

    编辑/etc/postfix/main.cf
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.crt
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key

然后再编辑/etc/postfix/master.cf

smtps     inet  n       -       n       -       -       smtpd    # 去除这一行的注释即可
systemcl restart postfix    # 重启postfix服务
  1. DOVECOT 支持SSL

    编辑/etc/dovecot/conf.d/10-ssl.conf
ssl = yes
ssl_cert = </etc/pki/tls/certs/postfix.crt
ssl_key = </etc/pki/tls/private/postfix.key
systemctl restart dovecot    # 重启dovecot服务
  1. 配置防火墙
firewall-cmd --permanent --add-service=dns
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=pop3s
firewall-cmd --permanent --add-service=smtps
firewall-cmd --reload # 重载服务。 使其生效
  1. 取消日志记录

    编辑/etc/my.cnf
#log=/var/log/mariadb/access.log    # 注释添加的内容
systemctl restart mariadb
  1. 配置开机自启动
systemctl enable mariadb
systemctl enable httpd
systemctl enable dovecot
systemctl enable named
# postfix 再安装的时候就已经使开机自启动的了。无需再次配置

本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【63P7QJPF】获取授权信息。

邮件服务配置(虚拟域&虚拟用户)的更多相关文章

  1. linux 学习第十八天学习(DNS分离解析、DHCP配置、邮件服务配置)

    DNS分离解析技术 yum install bind-chroot systemctl restart named systemctl enable named vim /etc/named.conf ...

  2. CentOS6 mail邮件服务配置

    mail服务配置 环境: [root@m01 ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@m01 ~]# uname -m ...

  3. 工程师技术(二):postfix基础邮件服务、postfix空客户端邮件服务、搭建mariadb数据库系统、配置一个数据库、使用数据库查询

    一.postfix基础邮件服务 目标: 本例要求在虚拟机server0上配置 postfix 基础服务,具体要求如下: 1> 监听本机的所有接口    2> 将邮件域和邮件服务主机名都改为 ...

  4. postfix基础邮件服务

                                                              postfix基础邮件服务  案例1:postfix基础邮件服务 1.1 问题 本例 ...

  5. bitnami-redmine邮件告警配置

    配置 bitnami-redmine的配置文件与单纯的redmine配置文件可能并不相同,在这里我们需要打开一下配置文件: /opt/bitnami/apps/redmine/htdocs/confi ...

  6. 配置postfix支持虚拟域和虚拟用户

    请先看基础篇  https://www.cnblogs.com/hellojackyleon/p/9281620.html https://sourceforge.net/projects/couri ...

  7. Linux中Postfix虚拟用户及虚拟域(六)

    Postfix基于虚拟用户虚拟域的邮件架构 上图是一个几乎完整的邮件系统架构图,这里基于Mysql数据库进行用户认证,不管是Postfix.Dovecot.webmail都需要去Mysql数据库中进行 ...

  8. centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 访问控制 apache rewrite 配置开机启动apache tcpdump 第二十节课

    centos    LAMP第二部分apache配置  下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转  配置apache的访问日志  配置静态文件缓存  配置防盗链 ...

  9. vsftpd搭建ftp服务,并实现虚拟用户访问

    安装vsftpd服务: yum install vsftpd -y [root@wadeson ~]# rpm -ql vsftpd /etc/logrotate.d/vsftpd /etc/pam. ...

随机推荐

  1. JAVA复习笔记02

    16.interface中的成员变量默认为public static final类型,方法只能是public(默认为public) 17.内部类访问外部类成员: Outer.this.num; 18. ...

  2. Spark2.4.0源码——DAGScheduler

    前言 Spark会将用户提交的作业看作一个job,在提交的时候首先将job转换为一系列的RDD,并按照RDD之间的依赖关系构建DAG(有向无环图),DAGScheduler会按照RDD依赖的不同将DA ...

  3. nginx实现最简单的直播

    系统环境 [root@yunwei-test live]# cat /etc/redhat-release CentOS Linux release (Core) [root@yunwei-test ...

  4. Fire! UVA - 11624 (两步bfs)

    题目链接 题意 人要从迷宫走出去,火会向四个方向同时扩散 分析 两步bfs,先出火到达各地时的时间(设初始时间为0,人每走一步为1s,在着一步内火可以向四周可触及的方向同时扩散),然后在bfs人,人能 ...

  5. 该如何真正进入SEO行业?

    今天一个多年的朋友突然问我这个问题,他作为一个seo局外人,感觉SEO挺神秘,我认为要入行就要先了解一个SEO是什么职业,它的工作有那些,然后再考虑怎样进行学习或培训. 一.查看网站状态 seo人员每 ...

  6. ZooKeeper入门(四) Zookeeper监视(Watches)

    1 简介 Zookeeper 所有的读操作——getData(), getChildren(), 和 exists() 都 可以设置监视(watch),并且这些watch都由写操作来触发:create ...

  7. HDU 5527:Too Rich(DFS+贪心)***

    题目链接 题意 给出p块钱,现在要用十种硬币凑出,每种硬币有c[i]个,问最多能用多少个硬币. 思路 首先确定,对于每个硬币就是能用小的替换就不用大的. 所以,可以先把硬币尽量用小的替换,如果小的不够 ...

  8. MYSQL事务、锁

    MYSQL事务 事务: 原子性 : 要么都执行,要么都不执行. 一致性: 结果要么都成功 ,要么都失败. 隔离性: 事务之间是互不干扰的 持久性: 事务一旦被提交,对数据库的改变是永久性的. 事务的隔 ...

  9. django基础知识之Ajax:

    使用Ajax 使用视图通过上下文向模板中传递数据,需要先加载完成模板的静态页面,再执行模型代码,生成最张的html,返回给浏览器,这个过程将页面与数据集成到了一起,扩展性差 改进方案:通过ajax的方 ...

  10. 【深入浅出-JVM】(3):浮点数

    -5 浮点数推导 二进制转十进制 1 10000001 01000000000000000000000 1 10000001 101000000000000000000000 如果指数位不全为 0 则 ...