iRedMail是一个Linux下的全栈邮件服务器套件,包括了Postfix、Dovecot、Amavisd、Policyd (iRedAPD)、网页服务器、数据库后端等开源程序。你也可以把它理解为邮件服务器的LNMP.org。它不仅简化了安装程序(无需手动编辑配置文件,只需要回答几个简单的问题即可),还提供了一些简便的工具来管理邮件服务器,比如iRedAdmin面板。更多关于这个邮件服务器套件的介绍可以看一下百度百科官网(官网在大陆需要使用正确姿势才能访问)。

这篇文章讲述了如何在一台已经安装了网页服务器(Nginx/Apache)和MySQL(或MariaDB)数据库的服务器上安装、配置iRedMail,包括DKIM/SPF等(这个以后慢慢更新)。

11月5日更新:增加步骤四-安装Roundcube Webmail
11月7日更新:增加步骤五~七-配置SPF/DKIM/DMARC

官方的文档要求安装在一个干净的系统内,就是说系统不应该安装有Postfix、Dovecot、Amavisd、Policyd (iRedAPD)、网页服务器、数据库后端等程序。但是我的系统(相信很多人也是一样)因为是生产服务器已经安装有网页服务器和数据库服务器,另外找一个服务器来弄不仅麻烦而且也浪费资源,所以写这么一篇教程讲如何在一个不干净的Ubuntu系统内安装这个套件。注意一下,我这里的不干净仅指安装过数据库和网页服务器,剩余程序我的服务器也是没有安装过的(你可以使用apt purge清理)。

下面的教程中有用到http://www.iredmail.org的地方,如果你服务器在国内,请替换为http://173.254.22.21。这个是官方的镜像,至于为什么要这么弄大家都懂。

我服务器的配置:

  • OS: Ubuntu Xenial 16.04.3 LTS
  • 网页服务器: LNMP.org – Nginx + Apache + 另行安装的MariaDB集群 + PHP 7.1(PHP在iRedMail用不上因为面板是python写的)
  • 我用的是LANMP,本教程应该也适用于LAMP因为不需要碰Nginx。
  • Apache默认没带mod_wsgi,这个插件是iRedAdmin面板所必须的,过后我会讲解如何编译安装。
  • 官方建议流量不大的服务器也应至少有2G内存,并且UID 2000,2001和2002没有被占用。

步骤一:使用官方脚本完成基本安装

  • 在MySQL数据库内创建一个具有所有权限的用户,即与root权限相等的用户。在下面的步骤中,这个用户的名字会用DB_USERNAME、密码会用DB_PASSWORD代替。创建完成后请使用mysql -u DB_USERNAME -p测试是否能正常连接。
  • 执行下面代码。请注意,你需要在管理员权限(通常为root权限)下执行这些代码
wget https://bitbucket.org/zhb/iredmail/downloads/iRedMail-0.9.7.tar.bz2
tar xvf iRedMail-0.9.7.tar.bz2
cd iRedMail-0.9.7
USE_EXISTING_MYSQL='YES' \
    MYSQL_SERVER_ADDRESS='127.0.0.1' \
    MYSQL_SERVER_PORT='3306' \
    MYSQL_ROOT_USER='DB_USERNAME' \
    MYSQL_ROOT_PASSWD='DB_PASSWORD' \
    MYSQL_GRANT_HOST='%' \
    IREDMAIL_MIRROR='http://www.iredmail.org' #如果你是国内的服务器请替换这一行,看上面的说明 \
    bash iRedMail.sh
  • 接下来会显示一个窗口,第一个欢迎信息选Yes就行。第二个问题询问邮件储存位置,如果没什么特殊需求保留缺省(/var/vmail)即可。第三个问题问是用什么网页服务器,选择No Web Server,因为我们已经安装了网页服务器。第四个问题问什么后端,如果你是MySQL就选MySQL,MariaDB就选MariaDB。接下来第五个问题问邮件域名,比如如果你想为ixnet.work搭建一个邮件服务器,用[email protected]这样的地址接收/发送邮件的话,直接填ixnet.work即可。第六个问题,你需要设置一个管理员密码,这个很重要因为管理面板也需要这个密码登录。然后可选部件保留默认(安装iRedAdmin和fail2ban)。确认一下信息输入y回车就可以开始安装。
  • 等待脚本跑完,脚本执行完毕之后就已经初步安装/配置好了该套件,但是还有一些别的东西需要手动弄。
  • 把上面第(1)点创建的那个MySQL账户删掉,因为已经用不上了。每个会用到数据库的套件都有各自独立的账户和密码,脚本自动帮你创建了。

步骤二:启动iRedAPD

service iredapd start
systemctl enable /opt/iredapd/rc_scripts/iredapd.service

你可以使用lsof -i:7777检查iredapd是否已经启动,如果已经启动python进程会监听7777端口。

步骤三:配置网页服务器使其加载iRedAdmin

  • 创建一个vhost,假定我这里设置的域名为iredadmin.example.com(下面的自行替换),选择默认的根目录位置(/home/wwwroot/iredadmin.example.com)。
lnmp vhost add
  • 创建一个软链接。
rm -r /home/wwwroot/iredadmin.example.com
ln -s /opt/www/iredadmin /home/wwwroot/iredadmin.example.com
  • 检查Apache是否安装了mod_wsgi,如果提示文件不存在请编译安装一个。
# 检查是否安装了mod_wsgi
ls /usr/local/apache/modules/mod_wsgi.so
# 编译安装mod_wsgi
wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.19.tar.gz
tar xvzf 4.5.19.tar.gz
cd mod_wsgi-4.5.19
./configure --with-apxs=/usr/local/apache/bin/apxs --with-python=$(which python)
make
make install
  • 编辑/usr/local/apache/conf/vhost/iredadmin.example.com.conf,LANMP参考下面的配置,LAMP应该也是类似的修改(注意中文的注释)。
# 在VirtualHost之前增加下面的两行
LoadModule wsgi_module modules/mod_wsgi.so
WSGISocketPrefix /var/run/wsgi

<VirtualHost *:88>
ServerAdmin [email protected]
php_admin_value open_basedir "/home/wwwroot/iredadmin.example.com:/tmp/:/var/tmp/:/proc/"
DocumentRoot "/home/wwwroot/iredadmin.example.com"
ServerName iredadmin.example.com
ErrorLog "/home/wwwlogs/iredadmin.example.com-error_log"
CustomLog "/home/wwwlogs/iredadmin.example.com-access_log" combined

# 在VirtualHost里面增加下面的四行
WSGIDaemonProcess iredadmin user=iredadmin threads=15
WSGIProcessGroup iredadmin
WSGIScriptAlias / /home/wwwroot/iredadmin.example.com/iredadmin.py/
AddType text/html .py

<Directory "/home/wwwroot/iredadmin.example.com">
    SetOutputFilter DEFLATE
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all'
# 注释掉这一行
#    DirectoryIndex index.html index.php
</Directory>
</VirtualHost>
  • 重启Apache,修改域名的DNS记录(iredadmin.example.com)使其指向服务器。当你访问访问这个域名,你应该可以看到iRedAdmin的登录界面。
lnmp httpd restart

步骤四:安装RoundCube Webmail

  • 编辑/etc/postfix/master.cf,检查submission开头那一行是否有注释,如果有,去掉,然后重启postfix服务。
  • 编辑/etc/dovecot/conf.d/10-master.conf,检查service auth代码块内是否有没注释的unix_listener /var/spool/postfix/private/dovecot-auth代码块,如果没有,按照下面的示范加上,然后重启dovecot服务。
service auth {
...
  unix_listener /var/spool/postfix/private/dovecot-auth {
    mode = 0666
  }
...
}
  • 检查并确认以下服务正在运行:clamav-daemonamavisdovecotpostfix
  • 创建一个新的vhost,我用lnmp创建指令为lnmp vhost add。假设你的域名为roundcubemail.example.com
  • Roundcube Webmail的Github发布页面下载最新版本(Complete版本的tar包)。以下代码为示范。
cd /home/wwwroot
wget https://github.com/roundcube/roundcubemail/releases/download/1.3.2/roundcubemail-1.3.2-complete.tar.gz
tar xvzf roundcubemail-1.3.2-complete.tar.gz
rm -rf roundcubemail.example.com
mv roundcubemail-1.3.2-complete.tar.gz roundcubemail.example.com
chown www:www -R roundcubemail.example.com
  • 按照这个文件的指示,创建数据库(与对应受限用户)并导入SQL。
  • 打开http://roundcubemail.example.com/installer,按照指示进行配置。你可以参考我的配置(大图预警)。插件随意,选几个喜欢的就好。
  • 保存配置,进入下一步,自行测试一下安装是否成功。除了Test filetype detection那一块不是必须要装filetype插件以外,别的都应该是OK
  • 清理安装目录
cd /home/wwwroot/roundcubemail.example.com
rm -rf installer
vim config/config.inc.php #在任意地方加上 $config['enable_installer'] = false;

步骤五:配置SPF

  • 你可以为你发信域名(步骤一中假设为ixnet.work)添加一条TXT记录,记录内容为下面任意一行均可(仅做参考)
# 假如你服务器IP为100.0.0.1,下面这一条表示拒绝所有除了IP为100.0.0.1发的邮件
v=spf1 ip4:100.0.0.1/32 -all
# IPv6的话就像这样
v=spf1 ip6:1080::8:800:200C:417A/128 -all
# 如果你想让SPF追随mx记录(就是仅允许mx记录对应的IP),你可以用
v=spf1 mx -all
# 你甚至可以把上面几条合并,意思就是前三个条件都不符合的话就退信
v=spf1 mx ip4:100.0.0.1/32 ip6:1080::8:800:200C:417A/128 -all
  • 更多的配置与解释可以参考Renfei Song’s Blog(链接见页尾)

步骤六:配置DKIM

  • 首先执行一下amavisd showkeys(部分发行版,比如Ubuntu 16.04,需要执行amavisd-new showkeys),你会看到这种东西(步骤一中假设为ixnet.work):
# amavisd-new showkeys
dkim._domainkey.ixnet.work.   3600 TXT (
  "v=DKIM1; p="
  "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYArsr2BKbdhv9efugByf7LhaK"
  "txFUt0ec5+1dWmcDv0WH0qZLFK711sibNN5LutvnaiuH+w3Kr8Ylbw8gq2j0UBok"
  "FcMycUvOBd7nsYn/TUrOua3Nns+qKSJBy88IWSh2zHaGbjRYujyWSTjlPELJ0H+5"
  "EV711qseo/omquskkwIDAQAB")
  • 然后你应该创建一个TXT记录,主机名称为dkim._domainkey,内容为上面那个括号里面、引号里面的内容。因为程序分成几行输出了,你需要手动合并一下,就像这样:
v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYArsr2BKbdhv9efugByf7LhaKtxFUt0ec5+1dWmc...
  • TXT记录添加完成后,等两分钟等DNS刷新,然后执行amavisd testkeys来测试是否正确添加。如果正确添加的话,你会看到如下信息:
# amavisd-new testkeys
TESTING#1 ixnet.work: dkim._domainkey.ixnet.work => pass

步骤七:配置DMARC

  • DMARC是用来告诉收件人如果SPF/DKIM不符应该怎么做的。一般来说政策用none即可(不处理/遵循收件人本身的反垃圾邮件政策)。你可以添加一条TXT记录,主机名称为_dmarc,内容为v=DMARC1; p=none
  • 别的政策/更多的配置可以参考谷歌的文档(链接见页尾)

接下来的步骤包括配置SMTP/IMAP等以后有空继续更新

参考来源

发表评论