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

本文首发: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. 性能监控: SPF4J介绍

    1. 总体介绍 性能测试是一项在软件生命开发周期中总是被置于最后一环的活动.我们经常依靠 Java profilers 去帮助发现性能问题. 在这篇文章中,我们将会学习关于 Java 的简单性能测试框 ...

  2. Ruby中的常量:引号、%符号和heredoc

    数值字面量 没什么好说的,唯一需要说明的是分数字面量:数值后加上一个后缀字母r表示分数字面量. # 整数字面量 0 1 100 10_000_001 # 千分位 # 浮点数字面量 0.1 1.0 1. ...

  3. 设计和编写一个异步通用Picker选择器,用于时间日期、城市、商品分类的选择

    目录 一.功能规划 二.最底层基础实现 (1)Picker界面和功能实现 (2)不同类型的选择器基础实现 三.数据源层 (1)时间日期 (2)多级同步分类,如:城市 (3)多级异步分类,如:城市 四. ...

  4. Oracle基础学习笔记

    Oracle基础学习笔记 最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时 ...

  5. 十分钟教你理解TypeScript中的泛型

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://blog.bitsrc.io/understanding-generics-in-t ...

  6. 判断List中是否含有某个实体bean

    注意:使用List.contains(Object object)方法判断ArrayList是否包含一个元素对象(针对于对象的属性值相同,但对象地址不同的情况),如果没有重写List的元素对象Obje ...

  7. Socket编程(C语言实现):socket()函数英文翻译

    最近开始研究使用Socket API来网络编程,想着把自己的感想.感悟写下来.我发现在编程之外还有不少概念性的东西要学习.我觉得应该有以下几点吧: 1.得了解下计算机网络的基本概念,如OSI的7层模型 ...

  8. 第九章 webase 分布式中间件平台快速部署

    鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407 参考资料:https://webasedoc.r ...

  9. Gin 框架 - 使用 logrus 进行日志记录

    目录 概述 日志格式 Logrus 使用 推荐阅读 概述 上篇文章分享了 Gin 框架的路由配置,这篇文章分享日志记录. 查了很多资料,Go 的日志记录用的最多的还是 github.com/sirup ...

  10. Kafka FAQ

    报错如下: Unable to read additional data from client sessionid 0x15d2c867a770006 使用的kafka自带的zookeeper,测试 ...