#> RESTKHZ _

休止千鹤 | 我依旧是一名平凡的学生

Docker搭建邮件系统(mailu)

  休止千鹤  |    01/01/2021

废话

去年,曾经在自己房间里的Gen10服务器上搭建过一个 邮件系统 . 在Proxmox中的一个容器上使用了EwoMail. 然而身处异乡又频频搬家,最后因为生活中各种毛刺琐事,那个CT便再也没有闲心启动过了.
当时我选择使用EwoMail是因为它在国内还比较活跃,相关资料也很齐全.简要说明一下当时搭建过程:

  • 使用了CentOS的CT模板
  • 利用FRP转发端口到AWS的VPS上
  • 设置SPF和DKIM等等

当时用了一阵子,也还可以(就是能用),但是这样子缺点也很明显:

  • 在2020年centOS的变质,已经不再可靠.
  • 由于网络环境,和内网转发这两个情况,使得这个本对服务可靠性要求极高的服务变得不稳定.
  • 动态IP和民用宽带导致对于PTR和SPF设置成为了一大问题.尽管当时已经在mail-tester的spam测试中高分通过并且并没有邮箱会Block我的邮件.
  • EwoMail在日后的维护上还是有点繁琐.(独占一个CentOS)尽管已经用CT单独创建了.

以上这些原因还是让我最终放弃了这个方案.

选择:寻找新方案

我决定在AWS上直接搭建邮件服务了,那么又有问题了:

  • 服务器已经在跑别的服务了,很多国内开源邮箱的安装对于原来的服务是一场灾难.无视你之前安装的服务强行覆盖,并且日后维护的环境混乱是致命的. 干净的CentOS? 我哪有钱再开一个?
  • 至于EwoMail必须需要一个CentOS,显然我不会选择CentOS.
  • AWS默认不开放SMTP出站(最后写了解决)

看了看各种开源邮件系统,最终 Mailu成为了我的选择.

介绍: Mailu的哲学

看到首页,文档式的页面赫然写着一行General Concepts: Philosophy.

Mailu背后的哲学是基于几条重要性递减的原则的:

  1. 一个适当/合适的邮件服务器只运行免费软件
  2. 一个适当/合适的邮件服务器应容易设置和维护
  3. 一个适当/合适的邮件服务器提供合适的安全性
  4. 一个适当/合适的邮件服务器应该有简单美观的UI

哈,有点意思.

首先,Mailu是开放且免费的.

Mailu运行在Docker之中,而且使用了多个Docker容器,通过一个虚拟的内网来通信,对于一个VPS来说,很好的解决了一个多用途VPS管理维护的问题,某种意义上也解决了部分安全问题.

Mailu

如图,portainer容器管理能看出来mailu是怎样的架构.

另外,和别的很多邮件系统一样,使用Roundcube或者Rainloop作为web email client. 有着美观的UI. 管理台基于Flask,维护配置也很简单.而且安装过程几乎只需要点一点,复制粘贴一下就行.非常的友好.

安装

环境和准备

吹了一波了,开始动手吧.首先就是啃文档,准备环境和选择Mailu版本.在写本文时,Mailu的1.7是最新的稳定版,那么就选择Mailu1.7了.

至于环境,不像EwoMail,Mailu理论上可以在任何支持docker的机器上运行.

  • Mailu官方更推荐使用Debian,因为他们的测试几乎都是在Deb上完成的.
  • DockerAPI版本大于等于1.11.
  • 而如果用docker-compose安装,那么(目前)需要compose版本为2.2
  • 2GRAM,1G空闲,虽然我512M机器跑起来了.

硬件环境官方认为至少需要2GRAM机器并且确保1G是空闲的,出于稳定性考量,是应该这么做.但是很有趣的是,我vps机器只有512M的RAM, 居然跑了起来. 现在占用内存大概300M出头.SWAP几乎满载.因为在安装的时候数据库选择使用了sqlite.(个人邮件和机器邮件通知应该不会需要那么好的数据库性能)当然你也有诸如Mysql的选择,整个安装过程是一键自动的,你也不需要操心配置.

2021/2/8补充: 512M内存有宕机可能. 任何暴露在互联网上的固定端口服务时时刻刻都在遭受攻击,我的SMTP服务一直在经受洪水般的暴力破解. 在二月八日因为SMTP不堪重负服务挂了一会. 大量swap硬盘操作导致CPU一直空闲. 出于稳定性考虑, 非常不建议使用512M的机器, 建议更换大一些的内存的机器. 我相信1G内存对于sqlite的mailu应该是足够. 准备增加RAM. 2021/6/6: 1G内存的VPS已经稳定跑sqlite数据库的mailu几个月了, 依旧反应迅速. 之前512M用了几个月后两三个星期挂一次…

施工中

Mailu的安装很有意思,在线生成docker-compose.[安装生成工具]

config-gene

由于点点鼠标要啥有啥,具体需求因人而异并且未来应该会有变化,所以不会上截图, 而且至于你要敲什么命令, mailu会因人而异的自动生成你要敲的命令,安装文档,手把手告诉你该做什么.太贴心了,我不啰嗦了.

config

存储卷就默认的/mailu就行,TLS除非有别的方案,letsencrypt,挺好的.Mailu会自动更新自己的SSL证书完全不需要自己操心(更新:目前Letsencrypt证书在个别邮箱客户端因为SSL pin问题后需要在邮箱客户端手动禁用SSL pin安全功能.因为Letsencrypt证书三个月过期后更新的证书显然和SSL pin的证书不一致导致客户端认为受到中间人攻击自动放弃连接.不过也就是第一次配置点一点的问题,不麻烦.)

至于邮件客户端,可以选一下,提供rainloop和roundcube.都挺好看.我用的rainloop, 没啥问题.

反病毒因为机器性能不行,没开.webdav,fetchmail随意.

至于IPv4 listen address按需要改一改,虽然不推荐0.0.0.0但是我设置的是0.0.0.0

至于数据库,为了压缩内存消耗,我选择了最轻量的sqlite.嗯,和这个博客系统一样.

一些都设置好了,点击生成后会跳转链接,根据你刚才的选择配置,你跟着它一行一行把命令复制粘贴进终端,不会出错.

跟着自动生成的安装文档,到此为止,你的邮件系统应该就搭建好了.

防止暴力破解的验证次数限制不宜设置过低,这里有坑:Rainloop每次操作都存在验证,防止暴力破解的block工具并没有在意你有没有通过验证. 也就是说,尽管你每次验证都是通过的,短时间Rainloop频繁操作依旧会把自己Block掉.然后在Rainloop中只会提示摸不到头脑的“authentication failed”然而任何第三方客户端并不会受到影响.

哦对了,希望你DNS的MX也设置好了.如果设置好了,此时进入后台配置一下,去/webmail里接收邮件应该没有任何问题.

我真没觉得这块还有啥好说的

剩下就是SPF,PTR这些设置.另外DKIM,DMARC设置也都是后台自动生成的,只需要你自己复制粘贴填写进域名txt字段就好.非常简单. 如果不知道咋整, 请结合别人文章或者你DNS服务商的帮助文档. 一搜一大把, 不提.

结束以后可以去mail-tester测试一下你的邮件分数, 如上配置几乎满分, 不用担心你的邮件被投入垃圾箱.

最后

如果你是在lightsail搭建的,那么你的所有smtp通信都是被屏蔽的.你需要提交一份工单.现在可以看下一篇文章.
刚刚已经设置好了SPF,PTR,DKIM,DMARC,只需要和lightsail工作人员详细说明你已经进行了足够安全的设置避免spam,就可以unblock.

至于AWS中lightsail服务器smtp发邮件限制解除看这里


Views:

 Comments


mailu:

登陆次数过多被误封的BUG其实不是mailu的锅,是rainloop的锅。Rainloop没有做反暴力破解的功能。登陆rainloop帐号失败,相关请求在nginx的log文件里也是http 200。你没有特殊规律,fail2ban的正则表达式很难写,不知道哪个IP地址的访问记录与登陆失败有关。Rainloop有个改良版叫snappymail,snappymail解决了这个问题。snappymail既可以把登陆失败的信息写入到指定的文件里,又可以把失败信息写入syslog里。

 Reply