Ubuntu安装iRedMail开源邮件服务器套件
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-daemon
、amavis
、dovecot
、postfix
。 - 创建一个新的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等以后有空继续更新
参考来源
- iRedMail官方文档:http://www.iredmail.org/docs/
- Mod_WSGI官方文档:http://modwsgi.readthedocs.io/en/develop/user-guides/quick-installation-guide.html
- 《SPF 记录:原理、语法及配置方法简介》:https://www.renfei.org/blog/introduction-to-spf.html
- 《添加 DMARC 记录》:https://support.google.com/a/answer/2466563?hl=zh-Hans