废话
去年,曾经在自己房间里的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背后的哲学是基于几条重要性递减的原则的:
- 一个适当/合适的邮件服务器只运行免费软件
- 一个适当/合适的邮件服务器应容易设置和维护
- 一个适当/合适的邮件服务器提供合适的安全性
- 一个适当/合适的邮件服务器应该有简单美观的UI
哈,有点意思.
首先,Mailu是开放且免费的.
Mailu运行在Docker之中,而且使用了多个Docker容器,通过一个虚拟的内网来通信,对于一个VPS来说,很好的解决了一个多用途VPS管理维护的问题,某种意义上也解决了部分安全问题.
如图,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.[安装生成工具]
由于点点鼠标要啥有啥,具体需求因人而异并且未来应该会有变化,所以不会上截图, 而且至于你要敲什么命令, mailu会因人而异的自动生成你要敲的命令,安装文档,手把手告诉你该做什么.太贴心了,我不啰嗦了.
存储卷就默认的/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发邮件限制解除看这里
Comments
mailu:
登陆次数过多被误封的BUG其实不是mailu的锅,是rainloop的锅。Rainloop没有做反暴力破解的功能。登陆rainloop帐号失败,相关请求在nginx的log文件里也是http 200。你没有特殊规律,fail2ban的正则表达式很难写,不知道哪个IP地址的访问记录与登陆失败有关。Rainloop有个改良版叫snappymail,snappymail解决了这个问题。snappymail既可以把登陆失败的信息写入到指定的文件里,又可以把失败信息写入syslog里。
Reply