Maddy打造个人邮箱服务 – 阅心笔记
Maddy Mail Server是一个GO语言开发的ALL-IN-ONE邮件系统,实现了Mail Transfer agent (MTA), Mail Delivery Agent (MDA), Mail Submission Agent (MSA), IMAP server等,说人话就是可以替换Postfix、Dovecot、Opendkim、OpenSPF、OpenDmarc等传统软件,主要功能是通过SMTP发送和接收邮件,通过IMAP实现客户端访问,也支持DKIM、SPF、DMARC、DANE、MTA-STS等邮件相关的安全和反垃圾协议。对比配置传统软件,即使是像MailCow、Mail-in-a-Box等基于docker的现成方案,安装、配置也足够简单、开箱即用,可以说是懒人必备。
需要准备以下:
2.1 下载和安装
从github下载最新版:
wget https://github.com/foxcpp/maddy/releases/download/v0.5.2/maddy-0.5.2-x86_64-linux-musl.tar.zst
zst后缀需要安装zstd进行解压:
yum install zstd -y tar -I zstd -xvf maddy-0.5.2-x86_64-linux-musl.tar.zst
解压之后的目录有5个文件,安装Maddy:
mv maddy maddyctl /usr/local/bin/ mkdir /etc/maddy && mv maddy.conf /etc/maddy/ mv systemd/*.service /usr/lib/systemd/system/ mv man/*.1 /usr/share/man/man1/ && mv man/*.5 /usr/share/man/man5/
2.2 配置maddy mail server
2.2.1 添加用户
官方不建议root权限运行,先添加一个不可登录的普通用户:
useradd -mrU -s /sbin/nologin -c "maddy mail server" maddy
添加完用户,设置一下相关的目录及文件的权限:
chown -R maddy:maddy /usr/local/bin/maddy* /etc/maddy
2.2.2 更改配置文件
默认配置文件在/etc/maddy/maddy.conf,里面已经有一个开箱即用的配置,只需修改几个参数即可使用。
$(hostname) = mx1.nixops.me mx2.nixops.me $(primary_domain) = nixops.me $(local_domains) = $(primary_domain) other.domain.com tls file /etc/maddy/certs/$(hostname)/fullchain.pem /etc/maddy/certs/$(hostname)/privkey.pem state_dir /etc/maddy/state runtime_dir /etc/maddy/runtime log syslog /var/log/maddy.log
按需修改以上内容即可,如果创建的普通用户未指定home目录,配置文件中的state_dir、runtime_dir需先创建目录并给权限。
2.2.3 申请ssl证书
SMTPs和IMAPs服务需要TLS 证书,建议使用Let's Encrypt 的泛域名证书,具体申请方法就不介绍了。
证书需放入/etc/maddy/certs/$(hostname)中,在配置文件中指定时,需先写公钥(.crt),在写私钥(.key)
证书需设置一下权限:
sudo setfacl -R -m u:maddy:rX /etc/maddy/certs/
2.2.4 创建用户
maddy使用虚拟用户,所以不像postfix和dovecot一样需要创建系统用户。maddy需要创建登录账户和IMAP的本地存储账户,登录账户是SMTP和IMAP登录时的验证信息:
maddyctl creds create [email protected]
创建本地储存账户:
maddyctl imap-acct create [email protected]
查看是否创建成功:
maddyctl creds list maddyctl imap-acct list
2.3 启动服务
以上全部做好后,即可启动服务:
systemctl daemon-reload systemctl start maddy
正常启动后,会开放以下端口:
- 25 SMTP Transfer->Exchange ClearText
- 465 SMTPs User->Submission TLS
- 587 ESMTP User->Submission ClearText/STARTTLS
- 143 IMAP Delivery->User ClearText
- 993 IMAPs Delivery->User TLS
防火墙放行:
firewall-cmd --permanent --add-port={25/tcp,465/tcp,587/tcp,143/tcp,993/tcp} firewall-cmd --reload
从外网telnet验证一下服务器公网IP是否开放以上端口。尤其需注意25端口是否能够访问
服务器端就配置好了,可以用手机或outlook等客户端进行连接测试。接下来为了收发邮件,还需配置域名解析才行。
无论邮箱系统用的什么软件,都绕不开邮件相关的域名解析,只要搞邮件就需配置以下域名解析:
- MX记录 :域名系统基础记录,指向邮件服务器
- PTR记录 :即IP反解析,根据IP反查域名,需供应商来做
- SPF记录 :指定哪些服务器可以使用你的域名发送邮件
- DKIM记录 :防止发送的电子邮件内容篡改
- DMARC记录 :当SPF和DKIM验证失败时,指定接收方的处理策略并向指定邮箱报告
3.1 MX记录
收发邮件时,mx记录指定了自己的邮件服务器地址,可以设置优先级,建议2条以上mx记录
域名 类型 值 优先级 nixops.me mx mx1.nixops.me 10 nixops.me mx mx2.nixops.me 20
设置对应MX子域名的记录:
mx1.nixops.me A 1.1.1.1 mx2.nixops.me A 2.2.2.2
设置好后使用dig命令验证一下:
dig mx nixops.me @1.1.1.1 dig a mx1.nixops.me @1.1.1.1 dig a mx2.nixops.me @1.1.1.1
3.2 PTR记录
将域名映射到 IP 地址是正向解析,从 IP 地址到域名的映射就是反向解析,在公网上,反向解析无法由 DNS 提供,因为IP地址的管理权限属于运营商,所以需要向运营商申请添加反向解析,运营商通过 PTR(Pointer Record)记录将 IP 地址指向域名。邮件服务器IP不做PTR记录,发送邮件后会有很大概率被当成垃圾邮件。
联系供应商加好后,可以用dig命令验证:
dig -x 1.1.1.1
3.3 SPF记录
SPF全名是发件人策略框架,主要作用是将发信的邮件服务器和发信域名进行绑定,防止伪造发件人。在SPF记录中使用TXT记录指定允许发信的服务器,当对方收到邮件后,系统会验证发信域名并读取SPF记录中的IP,验证是否一致后采取进一步动作。
以谷歌SPF记录为例:
# dig txt gmail.com gmail.com. 300 IN TXT "v=spf1 redirect=_spf.google.com" # dig txt _spf.google.com _spf.google.com. 300 IN TXT "v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all" # dig txt _netblocks.google.com _netblocks.google.com. 300 IN TXT "v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"
SPF记录以v=spf1开头,以all结尾,中间可以使用 ip4/ip6/a/mx/include/redirect等关键字进行ip范围指定。SPF 记录的匹配机制会结合限定词来告诉服务器匹配记录时的动作。常见的限定词有:
- + 放行,如果没有明确指定限定词,则为默认值。
- - 硬拒绝,直接拒绝来自未经授权主机的邮件。
- ~ 软拒绝,邮件可被接受,也可被标记为垃圾邮件。
- ? 中性,不考虑邮件是否被接受。
个人邮件设置允许 mx记录中的服务器发信即可,最终设置SPF记录为:
nixopx.me txt "v=spf1 mx -all"
3.4 DKIM记录
DKIM记录主要作用也是防止邮件被恶意篡改,保证邮件内容的完整性,使用的方式是与SSL类似,服务器产生一个公私钥对,私钥为每一封外发的邮件签名并在邮件头中插入DKIM签名(DKIM-Signature头),公钥则保存在域名的记录中,邮件接收方接收邮件时,通过DNS查询获得公钥,并使用公钥解密邮件签名, 从而验证邮件有效性和完整性。
Maddy第一次启动后已经自动生成DKIM私钥和需添加的dns记录,位置在state dir(/etc/maddy/state)下的/dkim_keys/_default.dns中,添加txt记录:
default._domainkey.nixops.me txt "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0...省略..."
3.5 DMARC记录
DMARC基于现有的SPF和DKIM协议,并声明对验证失败邮件的处理策略。邮件接收方接收邮件时,首先通过DNS获取DMARC记录,再对邮件来源进行SPF验证和DKIM验证,对验证失败的邮件根据DMARC记录进行处理,并将处理结果反馈给发送方。
添加DMARC记录:
_dmarc.nixops.me txt "v=DMARC1; p=quarantine; ruf=mailto:[email protected]"
p:reject 拒绝该邮件;none为不作处理;quarantine 标记为垃圾邮件。
ruf:检测到伪造邮件,接收方报告的邮箱地址
3.6 MTA-STS 和TLS 报告
MTA-STS是MTA 严格传输安全协议,作用是确保发送给我们的电子邮件通过 TLS 安全地传输,防止中间人攻击。启用MTA-STS后,发送方邮件服务器只有在满足以下条件时,才会向我们发送邮件:
- 使用有效的证书通过身份验证
- 使用 TLS 1.2 或更高版本进行加密
当然如果发送方不支持MTA-STS,仍然可以发送邮件(可能会有中间人攻击),主要是为了兼容。
启用MTA-STS所需条件:
- 创建策略文件,并提供HTTPS方式访问
- 通过DNS 设置txt记录,告诉其它邮件服务商支持MTA-STS
3.6.1 创建策略文件
策略文件mta-sts.txt的内容为:
version: STSv1 mode: enforce mx: mx1.nixops.me mx: mx2.nixops.me max_age: 86400
创建子域名并启用https,最终的访问路径为:
https://mta-sts.nixops.me/.well-known/mta-sts.txt
3.6.2 配置MTA-STS的TXT记录
_mta-sts.nixops.me TXT “v=STSv1; id=20211031T010101;"
一般id为时间戳
3.6.3 启用TLS 报告
和DMARC记录类似,启用TLS报告可以接受外部邮件服务器会发送以下内容:检测到的 MTA-STS 政策、流量统计信息、失败的连接以及无法发送的邮件等详细信息。
添加以下txt记录:
_smtp._tls.nixops.me TXT "v=TLSRPTv1;rua=mailto:[email protected]"
3.7 DNSSEC、DANE及CAA
启用了MTA-STS后,DANE可以确保TLS证书是有效的,实际上是通过DNS的方式扮演了CA的角色。 DANE通过TLSA 记录,来声明某个证书的是可信的,由于 DANE 是基于 DNS 协议,可能会有被挟持的可能,因此需要启用 DNSSEC 来保障传输过程中不被修改。
- 启用DNSSEC需域名注册商及dns服务商都支持,在DNS服务商处选择开启DNSSEC,然后将提供的DS记录填写到域名注册商即可
- 使用 TLSA证书生成工具 及PEM格式的TLS证书生成TLSA记录
- 使用CAA Record Helper生成的CAA记录
为了保障TLS证书安全:
- DNSSEC保障DNS记录传输过程中的安全
- DANE在客户端侧阻止不当签发的证书
- CAA指定域名允许哪个证书颁发机构为其颁发证书
此步为加强安全性,有能力推荐启用配置
邮箱服务不只是系统配置烦琐、反垃圾、安全相关、及域名解析等的都很麻烦,如果使用传统的软件,其实不是很适合新手。虽然有一些基于docker或者脚本的现成方案,但真部署和调试起来也不容易。对比传统软件Maddy mail server 安装和配置都足够简单,满足一个现代安全邮箱所需的功能,也有一定的扩展性,虽然比较新还不够成熟,但对个人友好,适合懒人党对可靠性要求不高的情况。
参考链接及有用的工具: